2016-04-15 3 views
0

Я пытаюсь повернуть группу объектов на 90 градусов в единицу, поэтому я установил все объекты в один и тот же родитель, затем повернул родительский элемент, он повернул только отлично но это слишком быстро, что я не вижу, как я могу замедлить его? Я попробовал оба кодов ниже и оба одинаковы: \ этот код появляется в функции, которая вызывается обновлением, когда пользователь нажимает на кнопкуСлишком быстрое вращение группы объектов в Unity

float totalRotation = 0; 
    while (Mathf.Abs(totalRotation) < 90){ 
     totalRotation += Time.deltaTime; 
     Parent.transform.RotateAround(temp.transform.position, flag*Vector3.right, Time.deltaTime); 
    } 

и это один

Parent.transform.RotateAround(temp.transform.position, flag*Vector3.right, 90f); 

спасибо заранее!

+0

Публикация фрагментов кода - это совершенно бесполезно **.никто не имеет понятия, где этот код появляется и т. д. – Fattie

+0

@JoeBlow отредактирован, надеемся, что теперь это станет более ясным. – msLangdon95

ответ

0

Используйте фактор для угла, что-то вроде

Parent.transform.RotateAround(temp.transform.position, flag*Vector3.right, Time.deltaTime * 0.5f); 

На основе while я предполагаю, что вы на самом деле не делают этого в Update. В любом случае это не будет работать, так как обновление frame. Вы не хотите, чтобы while делал что-нибудь подобное. Сделайте вместо этого whileif. Таким образом, вращение, вероятно, будет слишком медленным, поэтому коэффициент будет больше. В настоящее время ваше вращение мгновенное.

Edit:
Что-то, как это будет работать:

public bool isRotating = false; 
public float speed = 20.0f; 

public Vector3 targetRotation; 

void Update() 
{ 
    if(isRotating) 
    { 
     if(Vector3.Distance(transform.eulerAngles, targetRotation) > 1.0f) 
     { 
      transform.Rotate(Vector3.up * Time.deltaTime * speed); 
     } 
     else 
     { 
      transform.eulerAngles = targetRotation; 
      isRotating = false; 
     } 
    } 
} 

Это будет только вокруг у.

+0

Вы абсолютно правы, я превратил его в if и сделал коэффициент больше, я просто хочу, чтобы он вращался на 90 градусов и пробовал много факторов, и ни один из них не кажется правильным: \ – msLangdon95

+0

Отредактировано примером того, как вы могли бы зажать вращение , –

0

Эта часть ответа не работает. См. Обновление

Фактически вы сделали это неправильно. Движения в Unity должны выполняться медленно через обновления, а не только один раз. Как и ChristophKn, я предлагаю использовать Coroutine.

const float speed = 180; 
IEnumerator Rotate() { 
    float rotated = 0; 
    while (rotated < 90) { 
     float rotation = speed*Time.fixedDeltaTime; 
     rotated += rotation; 
     Parent.transform.RotateAround(temp.transform.position, flag*Vector3.right, rotation); 
     //wait for the next fixed update to continue. 
     yield return new WaitForFixedUpdate(); 
    } 
} 

Чтобы начать вращаться, вызовите StartCoroutine(Rotate);

EDIT

У меня есть еще одна идея, чтобы сделать это, не используя сценарий, но анимации:

  • Во-первых, добавить вращающийся анимация к вашим родительским объектам, которая поворачивает нужный угол.

  • Чтобы повернуть группу объектов, установите их в качестве родителя, как в вопросе, а затем запустите анимацию.

  • В конце анимации (вы можете вызвать свои методы в этой точке, используя animation events), позвоните по номеру SetParent(null,true) для всех ваших объектов в группе. Это позволит удалить родителя, но сохранить позицию мира.

  • Наконец, установите поворот родителя на исходное значение.

Надеюсь, это поможет.

+0

Спасибо за ответ, я попробовал, и он не вращался вообще :(! – msLangdon95

+0

он даже не попал в цикл while, я добавил инструкцию печати до и в цикле, она не дошла до нее внутри – msLangdon95

+0

ОК, я исправил его, просто больший знак. – DRKblade

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