我正在使用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可以找到对象,它应该与我下面的鼠标指针代码一起工作。
如前所述,我从aimTransform中调试了Null,它返回Null。我不确定如何修复它,让Unity找到我的游戏对象并进行转换。我也知道主要的问题是对象没有被正确初始化,我真的不知道如何去做。谢谢。
aimTransform
字段的问题,它没有初始化,您试图获得名称"Aim"从空字段。Transform.Find()
搜索变换在它的子名称。如果你想找到游戏对象名称" ai"有几种方法:
- 如果你有可能,你可以序列化字段
aimTransform
和拖放引用从检查器 - 你可以调用
GameObject.Find("Aim")
来查找游戏对象的名称,但它将只在情况下,如果游戏对象有适当的名称存在于你的场景。
正确的代码是:
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尚未"设置",因此,它为空。首先分配它,然后你可以记录它。