2016-07-27 6 views
0

Ich habe ein YouTube-Tutorial über die Herstellung eines Tower Defense-Spiels verfolgt (https://www.youtube.com/watch?v=beuoNuK2tbk) und in einer der Episoden lehrt er dir, wie man einen Gegner einem vorgefertigten Pfad folgen lässt. Das hat gut funktioniert, aber ich wollte meinen Gegner drehen lassen, damit er in die Richtung sehen kann, in die er sich bewegte. Ich versuchte, etwas von dem Code zu verwenden, den er in einem späteren Video zeigte (https://www.youtube.com/watch?v=QKhn2kl9_8I), aber es funktionierte nicht, da ich immer einen Fehler bekam, also suchte ich ein bisschen nach und bekam, was ich für eine Lösung hielt. Ich weiß nicht wie repariere diesen Code, wenn jemand von dir helfen kann, würde das sehr geschätzt werden. Ich verwende Unity in einem 3D-Projekt, wenn das hilft. Dies ist der Fehler, den ich bekomme "Schweregrad Beschreibung Projekt Datei Zeile Unterdrückung Status Fehler CS1503 Argument 2: kann nicht konvertieren von 'UnityEngine.Transform' in 'UnityEngine.Quaternion' Tower Defence.CSharp C: \ Benutzer \ Besitzer \ Dokumente \ Tower Defense \ Assets \ Enemy.cs 27 Aktiv“Wie kann ich meinen Gegner so drehen, dass er einem Wegpunkt in Unity gegenübersteht?

using UnityEngine; 
    using System.Collections; 

    public class Enemy : MonoBehaviour { 

    public float speed = 10f; 
    public float smooth = 2f; 

    private Transform target; 
    private int wavepointIndex = 0; 

    private Object waypoint; 

    void Start() 
    { 
     target = Waypoints.points[0]; 

     InvokeRepeating("nextWaypoint", 0f, 0.5f); 
    } 


    void Update() 
    { 
     Vector3 dir = target.position - transform.position; 
     transform.Translate(dir.normalized * speed * Time.deltaTime, Space.World); 

     transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth); 

     if (Vector3.Distance(transform.position, target.position) <= 0.4f) 
     { 
      GetNextWaypoint(); 
     } 
    } 

    void GetNextWaypoint() 
    { 
     if(wavepointIndex >= Waypoints.points.Length - 1) 
     { 
      Destroy(gameObject); 
      return; 
     } 

     wavepointIndex++; 
     target = Waypoints.points[wavepointIndex]; 
    } 


} 

Antwort

1

Ihr Problem liegt auf dieser Linie: Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth);.

Quaternion.Slerp nimmt Quaternion, Quaternion dann float als Parameter. Sie passieren gerade Quaternion, Transform und float dazu.

target ist als Transform definiert und Sie müssen target.rotation verwenden, um die Quaternion zu erhalten.

Diese Zeile Code sollte geändert werden: Eine weitere Idee

transform.rotation = Quaternion.Slerp(transform.rotation, target.rotation, Time.deltaTime * smooth); 
+0

, die perfekt mit dem Entfernen des Fehlers gearbeitet. Gibt es eine Chance, dass du mir helfen kannst, den Feind zum nächsten Wegpunkt zu machen? Ich habe ein Video aufgenommen, das du sehen kannst, um zu sehen, was ich meine. Das Video: https://www.youtube.com/watch?v=b5baqnWLcys –

+0

@ StephenMynes Ich kam nur, um Ihren Fehler zu beheben. ** REPLACE ** 'transform.rotation = Quaternion.Slerp (transform.rotation, target.rotation, Time.deltaTime * smooth);' mit 'transform.LookAt (target);'. Das sollte das Rotationsproblem lösen. – Programmer

+0

Das war perfekt! Ich danke dir sehr! –

0

wäre Transform.LookAt() zu verwenden.

https://docs.unity3d.com/ScriptReference/Transform.LookAt.html

var lookPos = target.position - transform.position; 
lookPos.y = 0; 
var rotation = Quaternion.LookRotation(lookPos); 
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * smooth); 
+0

Ich habe es versucht, aber der Feind rotierte einige Male nicht genug. Kann ich das irgendwie reparieren? –

+0

Könnte das sein, weil dein Feind den neuen Wegpunkt bekommt, bevor der tatsächliche Wegpunkt erreicht wird? Versucht, den minimalen Abstand zu '0.1f' zu verringern? – Smartis

+0

Es ist immer noch ein bisschen Buggy, aber es wird für jetzt tun, vielen Dank :) –

Verwandte Themen