如何让我的敌人旋转以面对Unity中的航点?

时间:2016-07-27 09:44:00

标签: c# unity3d

我一直在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"

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


}

2 个答案:

答案 0 :(得分:1)

你的问题出在这一行:Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth);

Quaternion.Slerp接受QuaternionQuaternion,然后float作为参数。您目前正在将QuaternionTransformfloat传递给它。

target定义为Transform,您必须使用target.rotation获取Quaternion

该代码行应更改为:

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

答案 1 :(得分: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);