Unity3D C# VR: порождает объекты в определенной точке от игрока - PullRequest
1 голос
/ 22 февраля 2020

Итак, я попробовал этот код здесь, и он всегда порождает объект перед игроком каждые 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 (чтобы он перемещался по экрану). Я пробовал следующее, которое перемещает GameObject случайным образом по X и Y каждые n-секунд, но он больше не следует за осью 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);
    }

Мне кажется, что я упускаю что-то очень простое c и очень глупое здесь.

1 Ответ

0 голосов
/ 24 февраля 2020

, что вы хотите, это создать префаб в установленной позиции от игрока . Но вы порождаете его в мировых координатах.

Одно из решений заключается в том, чтобы привязать префабы к родительскому при их порождении и установить их локальную позицию , а не мировую позицию в нужном месте. .

Но воспитание вещей у игрока - плохая новость, особенно в VR. Поверьте мне.

Лучшим решением было бы сохранить Vector3, который является относительным местоположением от игрока, а затем установить позицию префаба в каждом кадре. Примерно так.

publi c 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 берет точку в локальном пространстве и выясняет, что это будет в мировом пространстве. https://docs.unity3d.com/ScriptReference/Transform.TransformPoint.html

...