Unity多人连网(Multiplayer Networking)总结,玩家独立相机跟踪

发表于2018-01-05
评论0 3.2k浏览
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

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引