Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

13.02.2018, 08:03

Aufhebbare Items Herzcontainer Bomben Pfeile nichts funktioniert

Hallo alle zusammen.
Ich stehe bei Unity Scripting ziemlich am Anfang, und habe das Problem meinen Spieler nicht "heilen" zu können.

Ich stecke mitten in einem Game Projekt. Nun habe ich meinen Hauptspieler wie folgt configuriert:

C#-Quelltext

1
    public int health = 5;


so viel mehr ist da derzeit nicht. Der soll zwar noch ein Herzen System bekommen, aber da hab ich im Moment
gleich gar keine Ahnung wie ich das einbinden soll :(

Damit er nun von seinen 5 Lebenspunkten, auch welche "wiederkriegen" kann, habe ich folgendes getan:
1. - ein Object namens "HelathPack" erstellt.
2. - das hat ein (vollkommen uneditiertes) Script, namens Helathpack, normal müßte das auch keine Def brauchen ? ist mir unklar
was da rein sollte.

3. - im Spieler Charakther ,habe ich folgendes eingetragen:

C#-Quelltext

1
2
3
4
5
6
7
void OnTriggerEnter (Collider otherCollider) {
if (otherCollider.GetComponent<HealthPack> () != null) {
            if (health <=4){
            health++;
            Destroy (otherCollider.gameObject);
}
}


Aber der Spieler Char, sammelt weder das Objekt auf, noch wird es zerstört, noch passiert überhaupt irgendwas
(auch dann nicht, wenn Health < 5 4 3 2 ist.

der Collider des Healthpacks ist trigger.

hat jemand eine Ahnung? ohne das mein Charakther neue Herzen, Pfeile oder Bomben aufheben kann, macht das ganze Spiel keinen Sinn :(
Vorsicht! Tante Gretel darf man nicht hänseln.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

13.02.2018, 08:10

Zitat von »https://docs.unity3d.com/ScriptReference/Collider.OnTriggerEnter.html?_ga=2.242582529.2026132678.1518505523-1046526869.1518505523«

OnTriggerEnter is called when the Collider other enters the trigger.

So wie du es gemacht hast, musst du OnTriggerEnter für das HealthPack definieren statt für den Spieler (natürlich den Code entsprechend anpassen, so dass das HealthPack vom kollidierenden Objekt schaut, ob es eine Spieler-Komponente hat, und sich dann selbst löscht). Das HealthPack könnte bei Kontakt mit dem Spieler eine Nachricht an diesen senden, bevor es sich selbst zerstört, damit der Spieler auf das Einsammeln reagieren kann (z. B. Health erhöhen).

3

13.02.2018, 08:20

Uff.

erst mal vielen Dank für die Antwort. Wie gesagt. ich bin vollkommen neu in dem Gebiet, folge grade Toturials und Kursen, bin aber schon
sehr weit gekommen, nur so einiges erschließt sich mir noch absolut nicht :(

Dafür kann man ja fragen.

nun habe ich mein Script wie folgt eingefügt:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HealthPack : MonoBehaviour {



    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
    }

        void OnTriggerEnter (Collider otherCollider) {
        if (otherCollider.GetComponent<player> () != null) {
            if (health <= 4) {
                health++;
                Destroy (gameObject);
                            }
        }
    
    }
}


die Unity Engine belohnt mich jetzt dafür mit unsmassen roten Logs.

1. - unecspectet Symbol, end of file.
2. - health do not exists in this content
3. - the Type of Namespace player is not found

jubel, mann die Anfänge sind immer so herrlich toll :D
Vorsicht! Tante Gretel darf man nicht hänseln.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

13.02.2018, 08:23

Heißt deine Spielerklasse wirklich player, nicht eher Player?
Klar, dass health nicht bekannt ist. Es ist ja eine Member-Variable des Spielers, nicht des HealthPacks.
Du musst dir also das Spieler-Objekt holen (tust du schon mit GetComponent, aber du musst das Ergebnis in einer Variable speichern) und dort das health-Attribut ändern.

5

13.02.2018, 08:26

Ja. Mit dem "Player" hast Du Recht, zumindest sagt er erst mal "blau"; das ist wieder der Fehler, das ich s klein geschrieben habe.
( es ist echt verwirrend, den Einstieg in das C# hinzukriegen )

hm.
Wie kriegt denn das Health vom Player, jetzt eine Variable? Das ist mir unklar.
Der hat ja den public int health = 5;

und wie greife ich da jetzt vom Healthpack drauf zu ?
bzw. wie speicher ich das denn ?

öhm.
Vorsicht! Tante Gretel darf man nicht hänseln.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

13.02.2018, 08:28

C#-Quelltext

1
2
3
4
5
Player player = otherCollider.GetComponent<Player>();
if (player != null)
{
    // player.health ist die Gesundheit des Spielers
}

7

13.02.2018, 08:34

hm.

jetzt sindzwar die Fehler raus, aber passieren tut immer noch nichts.

Irgendwie ralle ich nicht, wie ich auf den Collider zugreife, ist mir fraglich.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HealthPack : MonoBehaviour {




    // Update is called once per frame
    void Update () {

    }
        void OnTriggerEnter (Collider otherCollider) {
        Player player = otherCollider.GetComponent<Player>();
        if (player != null)
        {
            // player.health ist die Gesundheit des Spielers
        }
        if (otherCollider.GetComponent<Player> () != null) 
                
        if (player.health <= 4) {
            player.health++;
        }
                Destroy (gameObject);
            }
    }


player.health nimmt er erst mal.
Theoretisch müßte mein <= 4 auch ok sein (weil bei voller Leiste, soll der Spieler ja nichts dazu bekommen, dann soll das Pack einfach liegenbleiben)

aber was hab ich nun wieder falsch :(
Sicherlich oben die Anfrage: "collider otherCollider" oder ?

entschuldige das ich mich so blöd anstelle :( aber ich bin erst seit 1ner Woche dabei, und wurste mit alles
kompliziert aus YT Toturials + Udemy Kursen zusammen, man muß ja mal anfangen.
Vorsicht! Tante Gretel darf man nicht hänseln.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

13.02.2018, 08:39

Jetzt hast du ein doppeltes if drin und holst die Player-Komponente doppelt. "Collider otherCollider" ist keine Anfrage, das ist der Funktionsparameter.

Ich denke, du gehst falsch an das Ganze heran. Nur mit irgendwelchen Videos lernt man das nicht richtig. Ich empfehle dir, ein vernünftiges C#-Tutorial oder -Buch zu lesen und selber kleinere Dinge auszuprobieren. Also erst einmal C# lernen, unabhängig von Unity. Wenn du die Grundlagen drauf hast, kannst du dich wieder an Unity versuchen. Sonst stolperst du nur von Problem zu Problem, findest irgendwo irgendwelche Code-Schnipsel und verstehst gar nicht, was da abgeht.

9

13.02.2018, 08:44

Hallo David.

ich folge eigentlich Toturials, bei denen man das lernt. ( Aus Büchern lerne ich ganz schlecht)
Wie wäre es denn richtig?

übrigens, das doppelte "if" benutze ich beireits schon 1x.

d.h. z.B. hier:

C#-Quelltext

1
2
3
4
5
6
7
        if (Input.GetMouseButtonDown(1)) {
            sword.gameObject.SetActive (false);
            bow.gameObject.SetActive (true);
            if (arrowAmount > 0)
                bow.Attack ();
            if (arrowAmount > 0) arrowAmount--;
        }


da ansonsten der Pfeileköcher in s Minus geht.
Aber ich habe nirgendwo etwas gefunden, wie ich von einem anderem Objekt aus auf den Spieler
zugreife, danach suche ich seit 3 Tagen.

das Problem ist: dieser "arrowAmount" wird ja "im Spieler" definiert.
Später z.B. brauche ich das ja auch, um z.B. auch Pfeile aufhebbar zu machen. Geholfen wäre mir erst mal wenn das healthPack nun
funktioniert.
Vorsicht! Tante Gretel darf man nicht hänseln.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

13.02.2018, 08:47

Nein, das meinte ich nicht.
Du hast meinen Code einfach reinkopiert ohne ihn zu verstehen.
Mein Code prüft doch schon, ob das GameObject des anderen Colliders eine Player-Komponente hat.
Direkt danach prüfst du das unnötigerweise wieder.
Und du löschst das HealthPack in jedem Fall, auch wenn der Spieler volle Gesundheit hat.

99% deiner Verständnisprobleme haben mit C# zu tun, nicht mit Unity. Darum sollst du erst einmal C# lernen.

Werbeanzeige