您的位置:首页 > 移动开发 > Unity3D

Unity结合C++开发服务器实现多人游戏(九)

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