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[]; // 路點陣列
將js程式碼作為元件給角色。用 gameObject 的 Cube(就是普通的立方體)作為路點。先在Scene面板內建立所有路點。然後依序拖入角色的 aWaypoint 變數內,這時此變數的長度會自增。問題是拖動的順序必須是路點的順序,萬一錯了就2了。所以可以使用更方便的方法, 在變數下面有個unity提供的變數Size,手動填入路點數量。這時Unity會在下面直接建立填入數量的列表。點選每行最後面的圓圈。會彈出一個面板“Select Transform”,這裡有本場景內的所有物件,如果路點的名字比較給力那麼和陣列元素一一對應新增即可。為了讓路點數量統一,在程式碼裡需要有個陣列長度變數,以便和這個長度相同,放置造成陣列越界。
var nWaypointNum : int = 0; // 路點的數量
每個路點設定為Trigger。物件新增Rigibody屬性。然後擴充剛才的程式碼
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; }
}
通過使用 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縮點新建圖 && SPFA求最長路 && 經典】
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.每個路徑點處有兩個可調節點(首尾只有一個調節點),可通過調節點來調節曲線切線(