Unity多人连网(Multiplayer Networking)总结,玩家独立相机跟踪
发表于2018-01-05
Unity自带的Networking是非常神奇的东西,可以将一个工程同时当客户端、服务器使用,包括数据同步,都可以直接写在一起,只要标记好特性,添加相关组件即可。不过下面给大家分享的是在使用Networking做局域网游戏时的经验以及玩家独立相机跟踪的方法。
1. 使用Multiplayer Networking 以及 High Level API (HLAPI),来作为基础框架。可以实现服务器和客户端同时间,同对象,调用相同脚本的相同代码。
2. 可以实现RPC(Remote Procedure Call Protocol,远程过程调用协议)。具体使用 [Command] 还有 [ClientRpc] 两个特性。
· [Command],客户端调用,但是只在服务器执行。注意函数名要加前缀‘Cmd’,如void CmdFire()。
· [ClientRpc],服务器调用,但是只在所有客户端执行。注意函数名要加前缀‘Rpc’,如void RpcRespawn()。
3. 可以同步数据,并且通过同步数据调用相关处理函数。使用特性[SyncVar]来标记同步的变量。使用[SyncVar(hook = “OnChangeHealth”)]标记变量,在被标记的变量修改时,就会同时调用OnChangeHealth函数,该函数需要一个参数来接收这个变量。
为每个玩家添加跟踪相机(Camera)
因为原教程只有一个总镜头而且是固定的,玩家很容易就出镜头了,所以想为每个玩家添加一个独立的相机,但是直接添加相机对象到Player上是不可行的。因为要知道使用Unity自带的Networking,工程是服务器和客户端一起使用的。那么相应的相机也会一起使用,这样的话,每添加一个玩家,就会多一个镜头,而工程是共用的,所有的服务器客户端的玩家,镜头显示的内容都会变成最新添加的镜头显示的内容。
为了解决上面这个问题,可以一开始先把相机取消激活(SetActive(false)),在玩家进入场景时,只激活自己的镜头即可。
1. 添加Camera 到Player Perfabs里面。并取消激活。
2. 修改代码,为PlayerController添加公有变量GameObject来获取相机,在OnStartLocalPlayer方法,激活自己的相机。
// //PlayerController Class // public GameObject playerCamera; public override void OnStartLocalPlayer() { GetComponent<MeshRenderer>().material.color = Color.blue; playerCamera.SetActive(true); //激活自己的相机 }
3. 添加相机到脚本。
4.测试,在两个终端每个玩家都有独立的相机画面。
完整工程见Github:NetworkProject。