我正在学习Unity3D并且在我的3D雷达上遇到了一些麻烦。我的雷达是我的玩家游戏对象的孩子,它在我飞行时旋转。雷达本身旋转45度,因此它面向用户。有一个立方体应该是敌机的雷达点。 Cube是Radar的孩子,所以应该继承它的轮换。多维数据集上有一个脚本可以自动更新每个update()。这是层次结构:
Enemy Plane
Player
-- Camera
-- Radar
------ Cube (radar representation of Enemy Plane)
问题是,当立方体本身旋转时,雷达的运动不是。随着我越接近敌机,Cube越来越接近摄像机(这很好)但是我希望它的运动跟随父Radar物体的45度旋转?
public class RadarGlyph : MonoBehaviour
{
GameObject radarSource;
GameObject trackedObject;
Vector3 radarScaler;
void Start()
{
this.radarSource = GameObject.Find("Radar");
this.trackedObject = GameObject.Find("Enemy Fighter");
this.radarScaler = new Vector3(0.001f, 0.001f, 0.001f);
}
void Update()
{
Vector3 vDelta = this.trackedObject.transform.position - this.radarSource.transform.position;
vDelta.Scale(this.radarScaler);
this.transform.localPosition = this.transform.InverseTransformDirection(vDelta);
}
}
对于完整的解决方案,您必须首先获得目标的位置,然后在光点和雷达的上下文中重新创建它。
作为快速解决方案,您可以尝试更改最后一行,如下所示:
this.transform.localPosition = this.parent.localRotation * this.transform.InverseTransformDirection(vDelta);
或者(显然不如你提到的那样好)
this.transform.localPosition = Quaternion.Inverse(this.parent.localRotation) * this.transform.InverseTransformDirection(vDelta);
其中一个必然会起作用。 (第一个做了)
编辑:这是第三种选择
this.transform.localPosition = this.transform.parent.parent.InverseTransformDirection(vDelta);
这个位置在玩家的空间中获得并将其应用于雷达的空间。
第一个和第三个试图做同样的事情。由于您将方向转换为blip的坐标系,因此其父项所具有的任何旋转都将被取消。相反,正确的做法是首先获得相对于玩家的位置。然后将它应用于雷达中的光点。我在这里的第三行代码试图这样做。