因此,我在这里尝试过此代码,它总是每隔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);
}
我觉得我在这里错过了一些非常基本和非常愚蠢的东西。
您想要的是在播放器的某个位置产生预制件。但是您是在世界坐标中生成它的。
一种解决方案是在生成预制件时将预制件作为父对象,然后将其本地位置而不是世界位置设置为所需位置。
但是将内容育成玩家是个坏消息,尤其是在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] 删除。
我来说两句