C# 用U-Net在场景间传输数据

C# 用U-Net在场景间传输数据,c#,unity3d,C#,Unity3d,我目前正在使用U-Net开发Unity 3D中的多人FPS(我知道U-Net已被弃用),我感兴趣的是将在大厅场景中输入的输入字符串转换为一种玩家名称,以便在回合中显示统计信息 这就是我想到的: public class NameSetter :MonoBehaviour { private static string userName; public static string GetUserName() { return userName; }

我目前正在使用U-Net开发Unity 3D中的多人FPS(我知道U-Net已被弃用),我感兴趣的是将在大厅场景中输入的输入字符串转换为一种玩家名称,以便在回合中显示统计信息

这就是我想到的:

public class NameSetter :MonoBehaviour
{
    private static string userName;
    public static string GetUserName()
    {
        return userName;
    }
    public void SetUserName(string _usern)
    {
        userName = _usern;
    }
}
SetUserName()函数绑定到输入字段的OnValueChanged属性

以下是我的玩家类的相关代码:

public class Player : NetworkBehaviour
{
    [SyncVar]
    private string playername;

    public string PlayerName
    {
        get { return playername; }
        set { playername = value; }
    }

    void Awake()
    {
        playername = NameSetter.GetUserName();
        _deaths = 0;
        killCount = 0;
        damageDealt = 0;
        ResetPlayer(false); // resets player health and plays a respawn effect
    }
}
在两个独立的客户端上运行代码时,用户名最终都是主机输入的用户名

我还尝试在OnStartClient方法中的不同脚本上设置用户名。在本例中,在主机上,主机的用户名出现了两次,在客户端,它似乎工作正常。(这适用于两个玩家,当第三个玩家加入时,一切都乱了:p)

以下是相关代码:

[RequireComponent(typeof(Player))]
public class PlayerSetup : NetworkBehaviour
{
    public override void OnStartClient()
    {
        base.OnStartClient();

        string netId = GetComponent<NetworkIdentity>().netId.ToString();
        Player curr = GetComponent<Player>();
        curr.PlayerName = NameSetter.GetUserName();
        GameManager.AddPlayer(netId, curr);
        // The GameManager refers to a dictionary of players and id's that is used to keep track of all 
        // the players
    }
[RequireComponent(typeof(Player))]
公共类玩家设置:网络行为
{
公共覆盖无效OnStartClient()
{
base.OnStartClient();
字符串netId=GetComponent().netId.ToString();
Player curr=GetComponent();
curr.PlayerName=NameSetter.GetUserName();
GameManager.AddPlayer(netId,curr);
//GameManager指的是玩家和id的字典,用于跟踪所有玩家
//球员们
}

我假设这些问题与字段是静态的有关,但是我似乎找不到更好的替代方法来在我的大厅场景和在线场景之间传输变量,特别是因为替代方案需要是动态的。提前感谢!感谢您的任何帮助:D

将其放在大厅中的空游戏对象上cene和mark it
DontDestroyOnLoad
你能解释一下为什么你把username字段和GetUserName方法设置为静态的吗?@Josh这会为每个客户端创建一个对象,当它们没有被破坏时,每个客户端都会有一个对象,这会不会影响性能?@ErikOverflow据我所知,静态对象不会被破坏在场景之间转换时被unity删除,但我可能是错的,因为我对unity@barbecu只有在两个场景中都有该游戏对象的副本时,它才会在下一个场景中创建一个新的。不幸的是,Unity需要一些反模式来正确处理某些事情。在这种情况下,它将是
单例
模式。你的游戏对象应该有一个包含所有这些客户端的脚本,以及“主控”gameObject应该遵循singleton模式,这意味着它持有对自身的静态引用。在构造函数中,检查此引用是否为null。如果为null,则完成构造。如果为null,则您已经有了一个,可以取消。将其放在大厅场景中的空gameObject上,并将其标记为
DontDestroyOnLoad
您能解释一下为什么要使用y吗我们的username字段和GetUserName方法static?@Josh会为每个客户端创建一个对象,然后当它们没有被破坏时,每个客户端都会有一个对象,这会不会影响性能?@ErikOverflow据我所知,在场景之间转换时,unity不会删除静态对象,但我可能是错的,因为我是对我来说相当陌生unity@barbecu只有在两个场景中都有该游戏对象的副本时,它才会在下一个场景中创建一个新的。不幸的是,Unity需要一些反模式来正确处理某些事情。在这种情况下,它将是
singleton
模式。你的游戏对象应该有一个包含所有这些客户端的脚本,并且“master”游戏对象应该遵循singleton模式,这意味着它持有对自身的静态引用。在构造函数中,检查此引用是否为null。如果为null,则完成构造。如果不是,则您已经拥有一个,可以取消。