如何确保 Unity 可以找到我的游戏对象而不会返回为 Null?问题在于在调用对象之前初始化对象

How do I make sure that Unity can find my game object without it returning as Null? Problem is with initializing the object before calling it

提问人:Hex 提问时间:12/27/2022 最后编辑:Hex 更新时间:12/27/2022 访问量:152

问:

我正在使用 Unity 中的 Transform 函数,以便在鼠标瞄准某个方向时在我的 2D 自上而下射击游戏中旋转我的枪。但是,问题是 Unity 将我的一个函数返回为 Null,因此表示找不到游戏对象。我做了一些调试,发现我的 Debug.Log(aimTransform);返回为 null。

代码是这样的;

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


public class PlayerAimWeapon : MonoBehaviour
{
    public static Vector3 GetMouseWorldPosition()
    {
        Vector3 vec = GetMouseWorldPositionWithZ(Input.mousePosition, Camera.main);
        vec.z = 0f;
        return vec;
    }
    public static Vector3 GetMouseWorldPositionWithZ()
    {
        return GetMouseWorldPositionWithZ(Input.mousePosition, Camera.main);
    }
    public static Vector3 GetMouseWorldPositionWithZ(Camera worldCamera)
    {
        return GetMouseWorldPositionWithZ(Input.mousePosition, worldCamera);
    }
    public static Vector3 GetMouseWorldPositionWithZ(Vector3 screenPosition, Camera worldCamera)
    {
        Vector3 worldPosition = worldCamera.ScreenToWorldPoint(screenPosition);
        return worldPosition;
    }

    private Transform aimTransform;
    
    private void Start()
    {
        Debug.Log(aimTransform);
        aimTransform = transform.Find("Aim");
        
    }

    private void Update()
    {
        Vector3 mousePosition = GetMouseWorldPosition();

        Vector3 aimDirection = (mousePosition - transform.position).normalized;
        float angle = Mathf.Atan2(aimDirection.y, aimDirection.x) * Mathf.Rad2Deg;
        aimTransform.eulerAngles = new Vector3(0, 0, angle);
        Debug.Log(angle);
    }
}

我认为主要问题如下。

 private Transform aimTransform;
    
    private void Start()
    {
        Debug.Log(aimTransform); <--------------- This comes back as Null which is the problem. 
        aimTransform = transform.Find("Aim"); <-------- Aim is just the object in my game (Gun)
        
    }

我花了一些时间弄清楚如何初始化对象,然后使用 Find 函数调用它,这样它就不会返回为 Null,但我没有成功。

一旦 unity 可以找到 Object,它应该可以与我在下面进一步介绍的鼠标指针代码一起使用。

如前所述,我从 aimTransform 调试了 Null,它返回为 null。我不确定如何修复它并允许 Unity 实际找到我的游戏对象并让它被转换。我也知道主要问题是对象没有正确初始化,我真的不知道该怎么做。谢谢。

C# unity-game-engine 初始化 nullreferenceexception

评论

0赞 Hasnain Shaukat 12/27/2022
您是否知道转换之间的区别。Find 和 GameObject.Find?
1赞 Brett Caswell 12/27/2022
井。。。不,您的期望在这里是不正确的。 将要到这一点 -- 它将取决于你给它分配一些东西。在下一行中,分配 .但是,如果它是在被分配到那里之后,那么你遇到的问题就处于不同的范围内——可能与 有关。但更具体地说,你是否真的为任何地方做了一个 Object.InstantiateaimTransformnullnulltransform.Findnulltransform.FindAim

答:

0赞 Nikel 12/27/2022 #1

字段中的问题,它未初始化,并且您尝试从空字段中获取名称为“Aim”的转换。 在它的子项中按名称搜索转换。如果要查找名称为“Aim”的游戏对象,则有几种方法:aimTransformTransform.Find()

  • 如果可能的话,您可以序列化字段并从 Inspector 拖放引用。aimTransform
  • 您可以调用以按名称查找游戏对象,但只有在场景中存在具有适当名称的游戏对象时,它才有效。GameObject.Find("Aim")
0赞 TheNomad 12/27/2022 #2

正确的代码是这样的:

private void Start()
{
    aimTransform = transform.Find("Aim"); // <-- assuming you don't mean
                                          // GameObject.Find() at which point
                                          // you'd need to change the type of
                                          // aimTransform as well :)
    Debug.Log(aimTransform);
}

aimTransform 尚未“设置”,因此,它是 null。首先分配它,然后你可以记录它。