我陷入了一个愚蠢的局面:我正在创建泛型类的新实例,但它返回“奇怪”的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

第一次调试给了我
    null
    UnityEngine.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;
}
.....

最佳答案



如果您从new继承,则不能使用MonoBehaviour关键字创建新实例。

您应该得到如下异常:



如果您有public class Rule {}但您有public class Rule : MonoBehaviour {},那么您的代码将可以正常工作。

创建派生自MonoBehaviour的类的新实例:

示例类:

public class Rule : MonoBehaviour
{
    public Rule(int i)
    {

    }
}

如果您从MonoBehaviour继承,则应该使用GameObject.AddComponentInstantiate创建它的新实例。
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的类的新实例:

示例类:(请注意,它不是从“MonoBehaviour”派生的
public class Rule
{
    public Rule(int i)
    {

    }
}

如果不要MonoBehaviour继承,则应使用new关键字为其创建新实例。现在,如果需要,您可以在构造函数中使用该参数。
Rule rule2 = null;

void Start()
{
    rule2 = new Rule(3);
}

编辑:

在最新版本的Unity中,创建使用MonoBehaviour关键字从new继承的脚本的新实例可能不会给您错误,也可能不是null,但是所有回调函数都不会执行。这些包括AwakeStartUpdate函数和其他函数。因此,您仍然必须按照此答案顶部所述正确执行此操作。

关于c# - unity : Null while making new class instance,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37398538/

10-10 19:49