2016-08-04 12 views
0

У меня есть объект игры, который имеет много детей (сферы)Перемещения каждый ребенок

enter image description here

На каком-то этапе игр я хотел бы, чтобы переместить каждый ребенок вниз плавно, так что это будет выглядеть как он разваливается. Я пробовал использовать цикл foreach для перемещения каждого элемента с помощью Vector3.Lerp. К сожалению, все начинает сильно отставать.

Было бы здорово, чтобы они падают плавно, как этот

enter image description here

foreach (Transform child in GameObject.Find("Carbon").transform) 
{ 
     child.transform.position = Vector3.Lerp(child.transform.position, 
            new Vector3(child.transform.position.x, 
               child.transform.position.y - 200, 
               child.transform.position.z), 0.2f); 
} 
+1

Если вы хотите, чтобы структура структуры «развалилась», вы можете назначить каждому ребенку жесткое тело с ограниченными возможностями (и, необязательно, коллайдер сферы) в редакторе, а затем включить их всех (используя цикл foreach), когда это время для их отпадения. Это _might_ дает лучшую производительность, чем так много отдельных интерполяций в основном потоке. – cpimhoff

+0

Если вы не используете физику для перемещения объектов, тогда удалите компоненты жесткого тела и коллайдера, если они есть. Вы также должны использовать ['Time.DeltaTime'] (https://docs.unity3d.com/ScriptReference/Time-deltaTime.html) для плавного перемещения, если вы перемещаете объекты в функции обновления. – ColmanJ

ответ

3

Я думаю, что основная проблема исходит от GameObject.Find(). Из внешнего вида вашего кода он находит углеродное преобразование в каждом foreach. Если у вас есть 100 объектов, он будет использовать «GameObject.Find» 100 раз в одном кадре. Это может быть исправлено путем кэширования преобразования:

List<Transform> carbonList = new List<Transform>(); 

void Start() { 
    //cache carbon tranform in Start() or OnEnable() 
    carbonList.AddRange(transform.GetComponentsInChildren<Transform>());//use this if you attach your code in object parent 

    //loop transform form caching list so it will not keep finding transform and cause lagging 
    foreach (Transform child in carbonList) 
    { 
     var childPos = child.position; 
     child.position = Vector3.Lerp(childPos, new Vector3(childPos.x, childPos.y - 200, childPos.z), 0.2f); 
    } 
} 

если ваш сценарий не в родительском объекте вы можете использовать поиск метки вместо этого. http://answers.unity3d.com/questions/24257/how-do-i-find-all-game-objects-with-the-same-name.html

0

Ваша анимационная графика показывает, что все ваши сферы поддерживают одинаковое относительное положение друг к другу. Вместо того, чтобы «разваливаться», они, кажется, падают вместе как тело. Если вы хотите, а не анимировать каждую отдельную сферу, поставите их под один родительский объект и одушевите этого родителя.

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