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

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

1

17.08.2016, 13:39

Objekt soll mit dem Spieler kollidieren, wenn er einen CharacterController besitzt

Hallo,
ich habe in Unity eine Gegner KI und ein HealthPickup. Der Gegner funktioniert wie ein Zombie, der auf Sichtreichweite agiert und den Spieler dann angreift. Nun hat der Spieler einen CharacterController und der Gegner und das Pickup einen Collider.

Normalerweise hätte ich die Methode

C#-Quelltext

1
void OnTriggerEnter(Collider collision){}


genutzt. Da der Spieler aber eben keinen Collider hat bin ich auf der Suche nach einer Kollisionsprüfung ?(

Das Pickup würde momentan diese Methode aufrufen

C#-Quelltext

1
2
3
4
5
6
7
8
void OnTriggerEnter()
    {
        // Leben auffüllen
        playerManager.health += 20;

        // Pickup entfernen
        Destroy(gameObject);
    }


und der Zombie, sobald er in den Nahkampf geht

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void OnTriggerEnter(Collider collision)
    {
        // Referenz
        playerManager health = collision.gameObject.GetComponent<playerManager>();

        // Schadensverrechnung
        if (health != null)
        {
            health.TakeDamage(damageDone);
        }
    }


Die Doku von Unity spuckt etwas zu "CharacterController.OnControllerColliderHit(ControllerColliderHit)" aus, aber ich glaube nicht, dass es das ist, was ich suche, da die Kollision ja nicht nur während der Bewegung stattfinden soll.

Hat jemand eine Idee für mich :)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

17.08.2016, 14:24

Da der Spieler aber eben keinen Collider hat bin ich auf der Suche nach einer Kollisionsprüfung

Warum?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

3

17.08.2016, 14:29

Falls du wissen willst wieso er keinen Collider hat - weil er den CharacterController hat, dadurch entfernt man den regulären Collider.

Falls du wissen willst wieso ich eine Kollisionsprüfung haben möchte - bei der Kollision soll das Pickup verschwinden und das Leben gefüllt werden, beim Gegner soll der Spieler bei der Kollision Schaden nehmen

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

17.08.2016, 17:31

Puh ich bin mir grad nicht ganz sicher da ich Unity schon länger nicht mehr benutzt habe aber du müsstest dem Spieler doch einen Collider verpassen können, diesen auf Trigger stellen und dann damit arbeiten oder nicht? Zumindest glaube ich habe ich das damals so gemacht.

edit: http://answers.unity3d.com/questions/250…-collision.html
gefunden mit: http://bfy.tw/7GE1. Google ist ein mächtiges Werkzeug ;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

5

18.08.2016, 14:59

Nein, Google hatte ich auch genutzt, aber wie gesagt ich war mir nicht sicher, ob ich die Prüfung vom Spieler abhängig mache. Ich hatte eher gehofft, die Funktionalität den einzelnen Objekten zuzuweisen. Weil mir erscheint es als seltsam in einem Spielerskript zu schreiben "Wenn ich kollidiere und das Objekt ist A oder B oder C oder ...", das müsste ja auch besser gehen :)

Und daher dachte ich, dass jedes Objekt das selber macht. So eben die Pickups.
Bei den Pickups hat es ausgereicht, den Collider auf isTrigger zu stellen, die Methode greift dann einwandfrei.

Und genauso möchte ich erreichen, das jeder Gegner (der ja sein eigenes Skript hat), wenn er auf den Spieler zuläuft, die HP des Spielers reduziert, sobald er mit ihm kollidiert. Nur leider klappt es da nicht mit dem isTrigger ;)

Mein Gedankengang war durch die Methode

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void OnTriggerEnter(Collider collision)
    {
        // Referenz
        playerManager health = collision.gameObject.GetComponent<playerManager>();

        // Schadensverrechnung
        if (health != null)
        {
            health.TakeDamage(damageDone);
        }
    }


Das kollidierende Objekt zu finden, auf die HP des Spielers zuzugreifen und diese zu reduzieren. Sicherlich habe ich deinen Link schon gesehen und viele viele andere Links auch, ich weiß, dass dies sehr oft im Netz zu finden ist :)

Möchte mich wie gesagt nur nicht auf den Spieler fixieren sondern lieber jedes Objekt selber regeln lassen... Aber was weiß ich schon .. :D

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

6

18.08.2016, 15:22

Kleiner Nachtrag, hatte eine passende Stelle gefunden, muss das Ganze aber auf den Spieler fokussieren ...

Der Spieler feuert die Methode und spricht dadurch die Methode des Gegners an

C#-Quelltext

1
2
3
4
void OnControllerColliderHit(ControllerColliderHit collision)
    {
        collision.transform.SendMessage("DealDamage", SendMessageOptions.DontRequireReceiver);
    }


der dann diese Aufruft

C#-Quelltext

1
2
3
4
5
6
7
8
9
void DealDamage()
    {
        PlayerHealth health = GetComponent<PlayerHealth>();

        if (health!= null)
        {
            health.TakeDamage(damageDone);
        }
    }


Das funktioniert aber leider nur halb. Stellt man sich zum Gegner und dieser läuft auf den Spieler zu, verursacht er keinen Schaden, zumindest meldet sich die Konsole nicht. Bewegt man sich danach oder springt auf den Gegner, so kollidieren sie dann permanent (logisch).

Als Spieler habe ich erst einmal nur eine Kapsel und der Gegner ist ein Würfel. Vielleicht verhält es sich ja bei Modellen anders ?(

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

19.08.2016, 12:46

Als Spieler habe ich erst einmal nur eine Kapsel und der Gegner ist ein Würfel. Vielleicht verhält es sich ja bei Modellen anders

Nein.
Allgemein ist das ein Fall für den Debugger. Und musst du wirklich eine Nachricht senden? Ich meine die onCollision/onTrigger Methoden werden immer in beiden Objekten gefeuert. An sich scheinst du aber grundlegend mit dem Eventsystem Probleme zu haben. Vielleicht solltest du falls ein Buch vorhanden ist nach einem passenden Kapitel dazu suchen oder mal bei Youtube/Google nach Tutorials zum Eventsystem in Unity gucken.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

8

19.08.2016, 21:47

Also ich habe durch das Debuggen rausgefunden, dass einzig und allein meine Referenz zum HP Skript fehlerhaft ist. Das Objekt ist null.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Start()
{
        PlayerHealth health = GetComponent<PlayerHealth>();
}

void Attack()
    {
        // In den Nahkampf gehen
        transform.Translate(Vector3.forward * bewegungsgeschwindigkeit * Time.deltaTime);

        // Schadensverrechnung
        if (health != null)
        {
            health.TakeDamage(damageDone);
        }
    }


Das HP Skript ist überschaubar...

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class PlayerHealth : MonoBehaviour {

    public static float health = 100;
    public Slider healthBar;

    public void TakeDamage(float damageDone)
    {
        // Schadensverrechnung
        health -= 5;
        healthBar.value = health;
        // Objekt bei 0 HP zerstören
        if (health < 1)
        {
            Destroy(gameObject);
        }
    }
}


Ich hole mir das Script während der Startmethode, dennoch geht er in den else-Fall, da das Objekt null ist, was mich wundert ?(

Bin ich blöd? Ich sehe den Fehler echt nicht ..

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

9

20.08.2016, 11:32

Hallo... kleiner Nachtrag.
Lösung des Problems war, dass ich nicht wusste, dass ein Skript eines Objektes nicht ohne weiteres auf ein Skript eines anderen Objektes zugreifen kann. Der Gegner kommt also nicht an die Lebenspunkte des Spielers ohne vorher das Spielerobjekt angesprochen zu haben ..

Also quasi

C#-Quelltext

1
2
3
4
5
6
public GameObject player;

void Attack()
{
playerHealth health= player.GetComponent<playerHealth>();
}


Joa das wars schon :)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

20.08.2016, 15:33

Na so wie das oben aussah hat du GetComponent auf dir selbst aufgerufen und da bekommst du natürlich keine Skripte von anderen Objekten sondern nur vom aktuellen. Kann ja auch nicht anders gehen. Dein Code kann ja schlecht raten was du möchtest :)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige