1. 程式人生 > >Unity中自動尋路的幾種方法(三)

Unity中自動尋路的幾種方法(三)

    現在的大部分mmo遊戲都有了自動尋路功能。點選場景上的一個位置,角色就會自動尋路過去。中間可能會有很多的障礙物,角色會自動繞過障礙物,最終達到終點。使用Unity來開發手遊,自動尋路可以有很多種實現方式。第一種比較傳統的是使用A星尋路,它是一種比較傳統的人工智慧演算法,在遊戲開發中比較常用到。大部分的頁遊和端遊都用到這種技術。在Unity遊戲也可以用這種技術,Asset Store上面已經有相關的元件了,感興趣的同學可以自己去了解。我在後面有機會再來詳細介紹了。今天我們來學習Unity官方內建的尋路外掛-Navmesh。由於內容比較多,我們將分幾次來系統學習。今天先通過學習一個最簡單的例子來入門。

  • 例項
我們要實現一個功能:點選場景中的一個位置,角色可以自動尋路過去。角色會繞過各種複雜的障礙,找到一條理論上”最短路徑“。
  • 步驟
1.建立地形
2.新增角色
3.建立多個障礙物,儘量擺的複雜一點,來檢查Navmesh的可用性和效率。
4.選中地形,在Navigation視窗中,設定Navigation Static

5.依次選中障礙物,在avigation視窗中,設定Navigation Static
7.Navigation視窗中,選擇Bake(烘焙)介面,點選Bake按鈕,程序場景烘焙,就可以烘焙出尋路網格了
8.為角色新增NavMeshAgent元件。Component->Navigation->Nav Mesh Agent

9.為角色新增一個指令碼PlayerController.cs,實現點選目標,自動尋路功能
using UnityEngine;
using System.Collections;

//Author:[email protected]
public class PlayerController : MonoBehaviour
{
    private NavMeshAgent agent;


    void Start()
    {
        //獲取元件
        agent = GetComponent<NavMeshAgent>();
    }


    void Update()
    {
        //滑鼠左鍵點選
        if (Input.GetMouseButtonDown(0))
        {
            //攝像機到點選位置的的射線
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                //判斷點選的是否地形
                if (!hit.collider.name.Equals("Terrain"))
                {
                    return;
                }
                //點選位置座標
                Vector3 point = hit.point;
                //轉向
                transform.LookAt(new Vector3(point.x, transform.position.y, point.z));
                //設定尋路的目標點
                agent.SetDestination(point);
            }
        }


        //播放動畫,判斷是否到達了目的地,播放空閒或者跑步動畫
        if (agent.remainingDistance == 0)
        {
            animation.Play("idle");
        }
        else
        {
            animation.Play("run");
        }
        
    }
}

完成了,可以看看效果:


  • 相關知識
1.角色身上的Nav Mesh Agent 元件

Radius 半徑: 代理的半徑(僅用於尋路目的,可以跟實際物件的半徑大小不一樣,一般比實際物件的半徑大)。
Speed 速度: 代理可以周遊世界,走向它的目的地的最大移動速度。
Acceleration 加速度: 最大加速度。
Angular Speed 角速度: 最高轉速(度/秒)。
Stopping distance 制動距離:制動距離。到目的地的距離小於這個值,代理減速。
Auto Traverse OffMesh Link 自動遍歷OffMesh連結:自動移動並關閉OffMeshLinks
Auto Repath 自動重新尋路:如果現有的部分已失效,獲得新的路徑。
Height 高度:代理的高度(用於除錯圖形)。
Base offset 基本偏移:碰撞幾何體相對於實際幾何體垂直的偏移。
Obstacle Avoidance Type 障礙躲避型別 :躲避的質量水平。
NavMesh Walkable 導航網格行走:指定代理可以遍歷的導航網格層型別。這個引數很有用,在接下來的例項中可以用到

2.障礙物一定要有Mesh Render,用於烘焙尋路網格。

  • 總結
這個例項可以很簡單的讓我們學會如何最基本的使用自動尋路元件Nav。但是,這個元件還提供了更加強大的功能,比如,起始點和目標點中間出現阻斷了,
怎麼辦?在下面的文章中,我們將會繼續探尋其他強大的功能。
  • 原始碼
  • 參考資料

1.http://www.xuanyusong.com/

2.http://liweizhaolili.blog.163.com/

3.http://game.ceeger.com/Components/class-NavMeshAgent.html


相關推薦

Unity自動方法

    現在的大部分mmo遊戲都有了自動尋路功能。點選場景上的一個位置,角色就會自動尋路過去。中間可能會有很多的障礙物,角色會自動繞過障礙物,最終達到終點。使用Unity來開發手遊,自動尋路可以有很多種實現方式。第一種比較傳統的是使用A星尋路,它是一種比較傳統的人工智慧演算

Android 實現滑動的方法scrollTo 與 scrollBy

scrollTo(x,y): 表示移動到一個座標點(x,y) scrollBy(dx,dy) : 表示移動的增量為dx,dy 如果在ViewGroup中使用scrollTo和scrollBy,那麼移

Unity自動方法

在遊戲製作中,我們經常會用到角色自動尋路這個功能,點選小地圖或者場景中的某一處時,角色會自動走向目的地,並且自動避開期間的障礙物。不單單在遊戲的製作中用得到這個功能,在虛擬現實的專案中同樣有時候會需要這樣的功能。 在Unity中,有多種方法能夠實現尋路的功能,我試用的有以下

Unity新增元件的方法

一、在編輯器上面新增一個元件。   二、在指令碼中利用AddComponent函式新增一個元件,例如: GameObject player; player.AddComponent<PlayerManager>();   三、利用Re

Html嵌套其他HTML文件的方法

java mar net rip gin bsp ace wid style 給大家整理了3個方法,一個是HTML的iframe標簽,別兩個是JS引用。比如要在arr.html文件裏引用index.html文件,方法如下。 HTML引用方法: <iframe na

[PyTorch]PyTorch模型的參數初始化的方法

plane alt align frame nor view tps class normal ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~本文目錄1. xavier初始化2. kaiming初始化3. 實際使用中看到的初始化3.1 ResN

安卓讀取xml的方法有你不知道的

1.src目錄下,用反射機制載入:Thread.currentThread().getContextClassLoader().getResourceAsStream("xxoo.xml"),以流的方式返回 2.Assest目錄下:Activity.this.getAsse

Spring在代碼獲取bean的方式

mxml get text spa 回調 獲取對象 ati -s null 獲取spring中bean的方式總結: 方法一:在初始化時保存ApplicationContext對象 1 ApplicationContext ac = new FileSystemXml

css垂直居中方法

play spa light dex bsp png ava ems pre 方法1:table-cell .box1{ display: table-cell; vertical-align: middle; text-a

sq優化的方法

總結 war 事務 復合 情況 放棄 arc 應該 查詢語句 在sql查詢中為了提高查詢效率,我們常常會采取一些措施對查詢語句進行sql優化,下面總結的一些方法,有需要的可以參考參考。 1.對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by

盒子水平垂直居中的方法

div盒子水平垂直居中的方法 一、盒子沒有固定的寬和高 方案1、Transforms 變形 這是最簡單的方法,不僅能實現絕對居中同樣的效果,也支援聯合可變高度方式使用。內容塊定義transform: translate(-50%,-50%) 必須加上

ABAP內表匯出為EXCEL格式的方法

目錄 正文  這是一篇轉載文章,本人修改了其中的幾個錯字病句 內表資料下載到EXCEL的幾種方法 1. 函式: GUI_DOWNLOAD   這是一種最基本的方法,對應 CLASS: CL_GUI_FRONTEND_SERVICES 的方法 GUI_DOWN

結構化大資料計算的方法

         任何資料都要通過計算來產生價值才有意義,大資料也一樣。結構化大資料的計算能力的高低決定了大資料的實用性。          我總結了幾種常見的計算方法:API 、Script、SQL、類SQL。        1、  API:這是指沒有使用JDBC或OD

【多執行緒】實現執行緒同步的方法

前言 最近小扁我被問到 實現執行緒同步有哪幾種方法,而我只知道使用同步關鍵字synchronized來實現而已(⊙o⊙),,所以有必要來學習一下實現執行緒同步的幾種方法;各位看官,若有非議(不接受反駁),請不吝賜教! 實現執行緒同步的幾種方法 從我自己

java-上下文以及獲取Spring的ApplicationContext的方法整理

起因是睡覺的時候,我在想如果被面試問道:“你知道怎麼可以獲取上下文嗎?”這個問題我感到很模糊,之前也寫過獲取上下文,但是記得好像有好幾種方法,覺得有點混淆了,所以就想自己好好整理下。 網上搜集的context上下文的幾種解釋: 一: Context上下文主要用來從上

Android實際開發的bug總結與解決方法

使用BitmapFactory.Options設定inSampleSize就可以縮小圖片。屬性值inSampleSize表示縮圖大小為原始圖片大小的幾分之一。如果知道圖片的畫素過大,就可以對其進行縮小。 那麼如何才知道圖片過大呢? 方法是:使用BitmapFactory.Options設定inJust

Unity移動物體的常用方法

簡介:在unity3d中,有多種方式可以改變物體的座標,實現移動的目的,其本質是每幀修改物體的position。1. 通過Transform元件移動物體     Transform 元件用於描述物體在空間中的狀態,它包括 位置(position),

css元素居中的方法

ie9 技術 row 也會 高度 通過 寬高 內容 ati 對於在網頁端布局,垂直居中難於水平居中,同時實現水平和垂直居中是最難的。在移動端,因為設備的寬高是可變的,故一些方案很難實現。以下使用幾種方案對下面的html去實現居中,如有不足,可以提出寶貴的意見: <di

lua模擬“continue”的方法

版本 條件 bsp col div then 註意 退出 repeat 使用repeat循環包住需要要continue跳過的代碼,使用break跳出循環, 需要註意的是,lua中的repeat語句,在循環條件為真的時候退出 1 for i = 1, 10 do 2

在CentOS7.4安裝jdk的方法及配置環境變量

HR 環境 -o OS 安裝jdk 加載類 軟件包 上傳 jre_home 一、下載jdk jdk下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html