我想留下我的播放器,当我加载一个新的场景时,他已登录到我的Web。
代码:
客户端
登录脚本
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();
}
}播放器脚本
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脚本
using System;
[Serializable]
public class PlayerSerializable
{
public string Id;
public string Nickname;
}AuthorizationToken脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class AuthorizationToken
{
public string access_token;
public string token_type;
}Web
PlayerController脚本
// 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。
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脚本,分配给主场景中的游戏管理器游戏对象
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;
}
}发布于 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会是什么样的:
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);
}
}https://stackoverflow.com/questions/62785035
复制相似问题