Jump to content
Unity Insider Forum

Enemy


Deadfish

Recommended Posts

Guten Tag,

 

da ich von euch gute Hilfe bekommen habe frag ich mal mein nächstes Problem.

Ich habe eine Spinne als feind. Sie kann mich auch angreifen und rennt auch zu mir hin.

 

Aber Sie kann egal, wie weit sie von mir entfernt ist zu mir.

Also das Spiel Startet und alle feinldichen Spinnen rennen egal von welchem Punkt auf mich zu,

weil halt die Distance fehlt in der sich der Spieler aufhalten muss.

 

Wie realisiere ich das den am besten mit der Distance und fals möglich kann man das auch so machendas Sie mich nur angreift wenn sie mich mit den Augen erfast?

 

public class EnemyController : MonoBehaviour
{
private Rigidbody myRB;
public float moveSpeed;
public Playercontroller thePlayer;
private Animation anim;
// Use this for initialization
void Awake()
{
	anim = gameObject.GetComponent<Animation>();
}
void Start()
{

	myRB = GetComponent<Rigidbody>();
	thePlayer = FindObjectOfType<Playercontroller>();
}
void FixedUpdate()
{
	myRB.velocity = (transform.forward * moveSpeed);
}
// Update is called once per frame
void Update()
{
	transform.LookAt(thePlayer.transform.position);
    anim.Play("Run", PlayMode.StopAll);
}
}

 

 

Da ich nicht wusste wie ich das mit der Distance einstelle habe ich zum Testen erstmal gesagt

das er den Spieler suchen soll:

 

thePlayer = FindObjectOfType<Playercontroller>();

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nur angreifen wenn die Distanz unterschritten ist:

 

Benutze eine if Abfrage mit:

https://docs.unity3d.com/ScriptReference/Vector3.Distance.html

 

Nur angreifen wenn sie das Ziel mit den Augen erfasstn kann:

 

Entweder mit einem Blockwinkel:

https://docs.unity3d.com/ScriptReference/Vector3.Angle.html

Hier einfach als 2 Winkel, Blickrichtung der Spinng und die Richtung von der Spinne zum Ziel nehmen

 

Oder mit einem Raycast hit (trifft der Strahl ungehindert den Spieler):

https://docs.unity3d.com/ScriptReference/Physics.Raycast.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du musst auch auf diese Zeile achten, die hast du bei deinem Code nicht genommen.

 

public Transform other;

 

Die Variable other ist vom Typ Transform und public, was nichts anderes bedeutet, als das DU im Inspektor das GameObject deines Spielers oben genannter Variable zuweißen kannst/solltest.

 

Die If-Bedingung ist nicht unbedingt notwendig. Soll heißen, das WENN deine Variable other ein GameObject besitzt, also nicht null ist, DANN soll der Code ausgeführt werden.

 

Und der Code:

 

float dist = Vector3.Distance(other.position, transform.position);
print("Distance to other: " + dist);

 

Macht nichts anderes als durch die Methode Vector3.Distance, die Distanz zwischen deinem der Variable other zugewiesendem GameObject und dem GameObject auf dem das Script liegt, in dem Fall deine Spinne (nehme ich an) zu messen und den Wert in die Variable dist zu speichen. Anschließen wird dist noch ausgegeben.

 

 

EDIT: Vllt noch fürs bessere Verständnis, transform.position macht folgendes:

 

transform, steht für das GameObject, auf dem das Script liegt. und position liefert dir einfach nur wie der Name schon sagt die Position deines GameObject als Vector. Gleiches gilt für other.position.

 

Somit erhält die Methode Vector3.Distance, 2 Vectoren als bsp ist dein Spieler bei Position(0,0,0) und deine Spinne bei Position (2,0,0) dann berechnet die Methode durch ganz simple Vector Berechnung den Abstand.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Voll gut es hat Funktioniert :rolleyes:

 

 

Habe mal noch eine frage dazu, wenn die Spinne tot ist habe ich das jetzt so gemacht das das GameObjekt Zerstört wird kann man

das auch so machen das die Spinne tot auf den Boden Liegt?

 

Noch eine Frage Ich kann die Spinne nicht mit den Animator verknüpfen keine Ahnung wiso,

aber auch egal die SPinne hat Animationen Wie z.b Run

 

anim.Play("Run", PlayMode.StopAll);

 

Aber ich kann nur eine Animation von 7 Auswählen also entweder Run, Attack, Death .......

könnt ihr mir dabei auch noch unter die Arme greifen Bitte?

 

 

if(currentHealth <= 0)
    {
	    GetComponent<Animation>().Play("Death", PlayMode.StopAll);
	    Destroy(gameObject);
    }

 

 

:D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstmal solltest du vom alten Animationssystem auf Mecanim umsteigen - erfordert etwas mehr Einarbeitung, lohnt sich aber.

 

Und anschließend würde ich die ganzen Scripts deaktivieren oder löschen, die bei einem toten Gegner wegfallen. Also Health, KI usw.

Dann nimmst du noch das Destroy(gameObject) weg und das Objekt wird nicht mehr gelöscht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...