“ArgumentException:您要实例化的对象为null”Unity和我无法弄清楚为什么

时间:2018-05-08 10:32:57

标签: c# unity3d null instantiation

这突然停止工作,当试图实例化弹丸时告诉我弹丸是空的。即使我向它声明了一个值。 Debug告诉我Start()运行。不能给出更多的背景。

这里的问题不是“这个错误意味着什么”它是“为什么它是空的?”我得到了代达罗斯的一个很好的回复,他告诉我远离字符串查找。我会尝试并告诉你们是否有效。

编辑://我的老师在我忘记删除的文本中添加了一些代码(他无法找到我为什么会变为null)但是现在它已被删除,这是正确的代码无法正常工作。标签没有错过拼写,我已经检查过套管等。

void Start()
{
    targPlayer = GameObject.FindGameObjectWithTag("Player").transform;
    projectile = GameObject.Find("Projectile");
    Debug.Log("was run");
}

void Update()
{
    fire -= Time.deltaTime;
    dmg -= Time.deltaTime;

    if (fire <= 0)
    {
        if (Vector2.Distance(transform.position, targPlayer.position) <= detectionRange)
        {
            // This is where the error happens
            Instantiate(projectile, transform.position, Quaternion.identity);
        }
        fire = fireRate;
    }

    if (Vector2.Distance(targPlayer.position, transform.position) <= detectionRange && Vector2.Distance(targPlayer.position, transform.position) >= stopRange)
    {
        transform.position = Vector2.MoveTowards(transform.position, targPlayer.position, movSpeed * Time.deltaTime);
    }
}

1 个答案:

答案 0 :(得分:1)

这里有很多可能的解决方案,所以我会想到一些想到的东西。

首先,使用字符串查找是我认为大多数开发人员客观地称之为坏的一件事。除了将案例和文化问题放在一起进行比较之外,为了让您或其他团队成员稍后更改该对象的名称而不记住这些查找依赖于它,并且在非常重要的情况下使用时,输入拼写错误非常容易。存在严重的性能问题。对于Unity来说尤其如此,它将简单地遍历层次结构,直到它找到匹配的对象,基本上是所有的查找调用。

如果您的实例化调用失败,则必须发生上述情况。

您可能希望在某个时候查看object pooling,但让我们继续进行实例化调用。

要绕过字符串查找,可以将射弹变为变量。

public Transform projectile;

这将允许您在检查器中分配它。可能不允许其他脚本访问此变量,因此对于奖励积分,您可以使用SerializeField属性序列化私有变量,并在检查器中分配它。

[SerializeField] private Transform projectile;

然后,您可以立即访问该射弹而无需任何查找开销,并且无需担心会破坏查找。

随着您的进步,您的设计理念肯定会发生很大的变化,我认为您不应该将这类数据中的任何一种绑定到逻辑类(以防任何人提到这一点),但我会说通过更改查找结构,这是朝着正确方向迈出的一步。