**寫在前面**:這次所寫的內容是最近在做專案的時候解決的乙個問題,從分析問題到中間各種嘗試再到最後完完全全解決這個問題,花費了我一番功夫。故特意在此記錄下來以便後顧。
raycasthit calaculateraycast(vector3 origin, vector3 direction)
關於返回值rh,這其實是乙個碰撞的資訊陣列,你可以通過它獲取與射線發生碰撞的碰撞器(rh.colloder)但是如果該射線與多個碰撞器碰撞,unity將不保證返回的碰撞器的順序,需要自己乙個個去檢測。那麼接下來就是在兩個球員身上取點了,我們首先提供乙個目標球員的transform介面,為拿球的隊員提供乙個owner介面
//owner owner
//transform passtarget
public bool checktargetpass()}}
return false;
}
這裡我首先計算出direction向量,即利用passtarget.position - owner.transform.position得到。然後可以取拿球隊員身上的胸口(chest),左手(lefthand),右手(righthand)三個點作為原點發射射線並進行阻擋檢測,並對拿到的碰撞資訊陣列rh進行遍歷,如果發現有其他的碰撞器存在,則確認有阻擋存在。至此,該問題的第一部分算是基本解決了。接下來就是下乙個問題,既然我們已經知道被阻擋住了,那麼被擋住的隊員那個方向移動呢?
2.利用二維法向量計算新的移動方向:對於防守隊員來說,擺脫防守最簡單的方法就是沿垂直於兩者連線的方向移動,如圖:
這裡我們又需要注意一點,垂直的方向有兩個,選哪乙個呢?這就可以根據障礙物的位置來選擇了,我們先從目標點到拿球隊員做向量v1,再從原目標點做乙個到障礙物的向量v2,兩個向量的y分量取0,再叉乘,得到乙個y方向的向量,通過y方向的正負就可以判斷v1到v2是順時針還是逆時針從而得到新目標點的方向,至於那條垂直與v1的向量,則可以利用點乘的知識解決,這裡不再贅述。
//owner owner
//transform passtarget
vector3 calculatenewpos()
else
}
上面**裡我以v1為邊做了乙個15度的直角三角形,三角形裡剩下的那個頂點即為新的目標點。至此,問題基本解決。 unity 3d學習筆記
1.日誌輸出 如果需要觀測webplayer執行時輸出的log,則可以在初始化start中加上下面這樣一段 但是此日誌檔案太大,過於冗餘 playersettings.useplayerlog true 2.場景切換 3.資源載入 所有通過resources類載入的資源必須放在名為resources...
筆記 Unity3d初學
今天學了一點物體元件 沒搞懂的 1.capsule mesh filter 選擇需要渲染的模型的樣子 這個功能不清楚是幹嘛的 如果選擇乙個sphere 然後mesh裡選擇capsule,那麼模型是sphere,但是game視窗裡顯示出來的是capsule,這個意義在 如果需要capsule,為什麼不...
unity3D指令碼學習筆記1
1.盡量使用debug.log 語句,而不要使用print 語句 2.注釋 選中,快捷鍵 ctrl alt c 3.初始化函式 awake 在遊戲開始時系統自動呼叫 一般用來建立變數 無論指令碼元件是否被啟用都能被呼叫 start 在所有awake函式執行完之後被呼叫,在update函式執行之前 一...