2015-10-07 90 views
0

Hy每個人,我都想要做一個擴展方法,讓你可以做旋轉函數的統一,但你可以選擇執行的時間,並在每次執行例程時增加值調用。 例如: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; 

} 

現在我把它用按鈕用戶界面,但我第一次使用它後,它不工作了,該爲:eulerAngles留在90,7。我想每次增加90度。 Thnak你再見

回答

1

我不知道這是否可以作爲直接的擴展,但是如果你把它簡單的功能(沒有「這個」四元)之前,你可以做以下

  • 在函數OnTriggerEnter只需調用StartCoroutine(RotateMeExtensions.MoveObject(「用變量填充」));

如果你真的想要作爲一個extenion創建一個像你這樣的虛擬函數,它唯一能做的就是調用一個全局的Monobehaviour協程,並且傳遞另一個函數。像

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

在我的ideia中,它只是一個monobehaviour,它附加在一個普通的對象上,並且有一個公共的靜態變量,指向它自己的實例,像一個單例。事情是,它必須是一個monobehaviour實例,因爲如果沒有,它不會運行協程 –

+0

thnak你,現在我知道如何擴展靜態和單身。 :) –

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;'。 –