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

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

1.客户端发送。

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

public class MoveDTO
{
	public string Id{get; set;}
	public int Dir{get;set;}
	public Assets.Model.Vector4 Rotation{get;set;}
	public Assets.Model.Vector3 Point{get;set;}
}

 一个新的PlayerStateConstans类

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

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

MoveDTO dto = new MoveDTO();
dto.Id = SelectMenu.nowPlayer.id;
dto.Dir = PlayerStateConstans.IDLE;//玩家的状态,这个到时候去服务器翻一下--playerState结构体
dto.Rotation = new Assets.Model.Vector4( model.transform.rotation);//转码啥的都只是时间问题
dto.Point = new Assets.Model.Vector3( model.transform.position);//系统自带的
string message = LitJson.JsonMapper.ToJson(dto);
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现在真的是强无敌啊!

 代码如下:

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

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-25 11:38:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-25 11:38:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-25 11:38:01       82 阅读
  4. Python语言-面向对象

    2024-03-25 11:38:01       91 阅读

热门阅读

  1. (第75天)AutoUpgrade 升级:11GR2 到 19C

    2024-03-25 11:38:01       41 阅读
  2. Redis学习三--集群部分概念

    2024-03-25 11:38:01       36 阅读
  3. Nomachine远程黑屏通用处理方法

    2024-03-25 11:38:01       42 阅读
  4. linux编写脚本,用来监控程序是否掉线

    2024-03-25 11:38:01       41 阅读
  5. 简述TCP的三次握手与四次挥手

    2024-03-25 11:38:01       39 阅读
  6. Linux ~ 查看日志的常用命令总结

    2024-03-25 11:38:01       33 阅读
  7. npm常用命令

    2024-03-25 11:38:01       33 阅读
  8. 智能小程序开发 —— P2P SDK 源码介绍(一)

    2024-03-25 11:38:01       42 阅读
  9. 怎么配置Dubbo的容错机制?

    2024-03-25 11:38:01       31 阅读
  10. 4k stars! 如何实现按拼音首字母查询证券代码?

    2024-03-25 11:38:01       38 阅读