Unity之Network场景中物体同步(显示/隐藏)
原创
©著作权归作者所有:来自51CTO博客作者紫龙大侠的原创作品,请联系作者获取转载授权,否则将追究法律责任
用的unity5.4中的network的功能进行场景中的物体同步。
虽然2022年了但是公司有些项目依然在用5.4的版本。不得不说关于低版本可以查阅的资料太少了。摸索了一下,最终实现了一些功能。截取了一个场景中物体同步的功能记录一下。下面开搞:
首先
新建一个场景。场景中很简单,一个cube和一个sphere 而且sphere是cube的子物体,和一个Cylinder。Cylinder作为游戏主角。cube和sphere是场景中的物体。
如下图:
目标:让sphere通过按键盘的A--D键来显示和隐藏,同步到所有客户端。
要想多个场景同步必然是有服务器和客户端。
本篇不讲服务器,直接用系统自带的。默认就好不用设置。
将networkmanager的两个脚本给到plane上。如下图:
-----
我们要通过角色来判断是不是本地客户端。因此我们要控制场景中物体同步的脚本加给主角。如图:
具体脚本的代码如下:
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();,然后服务器就执行了,并且是通知了所有客户端执行了这个方法。
简单理解就是有一群小弟(一群客户端),小弟们之间互相看不到,还有一个老大(服务器)。某个小弟告诉老大说打局游戏吧,老大通知所有小弟打游戏。最终我们看到的就是所有小弟都在打游戏。
最终效果如图: