Jump to content
Unity Insider Forum

C# KI - Auf Variablen eines GameObject zugreifen?


Tiwaz

Recommended Posts

Moin moin,

 

Ich hab mir mal das Text Tutorial von Marrrk durchgelesen und bin auf folgende Methode für die KI gestoßen:

 


void SearchTarget()
{
	var enemies = GameObject.FindGameObjectsWithTag(EnemyTag);
	var enemiesSortedByDistance = enemies.OrderBy(enemy => Vector3.Distance(transform.position, enemy.transform.position));

	Target = enemiesSortedByDistance.FirstOrDefault();
}

 

An und für sich find ich die Methode sehr gut und sie tut auch wunderbar was sie soll (hab sie zudem um einige Features erweitert), allerdings würd ich gerne auf die Variablen des Targets zugreifen können.

Z.B. möchte ich sehen können wie schnell mein Target gerade ist oder wie viele HP es noch hat. (Ist in 2 unterschiedlichen Scripten definiert)

 

Dazu hätte ich spontan etwas geschrieben wie

 

public Destructable target; // In "Destructable" sind die HP gespeichert

SearchTarget();
(...)
if(target.destructableTarget.currentHealthPoints <= 0){
(do something)
}

 

Allerdings kann ich so ja leider nicht die Methode "FirstOrDefault()" auf ein "Destructable" Objekt anwenden und somit die Liste nicht sortieren.

Ich möchte hald wie gesagt auf die Target-Attribute von mehreren Scripten zugreifen können bzw. sie auslesen.

 

Weiß da jemand wie ich die Anforderung erfüllen kann?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du kannst ausgehend von einem Script immer das dazugehörige GameObjekt bekommen und darauf kannst du wiederum GetComponent oder GetComponentInChildren aufrufen, damit kommst du prima an Scripte am gleichen GameObjekt oder an Scripte am gleichen und untergeordneten GameObjekten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kannst du noch kurz sagen auf welches GameObject und in welchem Script ich das anwenden muss?

 

public GameObject target;

target = GetComponent<Destructable>();

geht ja z.B: nicht..

 

Ich hab auch 2 GameObjects falls das nen Unterschied macht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Entweder kann ich einfach kein JavaScript lesen, ich bin grade viel zu übermüdet um es zu verstehen oder es bietet grade nicht das was ich suche ^^

 

Ich konkretisier mal was ich suche:

 

Objekt A ist die KI und will ein Ziel finden.

Objekt B hat eine Destructable und Controller Komponente und ist ein valides Ziel(enemyTag), wird auch gefunden und als Target gelockt.

Objekt A soll nun die momentanen HP und die aktuelle Geschwindigkeit von Objekt B lesen können.

Im Idealfall zerstört Objekt A Objekt B und soll sich nun ein nächstes Ziel suchen.

 

Will auch, dass die KI gegeneinander kämpfen kann und wenn ich gerade mein Schiff gewechselt hab oder eben die KI gegeneinander kämpfen soll, finden die Gegner ja nix nicht mehr mit GameObject.Find(); weil es ja anders heißt.. oder?

Sollen keine Massenschlachten werden aber wenn ich eine Mission hab wo ne Hand voll Begleiter dabei sind, sollen die Gegner auch sie ins Visier nehmen können.

 

Wichtig dabei ist hald, dass ich die .FirstOrDefault() oder eine äquivalente Methode ausführen kann damit ich auch das ideale Ziel zuweisen kann.

 

Falls ihr mir das grade dauernd erklären wolltet tut mir Leid, ich schau's mir morgen nochmal an wenn ich bisschen geschlafen hab ^^

 

@edit:

 

Es reicht ja wenn ich irgendwie eine Liste oder ein Array anlegen könnte mit allen potenziellen Zielen und ich diese nach Distanz sortieren könnte. Weiß aber grad nich wie, ich tüftelt noch bisschen dran, vllt weiß ja einer vor euch ne Lösung dafür ;)

Es hapert grade bei mir daran wie ich die gefundenen Ziele in die Liste speichern kann ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du das Tutorial so gemacht hast wie beschrieben können dass die Schiffe schon automatisch, einfach einen AIController drauf und alles korrekt setzen dann sollte es funktionieren.

 

Im Original habe ich Target als GameObjekt gehabt, daran kannst du dann wie gesagt GetComponent<Destructable>() und Co ausführen. Im Destructable Fall bekommst du somit die aktuellen HP.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ahh.. jetz steig ich dahinter ^^ hab nie kapiert wie ich die GetComponent Methode auf das target aufrufen soll :D

 

praktisch target.GetComponent<Destructable>().currentHealthPoints;

 

funktioniert, super vielen Dank ^^ ich glaub mir hat der wenige Schlaf nich gut getan, lag ja eig auf der Hand...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...