首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >保持Web播放器登录,并在统一中改变场景。(ASP.NET Web统一)

保持Web播放器登录,并在统一中改变场景。(ASP.NET Web统一)
EN

Stack Overflow用户
提问于 2020-07-07 22:50:24
回答 1查看 179关注 0票数 0

我想留下我的播放器,当我加载一个新的场景时,他已登录到我的Web。

代码:

客户端

登录脚本

代码语言:javascript
复制
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class Login : MonoBehaviour
{
    public TMP_InputField emailInputField;
    public TMP_InputField passwordInputField;
    public Button loginButton;

    public Text popup;

    private string httpServerAddress = "myadress";

    public Player player;

    private void Start()
    {
        player = FindObjectOfType<Player>();
    }

    public void OnLoginButtonClicked()
    {
        if (string.IsNullOrEmpty(emailInputField.text))
        {
            popup.text = "Email can't be void";

        }
        else if (string.IsNullOrEmpty(passwordInputField.text))
        {
            popup.text = "Password can't be void";

        }
        else
        {
            StartCoroutine(TryLogin());

        }
        
    }

    private IEnumerator TryLogin()
    {
        yield return InitializeToken(emailInputField.text, passwordInputField.text);
        yield return GetPlayerInfo();

        SceneManager.LoadScene("MainScene");
    }


    IEnumerator InitializeToken(string email, string password)
    {
        Player player = FindObjectOfType<Player>();
        if (string.IsNullOrEmpty(player.Token))
        {
            UnityWebRequest httpClient = new UnityWebRequest(httpServerAddress + "Token", "POST");

            
            WWWForm dataToSend = new WWWForm();
            dataToSend.AddField("grant_type", "password");
            dataToSend.AddField("username", email);
            dataToSend.AddField("password", password);

            httpClient.uploadHandler = new UploadHandlerRaw(dataToSend.data);
            httpClient.downloadHandler = new DownloadHandlerBuffer();

            httpClient.SetRequestHeader("Accept", "application/json");

            yield return httpClient.SendWebRequest();

            if (httpClient.isNetworkError || httpClient.isHttpError)
            {
                throw new Exception("Helper > InitToken: " + httpClient.error);
            }
            else
            {
                string jsonResponse = httpClient.downloadHandler.text;
                AuthorizationToken authToken = JsonUtility.FromJson<AuthorizationToken>(jsonResponse);
                player.Token = authToken.access_token;
            }
            httpClient.Dispose();
        }
    }

    IEnumerator GetPlayerInfo()
    {
        Player player = FindObjectOfType<Player>();
        UnityWebRequest httpClient = new UnityWebRequest(httpServerAddress + "api/Player/Info", "GET");

        httpClient.SetRequestHeader("Authorization", "bearer " + player.Token);
        httpClient.SetRequestHeader("Accept", "application/json");

        httpClient.downloadHandler = new DownloadHandlerBuffer();

        yield return httpClient.SendWebRequest();

        if (httpClient.isNetworkError || httpClient.isHttpError)
        {
            throw new Exception("Helper > GetPlayerInfo: " + httpClient.error);
        }
        else
        {
            PlayerSerializable playerSerializable = JsonUtility.FromJson<PlayerSerializable>(httpClient.downloadHandler.text);
            player.Id = playerSerializable.Id;
            player.Nickname = playerSerializable.Nickname;
        }

        httpClient.Dispose();
    }

    
}

播放器脚本

代码语言:javascript
复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    private string _token;
    public string Token
    {
        get { return _token; }
        set { _token = value; }
    }

    private string _id;
    public string Id
    {
        get { return _id; }
        set { _id = value; }
    }

    private string _nickname;
    public string Nickname
    {
        get { return _nickname; }
        set { _nickname = value; }
    }
}

PlayerSerializable脚本

代码语言:javascript
复制
using System;

[Serializable]
public class PlayerSerializable
{
    public string Id;
    public string Nickname;
}

AuthorizationToken脚本

代码语言:javascript
复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class AuthorizationToken
{
    public string access_token;
    public string token_type;
}

Web

PlayerController脚本

代码语言:javascript
复制
        // GET api/Player/Info
        [HttpGet]
        [Route("Info")]
        public Models.PlayerModel GetPlayerInfo()
        {
            string authenticatedAspNetUserId = RequestContext.Principal.Identity.GetUserId();
            using (IDbConnection cnn = new ApplicationDbContext().Database.Connection)
            {
                string sql = $"SELECT Id, Nickname FROM dbo.Players " +
                    $"WHERE Id LIKE '{authenticatedAspNetUserId}'";
                var player = cnn.Query<Models.PlayerModel>(sql).FirstOrDefault();
                return player;
            }
        }

我认为这可以是一个解决方案,DontDestroyOnLoad脚本和客户机上的GameManager脚本:

DontDestroyOnLoad脚本,分配给登录场景中的播放器GameObject。

代码语言:javascript
复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DontDestroyOnLoad : MonoBehaviour
{
    void Awake()
    {
        int count = FindObjectsOfType<DontDestroyOnLoad>().Length;
        if (count > 1)
        {
            Destroy(gameObject);
        }
        else
        {
            DontDestroyOnLoad(gameObject);
        }
    }
}

GameManager脚本,分配给主场景中的游戏管理器游戏对象

代码语言:javascript
复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
    public Text playerNameText;

    public Player player;

    void Start()
    {
        player = FindObjectOfType<Player>();
        playerNameText.text = player.Nickname;
    }

}
EN

回答 1

Stack Overflow用户

发布于 2020-07-07 23:23:53

您需要使用DontDestroyOnLoad()作为GameObject,所以这应该是在播放器的开始/唤醒阶段。https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html

或者将GameObject从旧场景移到新场景SceneManager.MoveGameObjectToScene()。这应该在一个分发场景的经理中。https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.MoveGameObjectToScene.html

在这里,对于您的播放器来说,DontDestroyOnLoad会是什么样的:

代码语言:javascript
复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    private string _token;
    public string Token { get => this._token; set => this._token = value; }

    private string _id;
    public string Id { get => this._id; set => this._id = value; }


    private string _nickname;
    public string Nickname{ get => this._nickname; set => this._nickname = value; }
    
    void Awake()
    {
        DontDestroyOnLoad(this.gameObject);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62785035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档