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
所以,我在这里尝试了这段代码,它总是每隔 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