提问人:Hex 提问时间:12/27/2022 最后编辑:Hex 更新时间:12/27/2022 访问量:152
如何确保 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
问:
我正在使用 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 实际找到我的游戏对象并让它被转换。我也知道主要问题是对象没有正确初始化,我真的不知道该怎么做。谢谢。
答:
0赞
Nikel
12/27/2022
#1
字段中的问题,它未初始化,并且您尝试从空字段中获取名称为“Aim”的转换。 在它的子项中按名称搜索转换。如果要查找名称为“Aim”的游戏对象,则有几种方法:aimTransform
Transform.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。首先分配它,然后你可以记录它。
评论
aimTransform
null
null
transform.Find
null
transform.Find
Aim