Unity使用之預設體&滑鼠事件&剛體&碰撞和觸發事件
預設體:
預設體能夠使遊戲物件和資源重複使用,相同的遊戲物件可以使用同一個預設體來建立,對預設體進行修改後,所有遊戲物件都會相應改變。
遊戲物件預設體的建立:
在SampleScene中建立一個3D模型,命名player,然後在Assets中建立一個材質球拖到Scene中的player上,最後將SampleScene中的player拖入到Assets中,這樣在Assets中的player就是預設體。可以通過改變剛剛那個材質球來改變預設體的屬性,也可以通過拖拽預設體來在場景中新增相應的player。
預設體指令碼的掛載:
在Assets中Create一個C#指令碼,然後直接拖拽到預設體的屬性面板上即可。同時在預設體中掛載指令碼也會使其他通過預設體產生的player身上掛載上相應的指令碼。
預設體的控制:
在預設體的控制面板中進行設定,都會將對應設定輻射到所有預設體產生的player。
Select:將預設體進行高亮選中;
Revert:將對player的設定還原;
Apply:任意一個預設體產生的player進行設定都是獨立的,當進行Apply操作時就會把這個player的sh設定應用到預設體上,進 而所有通過預設體ch產生的player都會有相應的操作。
使用指令碼動態的建立預設體物件:
首先在專案中新增一個空物件,一般都是可以改名叫GameController,可以掛載不同的指令碼進行遊戲的控制。
用預設體建立物件,首先要獲取這個預設體,要把這個遊戲物件通過公共欄位la來獲取。
public GameObject playerPrefab;
指令碼中會出現一個屬性欄,屬性欄中需要一個Game Object型別的資源,然後直接把player的預設體直接拖拽到這個屬性欄中。
這樣這個指令碼就獲取了相應的預設體。
然後通過Instantiate()方法進行建立物件。
Instantiate(playerPrefab); //將playerPrefab當做預設體進行建立遊戲物件
這種方法建立的遊戲物件都在同一個位置,如果想要建立不同位置的遊戲物件,而且隨機分佈在一個範圍內也是可以的。
Instantiate(playerPrefab, pos, Quaternion.AngleAxis(angle, Vector3.up)); // 預設體物件;建立的初始位置;創建出初始旋轉角度
同時這個方法可以返回一個object的值,我們用GameObject型別進行接收,用as進行轉換。
GameObject p = Instantiate(playerPrefab, pos, Quaternion.AngleAxis(angle, Vector3.up)) as GameObject;
這樣之後p就是一個GameObject型別的物件,可以用之前的Addcomponent等方法。
滑鼠事件:
- 當滑鼠按下時呼叫 void OnMouseDown();
- 當滑鼠取消點選時呼叫 void OnMouseUp();
- 當滑鼠持續按下左鍵時呼叫 void OnMouseDrag();
- 當滑鼠移動到目標內部時呼叫 void OnMouseEnter();
- 當滑鼠離開目標時呼叫 void OnMouseExit();
- 當滑鼠停留在遊戲物件上時呼叫 void OnMouseOver();
- 當像點選按鈕一樣點選遊戲物件(按下不鬆開然後將滑鼠滑出遊戲物件再鬆開 這次操作不使能) void OnMouseUpAsButton();
這個滑鼠事件和Input方法的不同之處主要在目標不同,即滑鼠事件要觸發必須在某一個遊戲物件內進行,但是Input是隻要檢測到滑鼠點選動作進行就會觸發。
剛體:
遊戲物件的剛體屬性是讓物件可以受到力的作用。可以在屬性面板中的Add Component進行搜尋新增。
Mass:質量(相對單位)
Drag:空氣阻力
Angular Drag:角阻力
Use Gravity:是否使用重力
Is Kinematic:是否使用動力學
Interpolate:使用差值 (Interpolate:內差值(通過當前幀的上一幀來推算);Extrapolate:外差值(通過預測後一幀的位置來 推現在))
Collision Detection:碰撞檢測
Constraints:約束(可以凍結不同方向力的作用)
下面這些方法是屬於Rigidbody中的方法,使用之前要用Rigidbody型別的變數來獲取相應元件。
- 給當前遊戲物件新增一個力 AddForce(new Vector3(0f, 10f, 0f))
- 給當前遊戲物件新增力矩/扭矩,可以使物體旋轉 AddTorque(new Vector3(0f, 10f, 0f)
- 給遊戲物件在指定的位置上新增一個力 AddForceAtPosition(new Vector3(0f, 10f, 0f), new Vector3(0.5f, 0.5f, 0.5f))
- 在指定位置新增爆炸力 AddExplosionForce(1500f, Vector3.zero, 4f)
碰撞和觸發事件:
碰撞相關的有三個事件:
- 碰撞開始時會呼叫一次的事件: void OnCollisionEnter(Collision other) {}
- 碰撞結束時呼叫一次的事件: void OnCollisionExit(Collision other) {}
- 當碰撞持續發生的時候呼叫: void OnCollisionStay(Collision other) {}
具有Collision和剛體屬性的物件和任何有Collision的物件都會產生一次事件,包括地面。
觸發器相關的三個事件:
- 剛剛進入觸發範圍呼叫一次: void OnTriggerEnter (Collider other) {}
- 持續待在觸發範圍內會一隻呼叫: void OnTriggerStay (Collider other) {}
- 離開觸發範圍呼叫一次: void OnTriggerExit (Collider other) {}