Unity3D C# VR:在播放器的某个点生成对象

Unity3D C# VR: spawning objects at a certain point from the player

所以,我在这里尝试了这段代码,它总是每隔 n 秒在玩家面前生成一个对象(Update() 中的其他函数)

  private void SpawnTarget(int prefabIndex = -1)
    {
        GameObject target;
        target = Instantiate(targetPrefabs[0]) as GameObject;
        target.transform.SetParent(transform);
        target.transform.position = Vector3.forward * 3;
        activeTarget.Add(target);
    }

现在,我试图随机化它的生成位置,这样它就不会总是在相同的 X 和 Y 坐标上(因此它会在屏幕上移动)。我尝试了以下方法,它确实每 n 秒在 X 和 Y 方向随机移动 GameObject,但它不再跟随玩家的 Z 轴,即,如果玩家移过目标,现在它会在玩家身后不断重生.

  private void SpawnTarget(int prefabIndex = -1)
    {
        GameObject target;
        target = Instantiate(targetPrefabs[0]) as GameObject;
        target.transform.SetParent(transform);
        target.transform.position = target.transform.position + new Vector3(Random.Range(-1.0f, 1.0f), Random.Range(-1.0f, 1.0f), 3.0f);
        activeTarget.Add(target);
    }

或者(同样的行为):

  private Vector3 newVector;
  private void SpawnTarget(int prefabIndex = -1)
    {
        GameObject target;
        target = Instantiate(targetPrefabs[0]) as GameObject;
        target.transform.SetParent(transform);
        newVector = new Vector3(Random.Range(-1.0f, 1.0f), Random.Range(-1.0f, 1.0f), 3.0f);
        target.transform.position = target.transform.position + newVector;
        activeTarget.Add(target);
    }

我觉得我在这里遗漏了一些非常基本和非常愚蠢的东西。

您想要的是在玩家 的设定位置生成预制件 。但是你在世界坐标中生成它。

一个解决方案是在生成它们时将预制件parent设置为parent,并设置它们的本地位置,而不是所需的世界位置现货.

但是 parent向玩家展示内容是个坏消息,尤其是在 VR 中。相信我。

更好的解决方案是存储一个 Vector3,它是玩家的相对位置,然后将预制件的位置设置为每一帧。像这样。

public class SpawnedPrefab : MonoBehaviour {

// this is the position in the player's local space. 
// In your example, random x and y, and z =3
Vector3 positionRelativeToPlayer; 

Transform player;

void Update() {
    this.transform.position = player.TransformPoint(positionRelativeToPlayer);
}

}

TransformFrom point 在本地 space 中获取一个点,并计算出它在世界 space 中的位置。 https://docs.unity3d.com/ScriptReference/Transform.TransformPoint.html