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

古斯塔夫

因此,我在这里尝试过此代码,它总是每隔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);
    }

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

亚当·B

您想要的是在播放器的某个位置产生预制件但是您是在世界坐标中生成它的。

一种解决方案是在生成预制件时将预制件作为父对象,然后将其本地位置而不是世界位置设置为所需位置。

但是将内容育成玩家是个坏消息,尤其是在VR中。相信我。

更好的解决方案是存储Vector3,它是播放器的相对位置,然后将预制件的位置设置为每一帧。这样的事情。

公共课程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在本地空间中获取一个点,并弄清楚它在世界空间中将是什么。https://docs.unity3d.com/ScriptReference/Transform.TransformPoint.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章