Unity线程错误

发布于 2022-09-05 06:14:49 字数 3026 浏览 17 评论 0

先上代码

 public static void GuestLogin(INClient client ,string USER_ID){
        var message = NAuthenticateMessage.Device(USER_ID);
        client.Login(message, (INSession newSession) =>
        {
            Debug.Log("login success");
            client.Connect(newSession);
            Loading.SetActive(false);
        }, (INError error) =>
        {
            Debug.LogErrorFormat ("Could not login user: '{0}'.", error.Message);
        });
    }

Login 方法(来自第三方插件)

public void Login(INAuthenticateMessage message,
    Action<INSession> callback,
    Action<INError> errback)
{
    authenticate("/user/login", message.Payload, Lang, callback, errback);
}
// login方法里的authenticate方法
private void authenticate(string path,
                                  AuthenticateRequest payload,
                                  string langHeader,
                                  Action<INSession> callback,
                                  Action<INError> errback)
        {
            // Add a collation ID for logs
            payload.CollationId = Guid.NewGuid().ToString();

            var scheme = (SSL) ? "https" : "http";
            var uri = new UriBuilder(scheme, Host, unchecked((int)Port), path).Uri;
            Logger.TraceFormatIf(Trace, "Url={0}, Payload={1}", uri, payload);

            byte[] buffer = Encoding.UTF8.GetBytes(ServerKey + ":");
            var authHeader = String.Concat("Basic ", Convert.ToBase64String(buffer));

            TimeSpan span = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
            transport.Post(uri.ToString(), payload, authHeader, langHeader, Timeout, ConnectTimeout, (data) =>
            {
                AuthenticateResponse authResponse = AuthenticateResponse.Parser.ParseFrom(data);
                Logger.TraceFormatIf(Trace, "DecodedResponse={0}", authResponse);

                switch (authResponse.IdCase)
                {
                    case AuthenticateResponse.IdOneofCase.Session:
                        Logger.Info("authentication");
                        callback(new NSession(authResponse.Session.Token, System.Convert.ToInt64(span.TotalMilliseconds)));
                        break;
                    case AuthenticateResponse.IdOneofCase.Error:
                        errback(new NError(authResponse.Error));
                        break;
                    case AuthenticateResponse.IdOneofCase.None:
                        Logger.Error("Received invalid response from server");
                        break;
                    default:
                        Logger.Error("Received invalid response from server");
                        break;
                }
            }, (e) =>
            {
                errback(new NError(e.Message));
            });
        }

我的问题是,我需要在login成功后设置loading 组件为false,并且跳转到新的场景,但是这时候会报错
SetActive can only be called from the main thread.请大家帮忙看看,小弟感激不尽

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

家住魔仙堡 2022-09-12 06:14:49

网络通信方面在另一个线程中,不能在另一个线程操作主线程的东西。
简单方法是,你可以用一个变量中转。例如bool loginFinish=false,登录完成后不调用任何方法,仅仅设置loginFinish=true。
让游戏的主线程每帧都检查loginFinish,一旦看到它变为true,就自己调用Loading.SetActive(false)和其他方法。

复杂点的多线程操作,你可以使用Loom,这东西功能比较全面。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文