【问题标题】:SyncVar not changing Bool on button press Unity 3dSyncVar在按钮按下Unity 3d时不会改变Bool
【发布时间】:2018-10-11 14:11:55
【问题描述】:

这是我的第一个网络项目。我尝试遵循一些教程,这就是我遇到的问题:我试图在单击按钮时简单地更改布尔值。按钮在一个场景中,而下方的文本对象在另一个场景中。所以我在两个不同的场景中运行同一个网络管理器。我意识到这不是传统的,但对于我的项目来说必须是这种方式。我现在正在寻找的只是它来更改文本,一旦我了解这是如何发生的,我相信我可以弄清楚其余的。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;

public class textChanger : NetworkBehaviour 
{
    Text text;

    [SyncVar]
    bool change = false;

    // Use this for initialization
    void Start () 
    {
        text = gameObject.GetComponent<Text>();
    }

    // Update is called once per frame
    void Update () 
    {
        if(change)
        {
            text.text = "it worked";
        }
    }


    [Command]
    public void CmdChangeText()
    {
        change = true;
    }

}

如果我通过按键将“更改”设置为 true,则代码将完全按照应有的方式运行,文本会更改。但是当我单击另一个场景中的按钮时它不起作用。我正在使用 Networking Hud,这两个场景实际上是相连的。但是变量没有更新。

在第一张图片中,“Text”游戏对象正在运行“Text Changer”脚本。在第二张图片中,按钮也运行着通用的“游戏对象”对象。您可以在“Text Changer”脚本上调用“CmdChangeText”方法的按钮 onClick 区域中看到它被引用。

所以在我看来,一切看起来都应该正常工作,但事实并非如此。有人可以帮忙吗?

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    来自Unity Documentation

    这些变量的值将同步从服务器到客户端

    因此,如果您尝试在客户端上进行设置,它将无法正常工作。它只能像你已经做的那样使用[Command] 来完成。


    您还应该检查您的控制台输出。据我所知,为了能够调用Command 方法,必须将持有NetworkIdentity 设置为LocalPlayerAuthority。我总是必须在 Player 对象本身上为所有命令放置一个特殊的类,以使其工作。


    我知道这可能不是答案,但至少是一种解决方法:
    您可以直接使用[ClientRpc] 设置值,而不是等待[SyncVar]

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.Networking;
    
    public class textChanger : NetworkBehaviour {
    
        Text text;
    
        private bool change = false;
    
        // Use this for initialization
        void Start () {
            text = gameObject.GetComponent<Text>();
        }
    
        // Update is called once per frame
        void Update () {
            if(change)
            {
                text.text = "it worked";
            }
        }
    
        [Command]
        public void CmdChangeText()
        {
            // sets the value on the server
            change = true;
    
            RpcChangeText();
        }
    
        // This is executed on ALL clients
        // SyncVar is no longer needed
        [ClientRpc]
        private void RpcChangeText()
        {
            change = true;
        }
    }
    

    【讨论】:

    • 大声笑,对,所以如果我已经这样做了但它不起作用,我还能改变什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 2020-06-06
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    相关资源
    最近更新 更多