【发布时间】:2020-04-09 16:59:12
【问题描述】:
正如标题所说,我在编辑器中处于播放模式时加载场景时遇到问题。
我的游戏的工作流程如下:
- 正在初始化(工作正常) 有一个空场景创建了一些全局游戏对象,这些对象将在整个运行时都存在。
- MainMenu(工作正常) 初始化完成后,它会加载 MainMenu 场景。我可以与场景互动,一切都很好。
- 连接到游戏服务器(工作正常) 在主菜单中,我可以选择连接到游戏服务器(我自己创建的专用服务器应用程序) 建立连接并发送登录信息效果很好。
- 字符选择(不工作) 在服务器上登录后,我得到了选择一个角色的共鸣。 (这按预期工作。) 然后我将通过打开角色选择场景来处理这个响应。 在这里我有问题。在编辑器内的 Playmode 中,处理程序方法被执行(由调试日志验证),但实际上并未加载场景。 当我构建游戏并运行创建的 .exe 并按照完全相同的步骤加载角色选择场景并按预期显示时。
我搜索了文档和网络,但没有发现任何类似的问题(也许我仍然遗漏了一些东西)
所以我的问题如下: 如何让场景也加载到编辑器播放模式中?我的方法似乎并没有完全错误,因为它在构建后起作用。
这是应该加载场景的代码sn-p:
private void MessageRecived(object sender, GNL.ResponseMessageEventArgs e)
{
GameEventMessage message = this.eventManager.MessageHandler.ParseMessage(e.Message);
Debug.Log($"Recived message with type {message.Type}");
switch (message.Type)
{
case GameEvent.CharacterSelectionRequired:
Debug.Log($"Handle character creation 01");
this.HandleCharacterSelectionRequried(message);
break;
default:
break;
}
}
private void HandleCharacterSelectionRequried(GameEventMessage eventMessage)
{
Debug.Log($"Handle character creation 02");
SceneManager.LoadScene("CharacterCreation");
}
所有三个 Debug.Log 语句都被执行。只有 LoadScene 在编辑器播放模式下不起作用。
重要补充 经过进一步的测试,我不得不提到网络通信是在一个单独的线程中完成的。当有新消息到达时,从该线程调用 eventHandler。
这是将方法添加到事件处理程序的位置:
this.client = new GNL.GameClient(System.Net.IPAddress.Parse(host), port);
this.client.AnnounceRecivedMessage += this.MessageRecived;
this.clientNetwork = new Thread(this.client.Start);
clientNetwork.Start();
这就是eventHandler的定义:
public event EventHandler<ResponseMessageEventArgs> AnnounceRecivedMessage;
重要补充 - 第 2 部分 我刚刚发现,它适用于正常构建,但在构建设置中选择“开发构建”时不起作用。
这真的很烦人,因为我每次更改测试时都必须构建游戏。
感谢您的任何帮助和建议。
【问题讨论】:
-
您的问题可能与线程有关! Unity的大部分API只能在Unity主线程中使用……难道
MessageRecived是从后台线程调用的? -
是的,正如我在问题中所写的,
MessageRecived被分配给 EventHandlerAnnounceRecivedMessage,这是从用于网络通信的单独线程调用的。但是,如果它确实是线程问题,那么它也不应该与正常构建一起使用。我记得之前尝试过多线程,然后 unity 抛出一个错误,但没有错误。 -
这取决于那里如何处理线程......
标签: unity3d