1. 程式人生 > >Unity3D Waypoint (路點)

Unity3D Waypoint (路點)

用於解決給定路線的行走,有很多別名,比如:巡遊、給定路徑。。。。。。最常見的就是塔防類遊戲。


    Unity官方網站上有個非常好的例子,能夠“完美”解決路點的需求。個人按照自己的方法做了個演算法簡化,沒有使用 Quaternion (四元數)這個高深的類。使用的是更加方便的Vector3.


    實現分為兩步。1:路點間的直線行走。2:解決突然轉向的問題,讓轉向平滑。  html5資源下載  

    解決方案1:


        每個Waypoint是一個trigger。角色僅僅向著自己的target方向前進,就是z軸的正方向。運動的方法如下:


        var fMoveSpeed : float = 4.0; // 角色的移動速度


        function Update()


        {


            transform.Translate( 0, 0, fMoveSpeed );  


        }


        多個Waypoint之間的連線形成一條路,儲存所有的Waypoint需要用到陣列


        var aWaypoint : Transform[]; // 路點陣列
html5引擎
  


        將js程式碼作為元件給角色。用 gameObject 的 Cube(就是普通的立方體)作為路點。先在Scene面板內建立所有路點。然後依序拖入角色的 aWaypoint 變數內,這時此變數的長度會自增。問題是拖動的順序必須是路點的順序,萬一錯了就2了。所以可以使用更方便的方法, 在變數下面有個unity提供的變數Size,手動填入路點數量。這時Unity會在下面直接建立填入數量的列表。點選每行最後面的圓圈。會彈出一個面板“Select Transform”,這裡有本場景內的所有物件,如果路點的名字比較給力那麼和陣列元素一一對應新增即可。為了讓路點數量統一,在程式碼裡需要有個陣列長度變數,以便和這個長度相同,放置造成陣列越界。


        var nWaypointNum : int = 0; // 路點的數量


        每個路點設定為Trigger。物件新增Rigibody屬性。然後擴充剛才的程式碼
html5遊戲
  

        var nWaypointNum : int;


        var aWaypoint : Transform[];


        var fMoveSpeed : float;


        private var nTargetWaypoint : int; //下一個路點的索引


        function Start()


        {


            nTargetWaypoint = 0;


        }


        function Update()


        {


            // 這裡使用了一個技巧,就是通過向量減法,算出朝向下一個路點的方向向量。


            transform.forward = aWaypoint[nTargetWaypoint].position - transform.position; // 朝自己的z方向移動。                     transform.Translate( 0, 0, fMoveSpeed * Time.deltaTime );  


        }


        function OnTriggerEnter( go : Collider )


        {


            nTargetWaypoint++;


            Debug.Log(nTargetWaypoint);


            if( nTargetWaypoint >= 4 ) { nTargetWaypoint = 0; }


        } 


    
html5教程
  解決方案2:  


        通過使用 Vector3 類提供的牛x函式來產生平滑的差值 


        static function Slerp (from : Vector3, to : Vector3, t : float) : Vector3  


        from------起始向量


        to------目標向量


        t------取值在0到1之間,如果為0計算出來的向量就和from向量重合,如果為1則和to向量重合。所以這個引數說的直白些就是一個偏向值。(根據測試的實際情況來看,如果t值大於1,則為1,所以當累計便宜大於1也不會出現s型運動)


        為了讓角色有個轉向動畫,那麼必須讓最後的t值每幀都發生改變。 Time.deltaTime 能夠獲得兩幀之間的毫秒時間差,單位為秒。


        與上面不同的程式碼僅如下  


        function Update()


        {


            // 注意第一個引數是 transform.forward ,這就是為什麼前面用z的正方向做朝向原因


            transform.forward = Vector3.Slerp( transform.forward, aWaypoint[nTargetWaypoint].position - transform.position, Time.deltaTime * 10 ); // 朝自己的z方向移動。


            transform.Translate( 0, 0, fMoveSpeed * Time.deltaTime );


        }

相關推薦

Unity3D Waypoint ()

用於解決給定路線的行走,有很多別名,比如:巡遊、給定路徑。。。。。。最常見的就是塔防類遊戲。    Unity官方網站上有個非常好的例子,能夠“完美”解決路點的需求。個人按照自己的方法做了個演算法簡化,沒有使用 Quaternion (四元數)這個高深的類。使用的是更加方便的Vector3.    實現分為兩

unity3d WayPoint,AI

前言 一個簡單的人工智慧WayPoint WayPoint: 遊戲中敵人根據幾個巡邏點自動巡邏,在巡邏過程中,時刻監聽英雄(敵人)和自己距離是否達到追擊範圍(不巡邏,追擊英雄),在追擊過程中,監聽是否達到攻擊範圍(不追擊,攻擊)。 所需物件 當前玩家

unity3d研究1-擊選中物體

鼠標 poi shc obj mouse object count log main 方法1:OnMouseDown()只針對腳本掛載的物體有效 首先,要給 物體加上 碰撞器Collider 然後在物體腳本上加入 void OnMouseDown()//只針對腳

Unity3D-實現連續選兩次返回鍵退出遊戲(安卓/IOS)

Unity3D-連續點選兩次返回鍵退出遊戲 本文提供全流程,中文翻譯。Chinar堅持將簡單的生活方式,帶給世人!(擁有更好的閱讀體驗 —— 高解析度使用者請根據需求調整網頁縮放比例)

Unity3d元件NavMesh Agent

繼承的成員 繼承的變數 enabled 啟用Behaviours更新,禁用Behaviours都沒有。 transform 變換連線到這個遊戲物體(null,如果是沒有連線)。 rigidbody 剛性主體連線到這個遊戲物體(null,如果是沒有連線)。 camera 該相機連線到這個遊戲物體(NULL,如果

Unity3D導航NavMesh——自動尋路過吊橋

Unity中對於尋路導航演算法進行了封裝,支援提交將地圖進行導航烘焙 如果想在兩個不連續的平面之間加一個吊橋,在橋放平時可以使物體通過吊橋,而橋擡起時物體在橋邊等待。 1. 給橋的加一個旋轉中

【Unity】unity3d FingerGestures 單觸控 手勢

FingerGestures最大的好處就是結合unity3d進行多點觸控,手勢識別,編寫一次程式碼 ,通過配置來進行多平臺釋出 FingerGestures提供了3種不同的方法來檢測由使用者執行的拖動手勢。 方法1:使用預設的手勢事件 每個手指的手勢事件:為每個單獨的手

高德地圖的Js API 簡單Demo,可以快速實現描線(摘自官方介面及自行修改測試)

<!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=ed

[Unity3D]A*演算法、導航網格、路徑對比(A-Star VS NavMesh VS WayPoint)

在Unity3d中,我們一般常用的尋路演算法: 1.A*演算法外掛 與貪婪演算法不一樣,貪婪演算法適合動態規劃,尋找區域性最優解,不保證最優解。A*是靜態網格中求解最短路最有效的方法。也是耗時的演算法,不宜尋路頻繁的場合。一般來說適合需求精確的場合。 與啟發式

A*算法、導航網格、路徑對比(A-Star VS NavMesh VS WayPoint)

所有 -s mes 路徑 sta 常用 能夠 unity str 在Unity3d中,我們一般常用的尋路算法: 1.A*算法插件 與貪婪算法不一樣,貪婪算法適合動態規劃,尋找局部最優解,不保證最優解。A*是靜態網格中求解最短路最有效的方法。也是耗時的算法,不宜尋路頻

Unity3d修煉之:遊戲開發中,3d數學知識的練習【1】(不斷更新.......)

turn tor rdo pre 長度 scrip 縮放 unity3d float #pragma strict public var m_pA : Vector3 = new Vector3(2.0f, 4.0f, 0.0f); public var m_pB :

OpenCV探索之(十五):角檢測

回調函數 閾值 source and 類型 幾何 擁有 .com named 角點檢測是計算機視覺系統中用來獲取圖像特征的一種方法。我們都常說,這幅圖像很有特點,但是一問他到底有哪些特點,或者這幅圖有哪些特征可以讓你一下子就識別出該物體,你可能就說不出來了。其實說圖像的特征

Unity3D研究院之將UI的擊事件滲透下去(轉)

一個 響應 http void ons cti ive down point 轉自 http://www.xuanyusong.com/archives/4241 處理UI還有3D模型的點擊推薦使用UGUI的這套事件系統,因為使用起來比較簡潔,不需要自己用代碼來發送射線

POJ 3592--Instantaneous Transference【SCC縮新建圖 &amp;&amp; SPFA求最長 &amp;&amp; 經典】

col describe sca 搜索 hat style ecif test csdn Instantaneous Transference Time Limit: 5000MS Memory Limit: 65536K

我眼中的人人都需要學編程——我的信息之之八

設計時 ogr 大學 電子 class 程序 收費 學生 自己的   近來網絡上開始流行一種說法——“人人都需要學點兒編程”,各種正式的,專業的解釋非常之多,但那些高大上的說明未必人人都能深刻理會,這幾天我在不斷反省自己的編程學習之路時,也領悟到,是的,人人都需要學點編程—

python之_day85_blog 贊與評論

nbsp body 回滾 一個 操作 銀行 賬戶 事務回滾 color 一、事務(transaction)   舉個簡單的例子,在銀行轉賬過程中,我們必須要保證一賬戶余額減少,另一賬戶余額相應增加。但絕對不允許一方余額減少,而另一方賬戶余額沒有相應增加,為了解決這種事情發生

免費公開課-6月27日晚20,Java小白到大牛之

發的 路線圖 內容 優惠 RM 關東升 專題 ++ tex 講師主頁:http://edu.51cto.com/lecturer/701759.html【關東升老師】一個在IT領域摸爬滾打20多年的老程序員、培訓師、作者。移動開發專家,軟件架構師,高級培訓講師,IT作家。參

淺談架構之:單登錄 SSO

用戶體驗 們的 建設 驗證機制 一個 簡單的 用戶登錄 集中 不同 前言:SSO 單點登錄   “半吊子”的全棧工程師又來了,技術類的文章才發表了兩篇,本來想先將主攻的幾個系列都開個頭(Nodejs、Java、前端、架構、全棧等等),無奈博客起步太晚,寫博文的時間又沒有很多

開啟運維之之第 9 篇——Redis單機多叢集

Redis叢集 redis cluster是去中心化,去中介軟體的,也就是說,叢集中的每個節點都是平等的關係,都是對等的,每個節點都儲存各自的資料和整個叢集的狀態。每個節點都和其他所有節點連線,而且這些連線保持活躍,這樣就保證了我們只需要連線叢集中的任意一個節點,就可以獲取到其他節點的資料。

Unity3D BezierCurve繪製曲線】動態新增路徑繪製可調節曲線(三維空間)

近日,專案需求:前提:三維空間 1.動態新增(刪除)路徑點,通過兩個以上的路徑點來繪製曲線,刪除點之後不影響其他點繪製曲線; 2.每個路徑點都可以被拖拽發生位移,可以通過鎖定某個軸,使該軸不發生位移; 3.每個路徑點處有兩個可調節點(首尾只有一個調節點),可通過調節點來調節曲線切線(