1. 程式人生 > >Unity使用之預設體&滑鼠事件&剛體&碰撞和觸發事件

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)

碰撞和觸發事件:

碰撞相關的有三個事件:

  1. 碰撞開始時會呼叫一次的事件: void OnCollisionEnter(Collision other) {}
  2. 碰撞結束時呼叫一次的事件: void OnCollisionExit(Collision other) {}
  3. 當碰撞持續發生的時候呼叫: void OnCollisionStay(Collision other) {}

具有Collision和剛體屬性的物件和任何有Collision的物件都會產生一次事件,包括地面。

觸發器相關的三個事件:

  1. 剛剛進入觸發範圍呼叫一次: void OnTriggerEnter (Collider other) {}
  2. 持續待在觸發範圍內會一隻呼叫: void OnTriggerStay (Collider other) {}
  3. 離開觸發範圍呼叫一次: void OnTriggerExit (Collider other) {}