2015-10-07 2 views
0

Hy all, я пытаюсь сделать метод расширения, который очень важен, чтобы вы могли выполнять функцию вращения, но вы можете выбрать время, в которое выполняется, и увеличивать значение каждый раз, когда подпрограмма называется. Пример: transform.Rotate(90,0,0, SecondsInWichMakeTheTransition);Сделайте метод расширения с помощью IEnumerator

это код, который я пишу.

public static class RotateMeExtensions{ 

public static IEnumerator MoveObject(this Transform source, 
int x,int y, int z, float overTime) 
{ 
    Quaternion target = new Quaternion(); 

    float a = source.rotation.x + x; 
    float b = source.rotation.y + y; 
    float c = source.rotation.z + z; 

    target.eulerAngles = new Vector3(a, b, c); 

    float startTime = Time.time; 

    while(Time.time < startTime + overTime) 
    { 
     source.rotation = Quaternion.Lerp(source.rotation, target, (Time.time - startTime)/overTime); 

     yield return null; 
    } 
    source.rotation = target; 

} 

Прямо сейчас я называю это с Button UI, но после того, как в первый раз я использую его, он не работает больше, то остаться в Углы Эйлера 90,7. Я хочу увеличивать его каждый раз на 90 градусов. Thnak вы Bye Bye

ответ

1

Я не уверен, если он работает как расширение напрямую, но если вы сделаете это простая функция (без «этого» перед КВАТЕРНИОННЫХ) вы могли бы сделать следующее

  • On The функция OnTriggerEnter просто вызывает StartCoroutine (RotateMeExtensions.MoveObject («заполнить переменными»));

Если вы действительно хотите, как расширение, создайте фиктивную функцию, такую ​​как ваша, что единственное, что она делает, это вызвать глобальную Monobehaviour Coroutine и передать другую функцию. Что-то вроде

public static void MoveObject(this Quaternion source, int x,int y, int z, float overTime) 
{ 
    GlobalMonoBehaviour.instance.StartCoroutine(MoveObjectCoroutine(source, x, y, z, overTime)); 
} 

public static IEnumerator MoveObjectCoroutine(Quaternion source, int x,int y, int z, float overTime) 
{ 
    Quaternion target = new Quaternion(); 
    Vector3 tempV = new Vector3(source.eulerAngles.x + x, 
          source.eulerAngles.y + y, source.eulerAngles.z + z); 

    target.eulerAngles = tempV; 

    float startTime = Time.time; 
    while(Time.time < startTime + overTime) 
    { 
     source = Quaternion.Lerp(source, target, (Time.time - startTime)/overTime); 

     yield return null; 
    } 
    source = target; 
} 

Надеется, что это помогает

+0

, в котором пространство имен это GblobalMonobehavior? –

+0

В моей идее это просто монобэш, который привязан к обычным объектам и имеет статическую переменную public, которая указывает на собственный экземпляр, такой как singleton. Дело в том, что это должен быть экземпляр monobehaviour, потому что, если нет, он не будет запускать coroutine –

+0

thnak you, теперь я знаю, как делать расширение со статическими и singleletons. :) –

1

Я отправлю ответ так что, возможно, это будет полезно для кого-то других. Проблема заключалась в том, что я использовал

transform.rotation.x 

вместо я должен был использовать

transform.rotation.eulerAngles.x 
+0

Итак, счетчик работает с расширениями изначально? это называется так: transform.MoveObject (10,10,10,10)? –

+0

yes: 'StartCoroutine (transform.MoveObject (0,0,90,1)); '. Единственная проблема, с которой я столкнулся, заключается в том, что вы увеличиваете первый параметр. вы должны увеличивать значение за пределами функции, а затем назначать ее методу расширения. 'float a = source.rotation.x;'. –

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