天天看點

U3d之實體引擎(下)

如果對你有幫助,請做一棵蒲公英,讓知識随風飄蕩留在人的心裡。

1. 觸發事件

要想判斷一個角色是否在某個空間區域,除了直接計算Transform元件的position值外,還可以怎麼做呢?

我們可以把對象身上的XXX Collider觸發器上勾選Is Trigger選項!

觸發器事件執行的條件:兩個物體上都要帶碰撞器,至少帶有一個剛體,并且兩物體至少有一個把觸發器打開。

觸發器有哪些回調方法呢?

OnTriggerEnter(Collision other)代表進入觸發器的時候調用一次

OnTriggerStay(Collision other)代表停留在觸發器的時候持續調用

OnTriggerExit(Collision other)代表離開觸發器的時候調用一次

U3d之實體引擎(下)

作為回調方法的參數 other對象則是進入碰撞體的一方。

2. 實體材質

在Project視窗中點選右鍵Create->Physic Material建立實體材質

Dynamic Friction為動态摩擦力系數,範圍0-1之間。

Static Friction為靜态摩擦力系數,範圍同上。

Bounciness反彈系數,範圍同樣是0-1.(這裡有個有趣的現象,估計牛頓老人家的棺材闆要壓不住了呢,如果你在場景中建立一個物體,把它的反彈系數最大化,然後添加剛體使用重力,提起一個高度讓它自然下落到一個同樣有反彈系數最大的平面上,你會發現它不僅會像永動機一樣跳動,還會越來越高,直至突破天際,大家想想這是為什麼呢?)

當我們設定好了實體材質後,我們可以把做好的實體材質拖到Collider上的Material上使用,是不是很簡單很友善呢?

3. 射線

我們再來思考一個問題,如何實作物體的移動到滑鼠點選的位置呢?

這裡我們來說說Unity提供的射線機制:通過虛拟射線檢測所碰撞的物體(這個射線是看不到的,但是可以調試出結果)

Ray作為射線類,可以直接建立一條射線Ran ran = new Ray();

我們來看看他的兩個屬性,origin與direction,前者是發射的原點,後者則是發射的方向。

使用實體類Physics的Raycast方法可以實作射線碰撞檢測功能

Physics.Raycast(Ray ray,out RaycastHit hit);其中的一種重載形式

傳回值是bool值,是以我們可以判斷是否射到了某些物體或圖層

這裡要來講解一些實體引擎上篇的一個小問題

我們滑鼠點選的點在U3D的世界裡是三維的,那麼我們的電腦螢幕是二維的,如何告訴電腦我們所點選坐标的Z軸呢?這裡我們可以先手動實作一下,再看引擎給我們提供的方法。

Vector3 pos = input.MousePosition;

pos = new Vector3(pos.x,pos.y,Camera.main.transform.position.z);

pos = Camear.main.ScreenToWorldPoint(pos);

但是我們如果每次都這樣寫豈不是很麻煩?那我們來看看系統的方法

Ray ray = Camera.main.ScreenPointToRay(input.mousePosition);一句話搞定,但是效果是一樣的,大家可以了解下原理。

繼續閱讀