当前位置:   article > 正文

unity学习(69)——多人位置同步

unity学习(69)——多人位置同步

简单的很,每个客户端向服务器发送位置信息,服务器再把这些位置信息发送给其他客户端

1.客户端发送。

1.1在SocketModel脚本中添加一个新的类MoveDTO

  1. public class MoveDTO
  2. {
  3. public string Id{get; set;}
  4. public int Dir{get;set;}
  5. public Assets.Model.Vector4 Rotation{get;set;}
  6. public Assets.Model.Vector3 Point{get;set;}
  7. }

 一个新的PlayerStateConstans类

  1. public class PlayerStateConstans
  2. {
  3. public const int FORWARD=0;
  4. public const int BACK=1;
  5. public const int LEFT=2;
  6. public const int RIGHT=3;
  7. public const int IDLE=4;
  8. public const int ATTACK=5;
  9. public const int SKILL=6;
  10. public const int DIE=7;
  11. }

1.2在JoystickPlayerExample脚本中的FixedUpdate()中添加如下代码,不停的向服务器发包。

  1. MoveDTO dto = new MoveDTO();
  2. dto.Id = SelectMenu.nowPlayer.id;
  3. dto.Dir = PlayerStateConstans.IDLE;//玩家的状态,这个到时候去服务器翻一下--playerState结构体
  4. dto.Rotation = new Assets.Model.Vector4( model.transform.rotation);//转码啥的都只是时间问题
  5. dto.Point = new Assets.Model.Vector3( model.transform.position);//系统自带的
  6. string message = LitJson.JsonMapper.ToJson(dto);
  7. NetWorkScript.getInstance().sendMessage(Protocol.MAP,SelectMenu.nowPlayer.map,MapProtocol.MOVE_CREQ,message);

1.3从双端的执行结果,服务器此时应该是成功解析了数据包并发回了其他玩家的信息,这个里编译测试应该是不远了。 

2.通过上图可见,返回的结果数据包的三个参数是 1 2 4,在mapHandler增加对于command=4的处理代码,处理返回所有角色的移动信息,包括我自己

2.1在MessageManager脚本的MapHandlerFk中增加代码

2.2给预制体模型挂在一个脚本EachStateScript,用来存放每个实例化模型包含的状态变量,内容如下:这个变量可不能用static,静态变量连赋值都做不到。

2.3MapHandler.cs中增加move函数,解析数据包 同时操作对应模型移动,当然不移动自己

百度AI现在真的是强无敌啊!

 代码如下:

  1. public void move(string message)
  2. {
  3. MoveDTO dto = Coding<MoveDTO>.decode(message);//感觉马上就要能编译了
  4. if (dto.Id == SelectMenu.nowPlayer.id)//自己的位置不修改
  5. {
  6. return;
  7. }
  8. //下面修改实例
  9. GameObject go = playergoList[dto.Id];
  10. go.transform.rotation = new Quaternion((float)dto.Rotation.X, (float)dto.Rotation.Y, (float)dto.Rotation.Z, (float)dto.Rotation.W);
  11. go.transform.position = new Vector3((float)dto.Point.X, (float)dto.Point.Y, (float)dto.Point.Z);
  12. //go.BroadcastMessage("PlayerState", dto.Dir);//这里必须学会给每个实例带上这个状态位
  13. //go.GetComponent<>
  14. EachStateScript e = GetComponent<EachStateScript>();
  15. e.playerState = (int)dto.Dir;
  16. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/332670
推荐阅读
相关标签
  

闽ICP备14008679号