2016-10-24 6 views
0

Итак, я пытаюсь понять, как написать скрипт, который сможет обнаружить, когда игровые объекты находятся в определенном мировом положении, чтобы преобразовать эти игровые объекты и переместить их, скажем, 1.Как перемещать GameObjects, используя мировое положение в единстве?

Надежда это имеет смысл, если нет, спросите меня, и я попытаюсь изо всех сил объяснить это более подробно. На самом деле была бы признательна любая помощь.

+1

Это слишком широко - обычно предполагается, что вы сначала попытаетесь написать свой собственный код и зададите вопрос о переполнении стека, если у вас возникнут проблемы с ним, которые вы не можете решить; этот сайт не предназначен для доставки кода, написанного с нуля. Чтобы начать работу, загляните в ['Transform.Translate()'] (https://docs.unity3d.com/ScriptReference/Transform.Translate.html) и рассмотрите возможность использования триггерного коллайдера (или ['Physics.OverlapSphere() '] (https://docs.unity3d.com/ScriptReference/Physics.OverlapSphere.html)) для обнаружения объектов, входящих в определенную область. – Serlite

ответ

4
void updateGameObjectsMatchingPosition(float x, float y, float z) 
{ 
    // Please try to use something more specific like GameObject.FindGameObjectWithTag("CoolTag"); 
    var gameObjects : GameObject[] = GameObject .FindObjectsOfType(GameObject) as GameObject[]; 

    for(var i = 0; i < gameObjects.length; i++) { 
     var position = gameObjects[i].transform.position; 
     if(position.x == x && position.y == y && position.z == z) { 
      //Do something with the position of this object. 
      gameObjects[i].transform.position = new Vector3(x + 1, y + 1, z + 1); 
     } 
    } 
} 
+0

Да, это работает, но если вы не применяете дискретизированный мир, вам следует, вероятно, проверить, находится ли позиция на небольшом расстоянии от позиции, на которую вы смотрите, а не на равных. – code11

+0

Альтернативно, [Kd-trees] (http://unitycoder.com/blog/2013/03/26/kdtree-find-nearest-object/) можно использовать для эффективного поиска ваших объектов. Вы должны это учитывать, если у вас слишком много объектов. – ldavid

+0

Согласны с code11 и lucasdavid, используйте это только для тестовых целей, попробуйте использовать что-то более совершенное, просто попросив GameObjects слишком лениво и слишком дорого. –

1

Прикрепите этот скрипт к игровому объекту.

[SerializedField] Vector3 _designatePosition; 
IEnumerator MoveUp() { 
    var speed = 5 * Time.deltaTime; 
    var targetPosition = transform.position + new Vector3(0, 1, 0); 
    while (Vector3.Distance(transform.position, targetPosition) > 0.01f) { 
     transform.position = Vector3.MoveTowards(transform.position, targetPosition, speed); 
    } 
} 

void Update() { 
    if (Vector3.Distance(transform.position, _designatePosition) < 0.01f) { 
     StartCoroutine(MoveUp()); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^