UNet:NetworkManager.spawnPrefabs返回空List

时间:2017-08-31 17:50:33

标签: c# unity3d unity5 unity2d

我还是团结的新人,所以如果我浪费你的时间,请原谅我。但是,如果你帮我解决这个问题,我感激不尽:

我正在创建一个使用统一的多人游戏我希望获得已注册的spawnablable Prefabs列表我搜索了Scipting API并找到了这个方法:NetworkManager.spawnPreabs

这是我的剧本:

library(blogdown)
new_site()

在运行控制台之前显示没有问题,但在运行游戏时控制台显示此错误:

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.Networking;

 public class CardSpawner : NetworkBehaviour
 {




public override void OnStartServer(){
    distributeCards ();
    Debug.Log ("THE METHOD WORKED!!!!");
} 

IEnumerator Mycoroutine (bool cardDistribution){
    yield return new WaitForSeconds(10f);
    if (ClientScene.ready) {

        RpcdistributeCards (true);


    }
}

[Server]
public bool distributeCards(){
    bool cardDistribution = false;
    //int playersNumber;

    //NetworkManager netM = new NetworkManager ();
    //netM = GetComponent<NetworkManager> ();
    //playersNumber = netM.numPlayers; 


        cardDistribution = true;

    StartCoroutine ("Mycoroutine",cardDistribution);



    return cardDistribution;
}

[ClientRpc]
public void RpcdistributeCards (bool Permission){

    Debug.Log ("The Client RPC Worked ");
    Transform startPositionTransform;
    Vector2 position, finalPosition;
    NetworkManager NetM;

    List<Transform> startPositionsList;

    Vector2 Increment = new Vector2 (1.41f, 0f);
    NetM = GetComponent<NetworkManager> ();
    List<GameObject> Cards;

    Cards = NetM.spawnPrefabs;
    if (Permission) {
        Debug.Log ("The If statement worked ");
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 8; j++) {

                GameObject CurrentGameObject = Cards [Random.Range (0, Cards.Count)];

                Cards.Remove (CurrentGameObject);
                Debug.Log (CurrentGameObject);
                startPositionsList = NetM.startPositions;

                switch (i) {
                case 1:
                    startPositionTransform = startPositionsList [0];
                    position = startPositionTransform.position;
                    finalPosition = position + Increment;
                    var cardFirstPosition = (GameObject)Instantiate (CurrentGameObject, finalPosition, Quaternion.identity);
                    break;
                case 2:
                    startPositionTransform = startPositionsList [1];
                    position = startPositionTransform.position;
                    finalPosition = position + Increment;
                    var cardSecondPosition = (GameObject)Instantiate (CurrentGameObject, finalPosition, Quaternion.identity);
                    break;
                case 3:
                    startPositionTransform = startPositionsList [2];
                    position = startPositionTransform.position;
                    finalPosition = position + Increment;
                    var cardThirdPosition = (GameObject)Instantiate (CurrentGameObject, finalPosition, Quaternion.identity);
                    break;
                case 4:
                    startPositionTransform = startPositionsList [3];
                    position = startPositionTransform.position;
                    finalPosition = position + Increment;
                    var cardFourthPosition = (GameObject)Instantiate (CurrentGameObject, finalPosition, Quaternion.identity);
                    break;
                }


            }
        }

    }
}
} 

这行代码是什么:

  NullReferenceException: Object reference not set to an instance of an 
   object
   CardSpawner.RpcdistributeCards (Boolean Permission) (at 
   Assets/Scripts/CardSpawner.cs:59)

我不明白为什么它返回null。 我感谢任何帮助。谢谢你的阅读。

1 个答案:

答案 0 :(得分:0)

不要抱歉寻求帮助!

List<GameObject> Cards;

Cards = NetM.spawnPrefabs;

尝试制作NetM&amp;卡片列表公开

public NetworkManager NetM;
public List<GameObject> Cards;

这将在检查器中显示List,以便您可以分配变量

当未分配正由脚本访问的内容时,会发生NullReferenceException。 因此,将这些变量和类公开,并将它们分配到检查器

NullReferenceException: Object reference not set to an instance of an 
object