用的unity5.4中的network的功能进行场景中的物体同步。

虽然2022年了但是公司有些项目依然在用5.4的版本。不得不说关于低版本可以查阅的资料太少了。摸索了一下,最终实现了一些功能。截取了一个场景中物体同步的功能记录一下。下面开搞:

首先

新建一个场景。场景中很简单,一个cube和一个sphere 而且sphere是cube的子物体,和一个Cylinder。Cylinder作为游戏主角。cube和sphere是场景中的物体。

如下图:

目标:让sphere通过按键盘的A--D键来显示和隐藏,同步到所有客户端。

Unity之Network场景中物体同步(显示/隐藏)_客户端

要想多个场景同步必然是有服务器和客户端。

本篇不讲服务器,直接用系统自带的。默认就好不用设置。

将networkmanager的两个脚本给到plane上。如下图:

Unity之Network场景中物体同步(显示/隐藏)_客户端_02

-----

我们要通过角色来判断是不是本地客户端。因此我们要控制场景中物体同步的脚本加给主角。如图:

Unity之Network场景中物体同步(显示/隐藏)_服务器端_03

 具体脚本的代码如下:

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class testsceneobj : NetworkBehaviour
{

// Use this for initialization
void Start()
{


if (isLocalPlayer)
{
Debug.Log("我是本地物体");

}

}

// Update is called once per frame
void Update()
{

if (!isLocalPlayer)
{
return;
}



if (Input.GetKeyDown(KeyCode.A))
{

CmdIsNotActive();//隐藏物体


}

if (Input.GetKeyDown(KeyCode.D))
{
CmdIsActive();//显示物体

}

}

[Command]//服务器执行
void CmdIsNotActive()//方法必须是Cmd开头
{

RpcPlay();
}

[ClientRpc] //由服务器端调用,在客户端执行

void RpcPlay()//方法必须是Rpc开头

{

GameObject.Find("Cube").transform.FindChild("Sphere").gameObject.SetActive(false);


}
//-----------------
[Command]//服务器执行
public void CmdIsActive()
{

RpcPlay1();
}

[ClientRpc] //由服务器端调用,在客户端执行

void RpcPlay1()

{
GameObject.Find("Cube").transform.FindChild("Sphere").gameObject.SetActive(true);
}
}

这样就实现了场景中物体的同步显示和隐藏。

解释一下代码:

[Command]这个方法是某个客户端要告诉服务器应该执行内容的。

 [ClientRpc] 是由服务器告诉所有客户端应该做什么的。

例如上面代码中  客户端告诉服务器应该执行方法RpcPlay();,然后服务器就执行了,并且是通知了所有客户端执行了这个方法。

简单理解就是有一群小弟(一群客户端),小弟们之间互相看不到,还有一个老大(服务器)。某个小弟告诉老大说打局游戏吧,老大通知所有小弟打游戏。最终我们看到的就是所有小弟都在打游戏。

最终效果如图:

Unity之Network场景中物体同步(显示/隐藏)_游戏引擎_04