2016-07-27 25 views
0

我一直在YouTube上關於如何製作塔防遊戲(https://www.youtube.com/watch?v=beuoNuK2tbk)的教程,並且在其中的一集中,他教你如何讓敵人遵循預先制定的路線。這工作得很好,但我想讓我的敵人旋轉,讓它朝着它的方向前進。我嘗試使用他在後面的視頻中顯示的一些代碼(https://www.youtube.com/watch?v=QKhn2kl9_8I),但由於我不斷收到錯誤,所以我無法工作,所以我搜索了一下,得到了我認爲是一種解決方案。我不知道如何修正這個代碼,如果你們中的任何人都可以提供幫助,將不勝感激。如果有幫助,我在3D項目上使用Unity。這是我一直收到的錯誤「嚴重代碼描述項目文件行抑制狀態 錯誤CS1503參數2:無法從'UnityEngine.Transform'轉換爲'UnityEngine.Quaternion'Tower Defence.CSharp C:\ Users \ Owner \ Documents \ Tower Defense \ Assets \ Enemy.cs 27 Active「如何讓我的敵人旋轉以面對Unity中的一個航點?

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]; 
    } 


} 

回答

1

您的問題在於此行:Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth);

Quaternion.Slerp需要Quaternion,Quaternion然後float作爲參數。您目前正在將QuaternionTransformfloat傳遞給它。

target定義爲Transform,您必須使用target.rotation來獲得Quaternion

這行代碼應改爲:

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

與消除錯誤完美。有沒有可能幫助我讓敵人面對下一個航點?我錄製了一段視頻,你可以看到我的意思。視頻:https://www.youtube.com/watch?v = b5baqnWLcys –

+0

@StephenMynes我只是來解決你的錯誤。 ** REPLACE **'transform.rotation = Quaternion.Slep(transform.rotation,target.rotation,Time.deltaTime * smooth);''帶''transform.LookAt(target);'。這應該解決旋轉問題。 – Programmer

+0

太完美了!非常感謝! –

0

另一個想法是使用Transform.LookAt()

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

我嘗試了這個,但敵人沒有足夠的旋轉,有沒有什麼辦法可以解決這個問題? –

+0

難道這是因爲你的敵人在到達實際航點之前得到新的航點?試圖將最小距離降到'0.1f'? – Smartis

+0

它仍然是一個小車,但它現在會做,非常感謝你:) –