2016-04-21 4 views
1

Ich arbeite an Code für ein 2D-Spiel, in dem der Spieler 3 Herzen hat.Maximale Array-Bereichsgrenze

Wenn der Spieler mit einem bombPrefab kollidiert, verliert er 1 Herz. Wenn der Spieler mit einem heartPrefab kollidiert, gewinnt er ein zusätzliches Herz. Wenn er 3 Mal hintereinander mit einem bombPrefab kollidiert, endet das Spiel.

Die Herzen Textur ist wie folgt. Array 0 (3 Herzen) Array 1 (2 Herzen) Array 2 (1 Herz).

Ich habe ein Problem, das Array zu begrenzen! Ich möchte wissen, wie man die folgende Antwort erhält: Wenn der Spieler 3 Herzen hat und mit einem heartPrefab kollidiert, wird nur das Objekt zerstört, es gibt keine Änderung in der Anzahl der Herzen, die der Spieler hat.

Der folgende Code funktioniert zu nehmen und geben zusätzliche Herzen. Aber wenn ich mit einem heartPrefab kollidiere, und ich habe bereits 3 Herzen (Maximum) bekomme ich den Fehler: Index ist out Range Array.

Wie soll ich fortfahren? C# Antwort, wenn möglich

using UnityEngine; 
using System.Collections; 
using UnityEngine; 
using System.Collections; 

public class Heart : MonoBehaviour 
{ 


    public Texture2D[] initialHeart; 
    private int heart; 
    private int manyHeart; 

    void Start() 
    { 

     // The game start with 3 hearts at RANGE 0 
     GetComponent<GUITexture>().texture = initialHeart [0]; 
     heart = initialHeart.Length; 

    } 


    void Update() 
    { 

    } 

    public bool TakeHearts() 
    { 
     if (heart < 0) { 

      return false; 

     } 

     if (manyHeart < (heart - 1)) { 

      manyHeart += 1; 
      GetComponent<GUITexture>().texture = initialHeart [manyHeart]; 
      return true; 


     } else { 

      return false; 

     } 
    } 

    public bool AddHearts() 
    { 
     if (heart <= 2) { 

      return false; 

     } 

     if (manyHeart < (heart + 1)) { 

      manyHeart -= 1; 
      GetComponent<GUITexture>().texture = initialHeart [manyHeart]; 
      return true; 


     } else { 

      return false; 

     } 
    } 
} 
+0

Können wir den Code sehen, der 'initialHeart' initialisiert? – Quantic

+0

@Quantic Ich habe GameObject (in Hearts umbenannt) in Unity erstellt, GuiTexture und Heart Script hinzugefügt, ich kann das Array durch Inspector =] –

+0

'if (manyHeart <(heart + 1))' sollte 'if (manyHeart> 0) 'Ich denke. –

Antwort

1

Sie sind overcomplicating die if-Anweisungen (es sei denn, es gibt einen anderen Grund für so tun) ... var manyHeart und Herz sind immer in umgekehrter Beziehung. Einfach verwenden:

public bool AddHearts() 
{ 
    if (manyHeart > 0) { 
     manyHeart -= 1; 
     GetComponent<GUITexture>().texture = initialHeart [manyHeart]; 
     return true; 
    } else { 
     return false; 
    } 
} 
+0

Vielen Dank so viel! Aber jetzt, wie kann ich heartPrefab zerstören, wenn der Spieler 3 Herzen hat? –

+0

Sie haben wahrscheinlich Ihre 'OnColliderEnter'-Funktion (oder ähnlich) irgendwo, die eine Zerstörung für das instanziierte Herz aufruft, in das der Spieler hineinrennt und auch' AddHearts' aufruft. Wenn das der Fall ist, sollte das eigentlich gut funktionieren, denn das GO zu zerstören und dem Spieler Herzen hinzuzufügen, sind zwei getrennte Aufgaben. Wenn nicht, müssen Sie den Code bereitstellen, der 'Add/TakeHearts' aufruft. –

+0

@ GunnarB.yes ich habe: 'Leere OnCollisionEnter2D (Collision2D colisor) \t { \t \t if (colisor.gameObject.tag == "Bee") { \t \t \t Som(); \t \t \t Herz = GameObject.FindGameObjectWithTag ("Herz"). GetComponent () als Herz; \t \t \t if (vida.AddHearts()) \t \t \t \t Zerstören (Gameobject); \t \t} \t \t if (colisor.gameObject.tag == "floor") { \t \t \t Zerstören (Gameobject, 1.5f); \t \t} 'aber, wenn Spieler haben 3 Herz Herzvorläufer nicht zerstören, warum ?. –