C# Unity3d:脚本更改了属性的值,但什么也没发生
我已经为我的GameObject的GameManager MonoBehavior设置了一个类型为Mode(枚举)“Mode”的公共属性,但是有时候,特别是在回调上,因为为所述属性指定一个值没有任何作用: 例如: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
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,那么它似乎编码得很好。我对“未加载的值”部分有点困惑。模式是否为空?