2016-12-01 2 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'オブジェクトに入れないでください。ちょうど "バフを呼ぶ"。

言い換えれば、常にbuffing/unbuffingしていること自体にbuff/unbuffコードがあります。

2. Unityのタイマーの場合は、 "Invoke"または "invokeRepeating"を使用してください。

これは本当に簡単です。

unbuffバフ/この単純です:あなたは、あなたが "ゆっくりと遅い" したい場合は...

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

を遅くしたいオブジェクトに

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

- ません。それはビデオゲームでそれを気付くことは不可能です。理論的には

あなたが本当に「ゆっくり、それを遅く」にしたい場合は...

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

それは簡単なことです。

+1

あなたはちょうど私をとても幸せにしました、私はあなたを愛しています!これは私に私の問題を解決するための非常に簡単な方法を示しました!おかげで多くは – Csharpest

+1

確かに!素敵な一日をお過ごしください – Csharpest

+0

誰もこのQAを楽しむかもしれない.... http://stackoverflow.com/a/40949439/294884 – Fattie

関連する問題