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

Posted

技术标签:

【中文标题】Unity - 我的脚本在编辑器上停止工作,但在我的构建(android,ios)上工作【英文标题】:Unity - My script stops working on Editor but works on my builds(android, ios) 【发布时间】:2021-02-09 08:40:42 【问题描述】:

安装的 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 开发实时多人游戏时遇到了同样的问题。

我可以执行基本功能,例如打印等.控制台不显示任何错误,游戏不会暂停或崩溃。它以相同的 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
    

我找到了处理这种情况的技巧,但我不喜欢将其作为适当的解决方案,并且不想将资源用于更新调用。当我在响应后调用函数(直接或通过发送事件)时,在被调用函数内部,我将 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
        
    

我的脚本在构建上运行但在统一编辑器上运行的原因是什么?

谢谢!

【问题讨论】:

听起来像是时间问题?使用您的Update“Trick”,您只需将执行移至下一帧......也许这是需要的延迟?此外,您将其移回主线程,而 OnBattleResponse 可能会在后台线程上被调用,并且任何可能的异常都不会显示 是的,据我所知。但问题是,它始终适用于构建,但不适用于编辑器。 【参考方案1】:

给遇到此类问题的人的建议:

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

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

【讨论】:

以上是关于Unity - 我的脚本在编辑器上停止工作,但在我的构建(android,ios)上工作的主要内容,如果未能解决你的问题,请参考以下文章

Raycast 不在电话上工作,但在 Unity 编辑器上工作

PHP Mail 在我不编辑代码的情况下停止工作

在 IOS 中保存和加载 XML 文件会在我的 Unity 项目中产生问题

Python 脚本在 VirtualBox (py 2.7.10) 上工作,但在 Raspberry Pi 3 (py 2.7.11) 上不工作

jquery 脚本在桌面上工作,但在 iphone 上滞后

在 Visual Studio 中编辑的 Unity 脚本在某些行上不提供自动完成功能