C# Unity3d:脚本更改了属性的值,但什么也没发生

C# Unity3d:脚本更改了属性的值,但什么也没发生,c#,networking,properties,callback,unity3d,C#,Networking,Properties,Callback,Unity3d,我已经为我的GameObject的GameManager MonoBehavior设置了一个类型为Mode(枚举)“Mode”的公共属性,但是有时候,特别是在回调上,因为为所述属性指定一个值没有任何作用: 例如: public class GameManager : uLink.MonoBehaviour { public static GameManager instance; public bool dedicated = false; public Mode mo

我已经为我的GameObject的GameManager MonoBehavior设置了一个类型为Mode(枚举)“Mode”的公共属性,但是有时候,特别是在回调上,因为为所述属性指定一个值没有任何作用:

例如:

public class GameManager : uLink.MonoBehaviour {
    public static GameManager instance;

    public bool dedicated = false;
    public Mode mode = Mode.MainMenu;
    public List<Player> players = new List<Player> ();
    public Player localPlayer;


    // Use this for initialization
    void Start ()
    {
        GameManager.instance = this;
    }

    #region Server
        #region Network

    void uLink_OnServerInitialized ()
    {
        Debug.Log ("Server successfully started on port " + uLink.Network.listenPort);
        new Authenticator ("127.0.0.1", 1234, "DB", "dbUser", "dbPassword");
        mode = Mode.ServerDone;
    }
    (...)
    public enum Mode
    {
        MainMenu, //
        ServerInit, //Server start
        ServerStarting, //Server is starting
        ServerDone, //Server done loading
        ClientInit, //Client starting up
        ClientConnected, //Client connected
        ClientAwaitAuth,
        ClientAuthed, //Client authenticated
        ClientAuthFailed,
        Client //Client mode
    }
}
公共类游戏管理器:uLink.monobhavior{
公共静态GameManager实例;
公共布尔值=假;
公共模式=Mode.main菜单;
公开名单玩家=新名单();
公共播放器本地播放器;
//用于初始化
无效开始()
{
GameManager.instance=这个;
}
#区域服务器
#区域网络
void uLink_OnServerInitialized()
{
Log(“服务器在端口“+uLink.Network.listenPort上成功启动”);
新的验证器(“127.0.0.1”、1234、“DB”、“dbUser”、“dbPassword”);
mode=mode.ServerDone;
}
(...)
公共枚举模式
{
主菜单//
ServerInit,//服务器启动
ServerStarting,//服务器正在启动
ServerDone,//服务器已完成加载
ClientInit,//客户端正在启动
ClientConnected,//客户端已连接
ClientAwaitAuth,
ClientAuthed,//客户端已验证
ClientAuth失败了,
客户端//客户端模式
}
}
(使用Unity3D的网络和uLink的网络时都会发生这种情况)

回调发生,日志放在控制台上,也创建了身份验证器singleton,但模式不变。我尝试过调试并在
mode=mode.ServerDone上放置断点但它只是说“值未加载”

如果使用编辑器手动将模式更改为
mode.ServerDone
,则我的代码工作正常


我最好的猜测是,发生这种情况是因为回调是由一个不能对属性进行写入的协同程序调用的,但我不知道如何解决它。

我找到了答案,原来StartServer()不是异步的,因此我的模式被替换了。

您是如何声明
模式的?你在什么地方有那个代码吗?没想到那会有关系,把它添加到问题中我只是想知道你是否真的声明了
模式,但你确实声明了。这似乎没有问题,因此当您声明
模式时,
枚举
函数可能尚未加载。也许您应该在
Start()
中给出
mode
的初始值,甚至是
onlevelwasload
。加载mode时,实际上在调用回调之前对其进行了编辑。它从
main菜单进入
ServerInit
,然后进入
ServerStarting
,但在
OnServerInitialized()
回调中将其更改为
ServerDone
时,它不会更改。如果我手动更改它,它将从
ClientInit
ClientConnected
ClientAwaitAuth
(它模拟客户端连接),但在调用
OnAuthenticateSuccess()
回调时不会更改为
clientauthenticed
。如果我随后使用编辑器将其修改为
ClientAuthed
它会自动转到
Client
,然后游戏开始OK,那么它似乎编码得很好。我对“未加载的值”部分有点困惑。
模式是否为空?