Deadfish Geschrieben 22. August 2016 Melden Share Geschrieben 22. August 2016 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 More sharing options...
Mark Geschrieben 22. August 2016 Melden Share Geschrieben 22. August 2016 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 More sharing options...
Sascha Geschrieben 22. August 2016 Melden Share Geschrieben 22. August 2016 Ich kann empfehlen, alles drei zu kombinieren. Alternativ kann man einen Trigger für die ersten beiden bauen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Deadfish Geschrieben 22. August 2016 Autor Melden Share Geschrieben 22. August 2016 Also erlich gesagt verstehe ich das nicht ganz . if (other) { float dist = Vector3.Distance(other.position, transform.position); print("Distance to other: " + dist); also wie so "other.position" sollte da nicht ein ein Wert stehen ? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Damon93 Geschrieben 22. August 2016 Melden Share Geschrieben 22. August 2016 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 More sharing options...
Deadfish Geschrieben 23. August 2016 Autor Melden Share Geschrieben 23. August 2016 Super danke, für die erklärung werde es die Tage ausprobieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Deadfish Geschrieben 26. August 2016 Autor Melden Share Geschrieben 26. August 2016 Voll gut es hat Funktioniert 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); } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 26. August 2016 Melden Share Geschrieben 26. August 2016 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 More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.