圆滑角色同步移动
角色移动每1/10秒发送的情况,移动会有些迟钝,本讲进行圆滑处理. 通过ProudNet提供的PositionFollower和 AngleFollower类可进行圆滑处理. 本章只对使用PositionFollower类进行讲述.
对PositionFollower的详细说明请参考角色位置同步. 想要对位置更圆滑和精确处理的话,在客户端中发送"位置信息"时,需同时发送位置信息和速度. 对此计算"角色"的速度. public class PlayControl : MonoBehaviour { public Vector3 velocity = new Vector3(0, 0, 0); void Update() { // set velocity for sending message velocity = rot * forwardSpeed * 0.3f; ... |
修改接收信息部分的代码,接收部分不进行直接修改角色的位置, PositionFollower中添加位置信息. m_stub.Player_Move = (Nettention.Proud.HostID remote, Nettention.Proud.RmiContext rmiContext, float x, float y, float z, float vx, float vy, float vz, float angle) => { var g = GameObject.Find("RemotePlayer/" + remote.ToString()); if (g != null) { var control = g.GetComponent<RemoteControl>(); var p = new Nettention.Proud.Vector3(); p.x = x; p.y = y; p.z = z; var v = new Nettention.Proud.Vector3(); v.x = vx; v.y = vy; v.z = vz; control.m_positionFollower.SetTarget(p, v); |
为进行运作,在RemotePlayer Prefab中添加RemoteControl.cs脚本文件. 然后,PositionFollower对象以成员变数添加. public class RemoteControl : MonoBehaviour { public PositionFollower m_positionFollower = new PositionFollower(); |
PositionFollower对象中输入的 "对方角色的位置和速度" 获取校正后的位置信息. 然后更新至实际位置,如以下代码. class RemoteControl { void Update () { m_positionFollower.FrameMove(Time.deltaTime);
var p = new Nettention.Proud.Vector3(); var v = new Nettention.Proud.Vector3(); m_positionFollower.GetFollower(ref p, ref v);
transform.position = new UnityEngine.Vector3((float)p.x, (float)p.y, (float)p.z); } |
现在,开启两个以上的客户端, 确认移动是否圆滑.
如果想获取更佳效果的话,可以添加Follower的多个其它成员变数.然后,通过NetClient.GetRecentPing函数获取对方的延迟结果.根据延迟结果,对进入PositionFollower对象的位置和速度进一步深入. 赛车游戏中可进行更准确的位置同步化.
|