Unity -我的脚本在编辑器上停止工作,但在我的构建(android, ios)上工作



已安装的Unity版本为2020.2.1f1

我正在使用Unity开发一款在线多人游戏。我有两种不同的连接类型;Http和Websocket(使用Websocketsharp: https://github.com/sta/websocket-sharp,我已经使用Nuget安装了它)。Http get/post, Websocket connect/send/close工作完全正常,但当我调用函数(直接或通过发送事件)响应后,大多数时候我的代码调用函数内部没有完成编辑器(在构建-android,ios上工作良好)。我不确定这个问题是否与http/websocket有关,但它与在线连接有关,因为我在使用Unity开发实时多人游戏时遇到过同样的问题。Gamesparks .

我可以做基本的功能,如打印等,直到我调用以下函数loadscene之一,更新UI,或调用另一个函数在相同/不同的脚本(只有第一个这些作品,之后的一切都不会运行)。控制台没有显示任何错误,游戏没有暂停或崩溃。它运行在相同的fps,但这部分代码不会继续。其他脚本/更新工作正常。我已经搜索了很多,但甚至找不到一个相关的主题。

WebSocket客户:

void OnBattleResponse(object sender, MessageEventArgs messageEventArgs) {
string message = messageEventArgs.Data;
if (messageEventArgs.Data.Equals(Constants.WEBSOCKET_ERROR))
return;
var  webSocketData = JsonUtility.FromJson<BattleResponseSerializable>(message);
switch (webSocketData.type) {
case 0:
seed         = webSocketData.user1.seed;
opponentSeed = webSocketData.user2.seed;
_connectionManager.BattleGetStart(seed, opponentSeed);
break;
.
.
.
}

连接管理器:

public void BattleGetStart(int userSeed, int opponentSeed) {
_gameManager.StartWave(userSeed, opponentSeed);
}

<游戏经理/strong>

public void StartWave(int userSeed, int opponentSeed)
{
UserSeed = userSeed;
OpponentSeed = opponentSeed;
UserRandom = new System.Random(UserSeed);
OpponentRandom = new System.Random(OpponentSeed);
StartWaveTimer(); // After this nothing will be run, it's not related to startWaveTimer, any function that I've mentioned causes the same issue.
print("DOESN'T WORK"); // This doesn't work on Editor but works on builds
_spawner.ActivateSpawner(true); // doesn't work
}

我发现了一个技巧来处理这种情况,但我不喜欢它作为一个适当的解决方案,不想为更新调用花费资源。当我在响应后调用函数(直接或通过发送事件)时,在被调用的函数中,我将bool设置为true,并且在更新调用中,当bool为true并且代码完全正常工作时,我调用必要的函数。

——诀窍——

<游戏经理/strong>

bool startWave;
public void StartWave(int userSeed, int opponentSeed)
{
UserSeed       = userSeed;
OpponentSeed   = opponentSeed;
UserRandom     = new System.Random(UserSeed);
OpponentRandom = new System.Random(OpponentSeed);
startWave      = true;
}
void Update() {
if (startWave) {
startWave = false;
StartWaveTimer();
print("WORKS"); // With this trick, it works on editor too.
_spawner.ActivateSpawner(true); // works
}
}

我的脚本在构建上工作而不是在unity编辑器上工作的原因是什么?

谢谢!

给那些会遇到这种问题的人的建议:

因为我发现Unity不是线程安全的。Unity限制我们从另一个线程调用他们的API,这导致了这个问题。

所以你必须从主线程而不是另一个线程调用你的函数/方法。

相关内容

  • 没有找到相关文章

最新更新