Jump to content
Unity Insider Forum

Neu in Unity, Feinde erzeugen, Feinde Schaden zufügen, Konstruktoren


Amnesia

Recommended Posts

Hey, bin ganz neu in Unity und wollte ein kleines 2D spiel Entwickeln.

Habe dafür einen Held erstellt und einen Feind den ich beliebig oft Kopieren wollte.

Klasse: Enemy

    public float walkingSpeed;
    public GameObject hero;

    public Image healthBar;
    public static float healthEnemy = 1.0f;
    public static List<GameObject> enemys = new List<GameObject>();


    // Use this for initialization
    void Start () {
        enemys.Add(this.gameObject);
    }

    // Update is called once per frame
    void Update()
    {
        if (hero.transform.position.x + 0.7 < transform.position.x)        // walk
        {
            this.transform.Translate(new Vector2(-walkingSpeed, 0));
        }
        else                                                                // run
        {
            if (hero.transform.position.x < transform.position.x + 0.1)
            {
                this.transform.Translate(new Vector2(-walkingSpeed * 2, 0));
            }
            if (hero.transform.position.x > transform.position.x - 0.1)
            {
                this.transform.Translate(new Vector2(walkingSpeed * 2, 0));
            }
            if (hero.transform.position.y < transform.position.y + 0.1)
            {
                this.transform.Translate(new Vector2(0, -walkingSpeed * 2));
            }
            if (hero.transform.position.y > transform.position.y - 0.1)
            {
                this.transform.Translate(new Vector2(0, walkingSpeed * 2));
            }
        }
        if (Input.GetKey(KeyCode.Q))
        {
            enemys.Add((GameObject)Instantiate(this.gameObject, new Vector2(Random.Range(0.3f, 1.3f), Random.Range(-0.1f, 0.7f)), Quaternion.identity));
        }
    }
 }

Mit Q kann ich zu Testzwecken neue Kopien von dem Feind erzeugen und packe die Feinde dann zusammen in eine Liste.

Jetzt prüfe ich in dem Script für meinen Helden ob ein Feind in der nähe ist.

Wenn ein Feind in der nähe ist und ich "M" drücke, soll der Feind schaden bekommen.

 

Klasse: Hero

 public void fight()
    {
        if (Input.GetKey(KeyCode.M))
        {
            for(int i = 0; i < Enemy.enemys.Count; i++)
            {
                if (Enemy.enemys[i].transform.position.x < this.transform.position.x + 1 )
                {
                    //Hier muss ich auf healthEnemy zugreifen
		//Mein Ansatz: "Enemy.enemys[i].healthEnemy -= 0.01f" funktioniert leider nicht :D
                    
                }
            }
        }
    }

Meine Frage ist, ob das so überhaupt Funktioniert.

Das Problem im Späteren Spielverlauf wird ja sein das ein Feind immer am Leben bleiben muss da ich sonst auch keine neuen erzeugen kann, oder?

 

Falls ich das alles komplett falsch angegangen bin:

würde ich am liebsten, einfach über einen Konstruktor die Feinde erzeugen.

Wie funktioniert das in Unity? kann ich über den Code ein komplettes Objekt erzeugen z.B. mit Sprite, health, Script usw. als Variablen? 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

hey und willkommen ;)

eine wichtige funktion von unity ist das erstellen von prefabs. prefabs sind mehr oder weniger vorlagen von objekten die du erstellt hast, die du beliebig oft kopieren/instanzieren kannst.

du kannst kurz gesagt ein objekt in szene erstellen, es mit komponenten bestücken, werte einstellen und dann ins projektfenster ziehen und hast dann deine "vorlage"

prefabs haben auch noch weitere vorteile, am besten mal in der unity doku nachschauen ;) 

link kann ich grad nit nachschauen

Link zu diesem Kommentar
Auf anderen Seiten teilen

danke für deine Antwort!

Habe mich eben mal informiert, dass würde auf jeden Fall dieses Problem lösen:

"Das Problem im Späteren Spielverlauf wird ja sein das ein Feind immer am Leben bleiben muss da ich sonst auch keine neuen erzeugen kann, oder?"

kannst du mir auch sagen wie ich in dem Script von "Hero" auf "healthEnemy" zugreifen kann?

so ähnlich wie 

"Enemy.enemys[i].healthEnemy -= 0.01f"

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mmhh... deine Überprüfung ob der Gegner in der Nähe ist scheint mir nicht korrekt zu sein [Gegnerposition < Heroposition + 1].
Das bedeutet ja eigentlich, dass der Gegner immer links von dir stehen muss, damit diese Bedingung eintrifft (+ Offset von 1).
Du wolltest wahrscheinlich so etwas wie: |Gegnerposition - Heroposition| <= Distanz

Versuche das mal hinzubekommen oder benutze Vector3.Distance

Falls das dann klappt, könntest du optional dein System umstellen auf Collider/Trigger. Das hat den Vorteil, dass du direkt weißt
welchen Gegner du gerade getroffen hast und musst nicht noch selbst in einer Liste suchen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ja das stimmt.

Ich wollte erstmal probieren ob das so überhaupt funktioniert.

Natürlich müsste ich dann noch die andere Richtung überprüfen.

Aber das eigentliche Problem ist eher, dass ich nicht weiß wie ich auf die Variable healthEnemy zugreifen kann.

Ich habe bis jetzt noch keine Erfahrungen mit Spiele- Engine.

In Java oder C++ könnte man ja einfach einen Konstruktor für Enemy machen der eine Variable health hat und dazu getter und setter programmieren.

In Unity habe ich leider keine Ahnung wie man das machen soll :D

Trotzdem danke für den tipp, werde mich über trigger mal informieren, aber Priorität Nr.1 ist für mich inmoment der zugriff auf healthEnemy ;) 

zu GetComponent<> :

Enemy.enemys[i].GetComponent<Enemy.healthEnemy> -= 0.01f;

 habe ich grade ausprobiert, wenn ich <Enemy.> eingebe findet er auch direkt healthEnemy.

allerdings kommt dieser fehler:


Error    CS0019    Operator '<' cannot be applied to operands of type 'method group' and 'float'
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ach, hab ich total übersehen, dass deine Enemyliste aus GameObjekten besteht, dachte das
wären schon die Komponenten 

Folgendes sollte deinen Fehler beheben:
Enemy.enemys[i].GetComponent<Enemy>().healthEnemy -= 0.01f;

 

EDIT:

Ganz wichtig healthEnemy ist static, macht das lieber schnell mal weg, sonst teilt sich nämlich jeder Gegner
das selbe Leben

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...