Unity:制作新类实例时为空
我陷入了一个愚蠢的局面:我正在创建泛型类的新实例,但它返回“奇怪”的null。
    Rule rule2 = new Rule(); // initiate the class    Debug.Log(rule2); //1st debug
    rule2.RuleSetup(r: "CaughtEnough", li: 0); //setting up the parameters
    Debug.Log(rule2.rule); //2nd debug
第一次调试给了我
    nullUnityEngine.Debug:Log(Object)
同时设置参数有效,第二次调试给了我
   CaughtEnough   UnityEngine.Debug:Log(Object)
这应该在适当的类实例中。
给我带来的一个问题(到目前为止)是,如果我打电话给这个Rule类实例,
   Invoke(rule, 0f);它给了我NullReferenceException错误。但同时实际功能
   CaughtEnough();可以正常工作,并且符合预期。
有什么想法可能是问题的根源,以及如何解决它?
UPD还根据要求发布了Rule类的设置部分,尽管很简单
public class Rule : MonoBehaviour {public string rule;
public int leftInt;
public Dictionary<string, int> leftDict;
public float countdown;
public int outcome;
public CatchManager catchMan;
public Net net;
// Use this for initialization
void Start () {
    RuleSetup();   
}
public void RuleSetup(string r = "NoRule", int li = 0, Dictionary<string, int> ld = null,  float cd = float.PositiveInfinity) {
    rule = r;
    leftInt = li;
    leftDict = ld;
    countdown = cd;
}
.....
回答:
public class Rule : MonoBehaviour{}Rule rule2 = new Rule();
你  使用new的关键字,如果你是从继承创建新实例MonoBehaviour。
您应该得到如下异常 :
您正在尝试使用’new’关键字创建MonoBehaviour。这是不允许的。只能使用AddComponent()添加MonoBehaviours。或者,您的脚本可以从ScriptableObject继承,也可以根本没有基类
如果有,您的代码本来可以工作,public class Rule {}但是有public class Rule : MonoBehaviour
{}。
示例类:
public class Rule : MonoBehaviour{
    public Rule(int i)
    {
    }
}
如果您继承自MonoBehaviour,则应该使用GameObject.AddComponent或Instantiate创建它的新实例。
Rule rule2 = null;void Start()
{
  rule2 = gameObject.AddComponent<Rule>();
}
要么
public Rule rulePrefab;Rule rule2;
void Start()
{
    rule2 = Instantiate(rulePrefab) as Rule;
}
如果Rule脚本已经存在并已附加到GameObject,则无需创建/添加/实例化该脚本的新实例。只需使用GetComponent函数从连接到的GameObject中获取脚本实例。
Rule rule2;void Start()
{
    rule2 = GameObject.Find("NameObjectScriptIsAttachedTo").GetComponent<Rule>();
}
您会注意到,从派生脚本时,  在构造函数中使用参数MonoBehaviour。
示例类:(请注意,它不是从“MonoBehaviour” 派生的
public class Rule{
    public Rule(int i)
    {
    }
}
如果您  继承自MonoBehaviour,则应使用new关键字创建它的新实例。现在,您  根据需要在构造函数中使用参数。
Rule rule2 = null;void Start()
{
    rule2 = new Rule(3);
}
:
在最新版本的Unity,创建脚本的新实例,从继承MonoBehaviour与new关键字可能不会给你的错误,可能并不null太大
,但所有的回调函数将不会执行 。这些包括 Awake,Start, Update功能等。因此,您仍然必须按照此答案顶部所述正确执行操作。
以上是 Unity:制作新类实例时为空 的全部内容, 来源链接: utcz.com/qa/410669.html

