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

问题描述

安装的Unity版本是2020.2.1f1

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

我可以执行打印等基本功能,直到我调用以下功能之一加载场景、更新 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);
    }

游戏管理员

    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
    }

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

---技巧---

游戏管理员

    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 限制我们从另一个线程调用他们的 API,这导致了这个问题。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...