2016-12-01 55 views
1

我的目標是進行一次單一的碰撞檢測,以便在特定的持續時間內降低碰撞物體的移動速度。遞歸調用buff/unbuff? C#Unity3D

我試過到目前爲止:

//Class that detects the collision 
if (other.gameObject.tag == "enemy") 
{ 
    EnemyMovement enemyMove = other.GetComponent <EnemyMovement>(); 
    if (enemyMove.slowMove != 1) { 
     return; 
    } 

    enemyMove.Slow (2, 0.5f, true); 

    //.... 

//Class that handles the Enemy-Movement 
//The slowfactor gets multiplied with the Vector3 that handles the movementspeed of the Character 

void FixedUpdate() 
{ 
    Movement(); 
} 

void Movement() 
{ 
    gegnerRigid.MovePosition (transform.position + (gegnerMove * slowMove)); 
} 


public void Slow (float duration, float slowFactor, bool slowed) 
{ 
    if (slowed) 
    { 
     if (duration > 0) { 
      duration -= Time.deltaTime; 
      slowMove = slowFactor; 
      Slow (duration, slowFactor, slowed); //this recursive Call leads to huge performance issues, but how to keep the function going? 
     } else { 
      slowMove = 1; 
      slowed = false; 
     } 
    } 
} 

所以,我想發生: 呼叫慢功能,如果發生碰撞,使其調用它本身直到時間爲0

+0

這是令人難以置信的錯誤。你只需在Unity3D中使用** Invoke **定時器 – Fattie

+1

**從不**在編程中出於任何原因使用遞歸。 – Fattie

+0

@JoeBlow不會InvokeRepeating在這裏更好用嗎? –

回答

4

注,這裏的關鍵是

1.你在另一個對象上有buff/unbuff

您只需從'boss'對象調用另一個對象。不要把實際的buff/unbuff代碼放在你的'boss'對象中。只是「呼喚迷人」。

換句話說:對於你正在拋光/取消緩衝的東西,總是有buff/unbuff代碼。

2.對於Unity中的定時器,只需使用「Invoke」或「invokeRepeating」。

這真的很簡單。

一個BUFF/unbuff是這樣的簡單:

OnCollision() 
    { 
    other.GetComponent<SlowDown>().SlowForFiveSeconds(); 
    } 

要慢的對象...

SlowDown() 
    { 
    void SlowForFiveSeconds() 
    { 
    speed = slow speed; 
    Invoke("NormalSpeed", 5f); 
    } 
    void NormalSpeed() 
    { 
    speed = normal speed; 
    } 
    } 

如果你想 「慢慢慢」 - 沒有。在視頻遊戲中不可能注意到這一點。

從理論上講,如果你真的想「慢慢慢」 ......

SlowDown() 
    { 
    void SlowlySlowForFiveSeconds() 
    { 
    InvokeRepeating("SlowSteps", 0f, .5f); 
    Invoke("NormalSpeed", 5f); 
    } 
    void SlowSteps() 
    { 
    speed = speed * .9f; 
    } 
    void NormalSpeed() 
    { 
    CancelInvoke("SlowSteps"); 
    speed = normal speed; 
    } 
    } 

就這麼簡單。

+1

Omg你讓我很開心,我愛你!這向我展示瞭解決我的問題的一個非常簡單的方法!非常感謝 – Csharpest

+1

當然!有一個愉快的一天 – Csharpest

+0

任何人閱讀可能會喜歡這個QA .... http://stackoverflow.com/a/40949439/294884 – Fattie