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

用的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();,然后服务器就执行了,并且是通知了所有客户端执行了这个方法。

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

最终效果如图:

猜你喜欢

转载自blog.csdn.net/alayeshi/article/details/122604137