2017-06-26 11 views
0

5つの健康コンテナを持つZeldaヘルスシステムを構築しました。各容器には4つの部分があります。Unity - hpコンテナの更新時にZeldaライフシステムがクラッシュする

このヘルスバーを更新すると、範囲外の例外が発生します。

マイコード:

[SerializeField] 
Image[] healthContainers; // 5 containers as images 

int currentHealth; 
int maxHealth; 
int healthPerHealthContainer = 4; // 1 healthcontainer = 4 health pieces 

private void Start() 
{ 
    maxHealth = healthContainers.Length * healthPerHealthContainer; // set max hp 
    currentHealth = maxHealth; // init current hp 
    UpdateHealthBar(); // first gui update 
} 

public void ChangeHealth(int amount) // get damage or heal 
{ 
    currentHealth = Mathf.Clamp(currentHealth + amount, 0, maxHealth); // add or subtract health 
    UpdateHealthBar(); // update gui 
} 

public void UpdateHealthBar() // gui updater 
{ 
    int healthContainerIndex = currentHealth/healthPerHealthContainer; // get the current heart to change 
    int healthContainerFillAmount = currentHealth % healthPerHealthContainer; // the fillamount of the heart 

    if (currentHealth % healthPerHealthContainer == 0) 
    { 
     if (currentHealth == healthContainers.Length) 
     { 
      healthContainers[healthContainerIndex - 1].fillAmount = 1; 
      return; 
     } 

     if (healthContainerIndex > 0) 
     { 
      healthContainers[healthContainerIndex].fillAmount = 0; 
      healthContainers[healthContainerIndex - 1].fillAmount = 1; 
     } 
     else 
     { 
      healthContainers[healthContainerIndex].fillAmount = 0; 
      return; 
     } 
    } 

    healthContainers[healthContainerIndex].fillAmount = healthContainerFillAmount/(float)healthPerHealthContainer; 
} 

だから私は20馬力で始まる各健康のために4枚で5個の健康コンテナを使用した場合。 GUIを更新するとき、それは

healthContainerIndex = 5; 

healthContainers[healthContainerIndex].fillAmount = 0; 

..ため

int healthContainerIndex = currentHealth/healthPerHealthContainer; 

結果にクラッシュし、5つのコンテナと配列のインデックス範囲は、0から4です。

しかし、簡単に書いてください。

healthContainers[healthContainerIndex -1].fillAmount = 0; 

私は正しい心を得る必要があるので間違っています。だから誰かが私がここで作った間違いを犯すのだろうか?私はそれを見ることができません..

+3

私はあなたが(紙に) 'currentHealth'と何が' healthContainerIndex'があることを期待したいの値、およびどのような変更を期待したい 'healthContainers'インデックス書き留め示唆しています。 –

+0

Unityに[SerializeField]を使用する理由はほとんどありません。 – Fattie

+0

@Fattieよく執筆しています...そうではありません。変数をプライベートにすると、よりきれいに見える – Question3r

答えて

2

私は間違いなく紙の上にそれを書くことに同意する、このようなインデックスの問題を助けることができます。

あなたのソリューションがあなたが望むやり方で動作するかどうかを再考したいかもしれません。あなたが持っている解決策は、プレイヤーの健康が一度に1つ上または下にしか上がらないと仮定して動作します。プレイヤーが十分なダメージで殴られたり、健康状態が完全に回復した場合、解決策はステップをスキップして心臓が正しく更新されないことがあります。すべてのコンテナを繰り返し処理して更新すれば、実装するのがはるかに簡単になり、より堅牢になります。

public void UpdateHealthBar() // gui updater 
{ 
    for (int healthContainerIndex = 0; healthContainerIndex < healthContainers.Length; healthContainerIndex++) 
    { 
     healthContainers[healthContainerIndex].fillAmount = Mathf.Clamp01((float)currentHealth/healthPerHealthContainer - healthContainerIndex); 
    } 
} 
+0

ああ、うわー。私は本当に感銘を受けた – Question3r

関連する問題