日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

WayPoint寻路

發布時間:2023/12/19 综合教程 49 生活家
生活随笔 收集整理的這篇文章主要介紹了 WayPoint寻路 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

尋路在游戲開發中的重要性,不用多說了。從大型ARPG游戲到小規模體驗游戲,都會不同程度的用到尋路功能。

塔防類游戲,戰棋類游戲經常用到waypoint(路徑)尋路。

下面我們來介紹一下waypoint尋路。

1.Path(路徑)的設計。

圖中每一個藍色的Cube表示一個路徑點(WayPoint),由7個waypoint構成path;

Path.cs代碼如下:

using UnityEngine;
using System.Collections;

public class Path : MonoBehaviour {
    public WayPoint[] wayPoints;
    public ArrayList points;   //存儲wayPoints的transform.position屬性

    // Use this for initialization
      void Awake()
    {
        //print("path");
        points = new ArrayList();
        for (int i = 0; i < wayPoints.Length; i++)
        {
            points.Add(wayPoints[i].transform.position);
        }
    }

    //判斷是否有下一個路徑點
    public bool HasNextPoint()
    {
        //points實例化過,并且存在N個路徑點
        if (points!=null && points.Count>0)
        {
            return true;
        }
        return false;
    }

    public Vector3 GetNextPoint()
    {
        if (points!=null && points.Count>0)
        {
            Vector3 p=(Vector3)points[0];
            points.RemoveAt(0);
            return p;
        }
        return Vector3.zero;
    }
}

為需要移動的物體或者人物創建WayPointAI

WayPointAI代碼如下

using UnityEngine;
using System.Collections;

public class WayPointAI : MonoBehaviour
{
    public Path path;
    private Vector3 pos;
    private float rotateSpeed = 10f;
    private float moveSpeed = 5f; 
    // Use this for initialization
    void Start()
    {
        if (path!=null && path.HasNextPoint())
        {
            pos = path.GetNextPoint();
        }
    }

    // Update is called once per frame
    void Update()
    {
        bool reached = MoveToTarget(pos);
        if (reached==true && path!=null && path.HasNextPoint())
        {
            pos = path.GetNextPoint();
        }
    }
    bool MoveToTarget(Vector3 point)
    {
        //只在XZ平面上移動,消除鼠標點擊對Y軸的偏移,保持transform.y
        Vector3 pointR = new Vector3(point.x, transform.position.y, point.z);
        //Quaternion插值 物體朝向目標點平緩轉向
        Quaternion wantedRot = Quaternion.LookRotation(pointR - transform.position);
        transform.rotation = Quaternion.Lerp(transform.rotation, wantedRot, rotateSpeed * Time.deltaTime);
        //使用插值當物體到達目標點以后,會有抖動現象,在point處消除抖動
        float distance = Vector3.Distance(pointR, transform.position);
        if (distance < 0.05f)
        {
            return true;    //到達point
        }
        //向目標點移動
        Vector3 direction = (pointR - transform.position).normalized;
        transform.Translate(direction * moveSpeed * Time.deltaTime, Space.World);
        return false;
    }

}

總結

以上是生活随笔為你收集整理的WayPoint寻路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。