【问题标题】:Why is my singleton null?为什么我的单身人士为空?
【发布时间】:2015-07-28 14:51:32
【问题描述】:

我尝试个性化NetworkManager,但他一直在给予

NullReferenceException

...在命令NetworkManager.singleton.StartHost ();

问题出在函数NetWorkManager.Singleton.StartHost(); 中的行StartGame(); 总是返回

...我不知道为什么会发生这种情况

这是代码。

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using UnityEngine.UI;

public class NetManager : NetworkManager {

    public Transform Bombeiro, Cnen, Policial, Suspeito,IaTeamPlayer;
    public string ServidorIP, NomeUsuario;
    private GameObject WayPoint;
    public int GrupoAvatar;
    public bool IniciarServidor;
    public GameObject Lacamera,menu;
    private Transform IA;
    private MandaRad recptor;
    private SobeRampa CodigoSubida;
    public GameObject[] BombeiroSpawnPoints;
    public GameObject[] PolicialSpawnPoints;
    public GameObject[] SuspeitoSpawnPoints;
    public GameObject[] CnenSpawnPoints;
    private GameObject[] pedestres;
    GameObject spawnPos;
    void Awake()
    {
        BombeiroSpawnPoints = GameObject.FindGameObjectsWithTag("spawnBombeiroTeam");
        PolicialSpawnPoints = GameObject.FindGameObjectsWithTag("spawnPolicialTeam");
        SuspeitoSpawnPoints = GameObject.FindGameObjectsWithTag ("spawnSuspeitoTeam");
        CnenSpawnPoints = GameObject.FindGameObjectsWithTag ("spawnCnemTeam");
    }

    public void ServerIni (bool iniciar)
    {
        IniciarServidor = iniciar;
    }

    public void PegaCampoIP(GameObject IP)
    {
        if (IP.GetComponent<InputField> ().text == "")
            ServidorIP = IP.GetComponent<InputField> ().placeholder.GetComponent<Text> ().text;
        else
            ServidorIP = IP.GetComponent<InputField> ().text;
    }

    public void PegaCampoNome(GameObject Nome)
    {
        if (Nome.GetComponent<InputField> ().text == "")
            NomeUsuario = Nome.GetComponent<InputField> ().placeholder.GetComponent<Text> ().text;
        else
            NomeUsuario = Nome.GetComponent<InputField> ().text;
    }

    public void EscolherAvatar (int grupo)
    {

        if (GrupoAvatar == 0)
        {
            spawnPos = BombeiroSpawnPoints[Random.Range(0, BombeiroSpawnPoints.Length)];
            base.playerPrefab = Bombeiro.gameObject;
            base.spawnPrefabs.RemoveAt(0);
            base.spawnPrefabs.Add(spawnPos);
        }
        else if (GrupoAvatar == 1)
        {
            spawnPos = CnenSpawnPoints[Random.Range(0, CnenSpawnPoints.Length)];
            base.playerPrefab = Cnen.gameObject;
            base.spawnPrefabs.RemoveAt(0);
            base.spawnPrefabs.Add(spawnPos);
        }
        else if (GrupoAvatar == 2)
        {
            spawnPos = PolicialSpawnPoints[Random.Range(0, PolicialSpawnPoints.Length)];
            base.playerPrefab = Policial.gameObject;
            base.spawnPrefabs.RemoveAt(0);
            base.spawnPrefabs.Add(spawnPos);
        }
        else if (GrupoAvatar == 3)
        {
            spawnPos = SuspeitoSpawnPoints[Random.Range(0, SuspeitoSpawnPoints.Length)];
            base.playerPrefab = Suspeito.gameObject;
            base.spawnPrefabs.RemoveAt(0);
            base.spawnPrefabs.Add(spawnPos);
        }

        if (IniciarServidor)
            StartGame ();
        else
            JoinGame ();
    }

    public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
    {
        GameObject player = (GameObject)Instantiate (base.playerPrefab, spawnPos.transform.position, spawnPos.transform.rotation);
        NetworkServer.AddPlayerForConnection (conn, player, playerControllerId);
    }

    public void StartGame()
    {
        NetworkManager.singleton.StartHost();
    }

    public void JoinGame()
    {
        NetworkManager.singleton.networkAddress = ServidorIP;
        NetworkManager.singleton.StartClient();
    }
}

它是在 unity 5 制作的,那么我该如何解决呢??

【问题讨论】:

  • 我认为您首先不应该从NetworkManager 派生新类型。
  • 单例属性是基类中的静态属性。目前尚不清楚它是如何实例化的。此外,几乎可以肯定,即使它被实例化,它将是基类 (NetworkManager) 而不是派生类 (NetManager) 的实例。对我来说似乎是错误的方向/架构。

标签: c# unity3d multiplayer unity-networking


【解决方案1】:

这是因为您覆盖了 Awake 函数。 它没有标记,但我发现实现 Awake 块是单例的标准 Unity 分配。

所以,删除你的 Awake,或者自己做单例 = 这个

【讨论】:

    【解决方案2】:

    我想也许你没有初始化 NetworkManager.singleton?你有没有将它作为 NetworkManager 的实例进行初始化?

    【讨论】:

    • 谢谢各位,我忘了实例化一个新对象 NetworkManager
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多