Unity3d 插值同步

文中大體的思路:

  1. A玩家 移動時,本機自行移動,并發送移動指令給服務端,假設移動是成功的,服務端同步其他客戶端 B玩家,B玩家 中用一個隊列?Queue?來裝服務端來的移動指令,然后客戶端在updata中做插值 (lerp?) 處理,這樣 A玩家 在 B玩家客戶端中移動起來就比較平滑

  2. 如果 A玩家 移動很頻繁,B玩家 中的 指令隊列?Queue?會堆積的很大,這里可以做個優化,就是當?Queue?的?size?超過某個臨界值 (threshold)時,加快插值(lerp)的速率

  3. A玩家 移動時,本機自行移動 并保留一份此次移動的 副本 (copy)到一個?隊列?中,并發送移動指令給服務端,如果服務端判定移動是失敗的(比如穿墻之類的),則服務端下發指令給 A玩家 修復此次移動的位置,然后?隊列?中移除此次移動的副本

  4. 關于攻擊時的同步,客戶端A 中自行播放攻擊動作并上行給服務的此次攻擊的指令,服務端同步其他 客戶端B 播放攻擊動作,同時同步給所有客戶端(客戶端A和B)扣血指令,為防止客戶端作弊必須有服務端運行計算實際扣血量。


下面是部分關于位置同步的代碼

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using System.Collections.Generic;/// <summary>
/// 可以通過
/// 1. 減少發包率(意思就是 增大 sendInterval 發包間隔)
/// 2. 增大 closeEnough 距離
/// 3. 增大 normalLerpRate、fasterLerpRate 插值速率
/// </summary>[NetworkSettings(channel = 0, sendInterval = 0.1f)]
public class SmoothMove : NetworkBehaviour
{[SyncVar(hook = "SyncPostionsValues")]private Vector3 syncPos; //同步變量[SerializeField]Transform myTransform; //SerializeField用于inspector中顯示非public變量private float lerpRate;private float normalLerpRate = 16.0f;private float fasterLerpRate = 27.0f;private Vector3 lastPos;private float threshold = 0.5f;private List<Vector3> syncPosList = new List<Vector3>();[SerializeField]private bool useHistoriicalLerping = false; //是否啟用平滑插值的開關,直接在 inspector 中設置private float closeEnough = 0.11f;public void Start(){lerpRate = normalLerpRate;}public void Update(){LerpPosition(); //因為方法利用了Time.deltaTime,所以只能在 Updata中調用}public void FixedUpdate() //1. server 和 client 都執行FixedUpdate{TransmitPosition(); //2. 因為是 ClientCallback,所以只有客戶端調用}void LerpPosition(){if (!isLocalPlayer) //5. 只有非本機玩家才進行插值移動到最新的 syncPos 位置{if (useHistoriicalLerping) //更加平滑{HistoryLerping();}else{OrdinaryLerping();}}}[Command]void CmdProvidePositionToServer(Vector3 pos){syncPos = pos; //4. 服務端收到信息同步給所有客戶端的該對象的syncPos變量}[Client]void TransmitPosition(){if (isLocalPlayer && Vector3.Distance(myTransform.position, lastPos) > threshold) //3. 只用本機玩家才提交位置信息到server上{CmdProvidePositionToServer(myTransform.position);}}[Client]public void SyncPostionsValues(Vector3 lastPos){syncPos = lastPos;syncPosList.Add(syncPos); //將所有服務端同步過來的 pos 全都保存在隊列中}void OrdinaryLerping() //普通插值,有卡頓現象{myTransform.position = Vector3.Lerp(myTransform.position, syncPos, Time.deltaTime * lerpRate);}void HistoryLerping() //平滑插值{if (syncPosList.Count > 0){//取出隊列中的第一個設為插值的目標myTransform.position = Vector3.Lerp(myTransform.position, syncPosList[0], Time.deltaTime * lerpRate);//位置足夠接近,從隊列中移除第一個,緊接著就是第二個if (Vector3.Distance(myTransform.position, syncPosList[0]) < closeEnough){syncPosList.RemoveAt(0);}//如果同步隊列過大,加快插值速率,使其更快到達目標點if (syncPosList.Count > 10){lerpRate = fasterLerpRate;}else{lerpRate = normalLerpRate;}Debug.LogFormat("--- syncPosList, count:{0}", syncPosList.Count);}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387502.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387502.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387502.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

laravel數據庫相關操作說明

輸出原生sql: DB::table(users)->where([[name,,張三]])->toSql(); //輸出sql為&#xff1a;select * from users where name?; DB::table(users)->where([[name,,張三]])->getQuery(); //輸出sql為&#xff1a;select * from users where name張三; 運行原生sql查…

1 數據挖掘基礎

1.1 什么是數據挖掘 從大量數據中挖掘出隱含的、未知的、對決策有潛在價值的關系、模式和趨勢&#xff0c;并用這些知識和規則建立用于決策支持的模型&#xff0c;提供預測性決策支持的方法、工具和過程&#xff0c;這就是數據挖掘。 是統計學、數據庫技術、人工智能技術的結…

R文件報錯的原因

一般R文件報錯&#xff0c;無非是資源文件錯誤&#xff0c;圖片命名錯誤&#xff0c;但是編譯都會報錯&#xff0c;可以很快解決。但是前幾天&#xff0c;引入一個第三方aar包后&#xff0c;項目編譯正確&#xff0c;但是就是R文件報錯&#xff0c;找不到R文件&#xff0c;整個…

1.0 算法本機調試方法

算法的本機調試方法&#xff1a; 從本地文件中讀取測試數據&#xff0c;進行算法調試。 例&#xff1a;讀取兩個數&#xff0c;輸出和。 1 2 11 22 111 222 輸出&#xff1a; 3 33 333 #include <fstream> //讀取本地文件需要此頭文件。調試完成后&#xff0c;提…

[轉]Excel數據轉化為sql腳本

在實際項目開發中&#xff0c;有時會遇到客戶讓我們把大量Excel數據導入數據庫的情況。這時我們就可以通過將Excel數據轉化為sql腳本來批量導入數據庫。 1 在數據前插入一列單元格&#xff0c;用來拼寫sql語句。 具體寫法&#xff1a;"insert into t_student (id,name,age…

void Update ( ) 更新 void FixedUpdate ( )

void Update ( ) 更新 void FixedUpdate ( ) 固定更新 相同點&#xff1a;當MonoBehaviour啟用時&#xff0c;其在每一幀被調用&#xff0c;都是用來更新的。 異同點&#xff1a;第一點不同&#xff1a; Update()每一幀的時間不固定&#xff0c;即第一幀與第二幀的時間間隔t…

海量數據庫的查詢優化及分頁算法方案(一)

隨著“金盾工程”建設的逐步深入和公安信息化的高速發展&#xff0c;公安計算機應用系統被廣泛應用在各警種、各部門。與此同時&#xff0c;應用系統體系的核心、系統數據的存放地――數據庫也隨著實際應用而急劇膨脹&#xff0c;一些大規模的系統&#xff0c;如人口系統的數據…

【點分治】luoguP2664 樹上游戲

應該是一道中等難度的點分&#xff1f;麻煩在一些細節。 題目描述 lrb有一棵樹&#xff0c;樹的每個節點有個顏色。給一個長度為n的顏色序列&#xff0c;定義s(i,j) 為i 到j 的顏色數量。以及 現在他想讓你求出所有的sum[i] 輸入輸出格式 輸入格式&#xff1a; 第一行為一個整數…

EasyJoyStick使用以及兩種操作桿 EasyJoyStick的使用方法,簡單的不能再簡單 Hedgehog Team-》Easy Touch -》Add Easy Touch For C#

EasyJoyStick使用以及兩種操作桿EasyJoyStick的使用方法&#xff0c;簡單的不能再簡單Hedgehog Team-》Easy Touch -》Add Easy Touch For C#Hedgehog Team-》Easy Touch -》Extensions-》Adding A New Joystick配置如圖&#xff1a;然后看一下配置&#xff0c;我喜歡掌控性強一…

2.1 vector

表結構的數組實現隨機訪問快速尾插動態調整所占內存空間#include<vector>從0開始計數創建vector對象的三種方法&#xff1a; 1. vector<int> v;2. vector<int> v(10); //默認值為03. vecotr<double> v(10,8.6); //為每個元素指定初始值尾插&#xff1a…

文件系統管理 之 文件和目錄訪問權限設置

一、文件和目錄權限概述 在linux中的每一個文件或目錄都包含有訪問權限&#xff0c;這些訪問權限決定了誰能訪問和如何訪問這些文件和目錄。 通過設定權限可以從以下三種訪問方式限制訪問權限&#xff1a;只允許用戶自己訪問&#xff1b;允許一個預先指定的用戶組中的用戶訪問&…

Web滲透實驗:基于Weblogic的一系列漏洞

1. 攻擊機windows10 192.168.2.104 2. 靶機ip: 192.168.2.109(linux Ubantu) 192.168.2.111(windows2008R264位) 第一步&#xff1a;啟動靶機服務 分別為linux和windows windows環境搭建&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/16KyYb1v1rP9uJ6-5MBotVw   提取…

9 月 19 日,騰訊云安全中心監測到 ?Apache Tomcat 修復了2個嚴重級別的漏洞, 分別為: 信息泄露漏洞(CVE-2017-12616)、遠程代碼執行漏洞(CVE-2017-12615

9 月 19 日&#xff0c;騰訊云安全中心監測到 Apache Tomcat 修復了2個嚴重級別的漏洞&#xff0c; 分別為&#xff1a; 信息泄露漏洞&#xff08;CVE-2017-12616&#xff09;、遠程代碼執行漏洞&#xff08;CVE-2017-12615&#xff09;&#xff0c;在某些場景下&#xff0c;攻…

2.0 STL泛型編程

Standard Template Library 在命名空間std中定義了常用的數據結構和算法 三種類型的組件&#xff1a; 容器&#xff1a; ——vector、string ——set、multiset、map、multimap ——list ——bitset ——stack ——deque、queue、priority_queue 迭代器 算法&…

SQL聯合更新

update CCTDB..Area_Infoset ParentStrb.ParentStrfrom CCTDB..Area_Info a inner join TempArea bon a.AreaId b.AreaId轉載于:https://www.cnblogs.com/davidgu/archive/2012/08/10/2631289.html

集合之ArrayList(含JDK1.8源碼分析)

一、ArrayList的數據結構 ArrayList底層的數據結構就是數組&#xff0c;數組元素類型為Object類型&#xff0c;即可以存放所有類型數據。我們對ArrayList類的實例的所有的操作(增刪改查等)&#xff0c;其底層都是基于數組的。 定義底層數據結構&#xff1a;Object[] elementDat…

2.2 string

字符數組的封裝 基本操作與vector很像&#xff0c;它們內部采用的都是數組結構 #include<string> 創建string對象&#xff1a; string s; 給string對象賦值&#xff1a; 方式一&#xff1a;s"i love coding"; 方式二&#xff1a; char a[256]; scanf(&qu…

Unity3D 自動打包整個項目(以AssetBundle實現)

需求&#xff1a; 在移動開發中&#xff0c;手動控制資源的加載、釋放和熱更新&#xff0c;是很有必要的。 而Unity通過AssetBundle可以實現該需求&#xff0c;但是如果項目資源多起來的話一個個手動打包成AssetBundle則很麻煩。 而本文正為此提供一套一鍵打包的方案。 資源分…

Android復制assets目錄下的圖片到內存

轉自&#xff1a;http://www.chenwg.com/android/android%E5%A4%8D%E5%88%B6assets%E7%9B%AE%E5%BD%95%E4%B8%8B%E7%9A%84%E5%9B%BE%E7%89%87%E5%88%B0%E5%86%85%E5%AD%98.html 有些Android應用需要一些初始化數據&#xff0c;但是考慮到國內這種龜速網絡和高昂的網絡流量費用&…

Python 2.7 cython cythonize py 編譯成 pyd 談談那些坑(轉載)

轉自&#xff1a;https://www.cnblogs.com/ibingshan/p/10334471.html Python 2.7 cython cythonize py 編譯成 pyd 談談那些坑 前言 基于 python27 的 pyc 很容易被反編譯&#xff0c;于是想到了pyd&#xff0c;加速運行&#xff0c;安全保護 必要準備 安裝cython&#xff1a;…