2016-04-13 15 views
1

Ich lege alle GameObjects unter einer Liste in Szene. Die folgende Funktion wird in der shelf.cs verwendet, um die Spielobjekte zu löschen. Ich weise die Funktion einer Taste zu, so dass sie den Eingabewert annimmt und erkennt, welches Gameobject einen geringeren Wert als die Eingabe hat. Dann löschen. Das Problem ist, wenn ich auf die Schaltfläche in der Spielvorschau klicke, werden die Spielobjekte nicht gelöscht. Es gibt keine Warnungen. Ich debugge, ob es alle Eingaben erhält, und es hat getan. einfach nicht die GameObjects löschen.Kann das GameObject nicht löschen

Warum?

public void Process(){ 
    int user_apple,user_lemon,user_watermelon; 

    user_apple = int.Parse (input_apple.text); 
    user_lemon = int.Parse (input_lemon.text); 
    user_watermelon = int.Parse (input_watermelon.text); 

    Debug.Log (user_apple+" "+user_lemon+" "+user_watermelon); 

    for(int i = players.Count - 1; i >= 0; i--) 
    { if(players[i].name == "Lemon") 
     { 
      if(players[i].GetComponent<Apple>().weight <= user_apple) 
      { Debug.Log ("wat u want"); 
       Destroy(players[i]); 
      }players.RemoveAt(i); 

     } 
    } 
} 

, wenn ich es so setzen waren,

public void Process(){ 
    int user_apple,user_lemon,user_watermelon; 

    user_apple = int.Parse (input_apple.text); 
    user_lemon = int.Parse (input_lemon.text); 
    user_watermelon = int.Parse (input_watermelon.text); 

    Debug.Log (user_apple+" "+user_lemon+" "+user_watermelon); 
    if(players[2].GetComponent<Lemon>().weight <= user_apple) 
    { Destroy(players[2]); 
     players.RemoveAt(2); 
    } 
} 

es Fehler wie haben unter

FormatException: Input string was not in the correct format 
System.Int32.Parse (System.String s) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Int32.cs:629) 
Basket.Process() (at Assets/scripts/Basket.cs:77) 
UnityEngine.Events.InvokableCall.Invoke (System.Object[] args) (at C:/BuildAgent/work/d63dfc6385190b60/Runtime/Export/UnityEvent.cs:110) 
UnityEngine.Events.InvokableCallList.Invoke (System.Object[] parameters) (at C:/BuildAgent/work/d63dfc6385190b60/Runtime/Export/UnityEvent.cs:575) 
UnityEngine.Events.UnityEventBase.Invoke (System.Object[] parameters) (at C:/BuildAgent/work/d63dfc6385190b60/Runtime/Export/UnityEvent.cs:717) 
UnityEngine.Events.UnityEvent.Invoke() (at C:/BuildAgent/work/d63dfc6385190b60/Runtime/Export/UnityEvent_0.cs:53) 
UnityEngine.UI.Button.Press() (at C:/BuildAgent/work/d63dfc6385190b60/Extensions/guisystem/guisystem/UI/Core/Button.cs:36) 
UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at C:/BuildAgent/work/d63dfc6385190b60/Extensions/guisystem/guisystem/UI/Core/Button.cs:45) 
UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at C:/BuildAgent/work/d63dfc6385190b60/Extensions/guisystem/guisystem/EventSystem/ExecuteEvents.cs:52) 
UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at C:/BuildAgent/work/d63dfc6385190b60/Extensions/guisystem/guisystem/EventSystem/ExecuteEvents.cs:269) 
UnityEngine.EventSystems.EventSystem:Update() 
+0

Im Allgemeinen sollten Sie keine Unterstriche in Variablen verwenden. Also sollte es userApple, userLemon und so weiter sein. Sie müssen Ihren Code sorgfältig und korrekt formatieren. Sie können *** niemals Software machen, es sei denn, Sie sind absolut fanatisch in Sachen Formatierung. – Fattie

+0

BTW beachten Sie, dass es nicht so einfach ist, Text in Ints oder Floats zu parsen. Im Wesentlichen können Sie nicht "Parse" verwenden. Sie müssen TryParse verwenden. Es braucht ziemlich viel Arbeit und du brauchst eine Erweiterung. – Fattie

Antwort

1

Dies versuchen die richtige Lösung nicht sein kann, eine Co Aufruf Routine von der Process Function und erhalte die Schleife, so dass sie jeden Frame ausführt.

+0

also muss ich diese Funktion in eine andere Funktion einer anderen Klasse aufrufen, damit es funktioniert? Gibt es ein Beispiel dafür? – whoami

+0

nein!verwenden Sie jetzt wie folgt void Process() {startCourotiune (CProcess); } ienumerator CProcess() {Schleife mit yeild Statemnet} beachten Sie die Syntax und erfahren Sie über Koroutinen und wie sie helfen, Code Frame für Frame ausführen – LumbusterTick

+0

wat bedeutet das? 'Die beste überladene Methodenübereinstimmung für' UnityEngine.MonoBehaviour.StartCoroutine (System.Collections.IEnumerator) 'hat einige ungültige Argumente - Fehler CS1503: Argument '# 1' kann' Methodengruppen'-Ausdruck nicht in Typ 'System.Collections.IEnumerator konvertieren '--error CS0161: 'Basket.CProcess()': Nicht alle Codepfade geben einen Wert zurück ' – whoami

1

Nur um zu wiederholen, was Joe Blow gesagt hat: Es gibt keinen Grund, warum diese for-Schleife nicht funktionieren sollte, da sie völlig unabhängig von Frames/Zeit ist.

Dieses kleine Beispiel funktioniert völlig in Ordnung:
Das Skript ScriptHolder zu einem leeren Gameobject zugeordnet ist (Bildschirm unten) und sieht wie folgt aus:

using UnityEngine; 
using System.Collections.Generic; 

public class ScriptHolder: MonoBehaviour 
{ 
    public List<GameObject> theGameObjects; 

    public void TheButtonFunction(int weight) 
    { 
     for(int i = theGameObjects.Count - 1; i >= 0; i--) 
     { 
      if(theGameObjects[i].GetComponent<TheObject>().objectWeight <= weight) 
      { 
       Destroy(theGameObjects[i]); 
       theGameObjects.RemoveAt(i); 
      } 
     } 
    } 
} 

Alle Gameobjects in die öffentliche Liste gezogen wurden.

enter image description here

Das Skript für die Gameobjects sieht wie folgt aus:

using UnityEngine; 
using System.Collections; 

public class TheObject : MonoBehaviour 
{ 
    public string objectName = ""; 
    public int objectWeight = 0; 
} 

Alle GameObject_AA benannt und haben ein Gewicht von 10 (im Inspektor getan), GameObject_B sind B mit einem Gewicht von 15 und GameObject_C sind C mit einem Gewicht von 20. Spalten sind A bis C von links nach rechts.

Die Schaltfläche ruft die obige Funktion mit dem Wert 15 auf.

Wenn ich auf die Schaltfläche klicke, werden die linke und die mittlere Spalte von Spielobjekten aus der Szene und aus der Liste gelöscht - kein Problem.

+0

ya. Ich habe Coroutine benutzt und es funktioniert super. Vielen Dank – whoami