大家好,我是秦元培,歡迎大家關注我的部落格,我的部落格地址是blog.csdn.net/qinyuanpei。
相信大家在安裝完Unity3D後做的第一件事情一定是瀏覽官方的樣本項目《憤怒的機器人》,這個遊戲在情境渲染及光照陰影特效等方面都有不錯的表現。那麼不知道大家還記不記得這樣一個情境,當玩家操控我們的遊戲角色——機器人時,當機器人靠近遊戲情境中的門時,門會自動開啟,而當機器人離開門時,門會自動關閉。那麼,我們今天就來一起實現這樣一個簡單的功能。通過題目大家一定知道了這個功能的實現是基於Trigger的。Trigger在Unity3D中成為觸發器,當一個碰撞器勾選了isTrigger選項後,即變成了觸發器。觸發器和碰撞器的區別在於碰撞器通過OnCollisionEnter/Stay/Exit()三個方法進行響應且會對參與到碰撞中的物體產生力的作用。而觸發器則通過OnTriggerEnter/Stay/Exit()三個方法來響應且不會對參與到觸發的物體產生力的作用。關於觸發器和碰撞器的內容,大家可以參考這篇文章:http://game.ceeger.com/Components/class-BoxCollider.html
好了,下面請大家跟隨我一起來學習如何在Unity3D中實現基於Trigger的觸發式動畫,首先我們建立如下的情境:
情境中的地面和牆體、門均有Cube構成,這裡我們把地面、牆體的盒子碰撞器全部移除,避免它們對我們的程式產生幹擾。首先我們編寫兩段指令碼來控制門從左向右移動、從右向左移動的動畫:
//開門動畫private void OpenDoorAni() { if(transform.position.x<=1.8F) {transform.Translate(Vector3.right * Time.deltaTime * 1.5F); } }//關門動畫private void CloseDoorAni(){ //等待5秒後再關門,避免角色與門發生碰撞 StartCoroutine("Wait"); if(transform.position.x>=0) {transform.Translate(Vector3.left * Time.deltaTime * 1.5F); }}
代碼基本上很容易理解,就是分別從左向右、從右向左移動門啦!接下來,我們給我們的角色加上一個球體碰撞器並勾選isTrigger選項,為什麼選擇球體碰撞器呢,因為這樣角色進入觸發和退出觸發的時候,都是和門的盒子碰撞器相切的。在關門的時候延遲兩秒是為了給玩家一個控制角色的反應時間,避免和門發生碰撞。這裡要注意的是角色是帶剛體的。
好了,接下來我們編寫觸發這一塊的代碼:
void OnTriggerEnter(Collider mCollider){ Debug.Log(mCollider.gameObject.tag); if(mCollider.gameObject.tag=="Player") { Triggered=true; }}void OnTriggerExit(Collider mCollider){ if(mCollider.gameObject.tag=="Player") { Triggered=false; }} 我們在這裡是通過改變一個bool型的標誌變數來標記角色是否引起了觸發,當引起了觸發的時候執行開門的動畫,退出除了觸發的時候執行關門的動畫。這一部分我們放在Update()方法裡:
void Update () { if(Triggered) { OpenDoorAni(); }else if(!Triggered) {CloseDoorAni(); }}
最後給出全部代碼:
using UnityEngine;using System.Collections;public class AniScripts : MonoBehaviour { //定義門的移動速度public float mSpeed=1.5F;//定義門的標誌變數private bool Triggered=false;void Update () { if(Triggered) { OpenDoorAni(); }else if(!Triggered) {CloseDoorAni(); }}//開門動畫private void OpenDoorAni() { if(transform.position.x<=1.8F) {transform.Translate(Vector3.right * Time.deltaTime * 1.5F); } }//關門動畫private void CloseDoorAni(){ //等待5秒後再關門,避免角色與門發生碰撞 StartCoroutine("Wait"); if(transform.position.x>=0) {transform.Translate(Vector3.left * Time.deltaTime * 1.5F); }}void OnTriggerEnter(Collider mCollider){ Debug.Log(mCollider.gameObject.tag); if(mCollider.gameObject.tag=="Player") { Triggered=true; }}void OnTriggerExit(Collider mCollider){ if(mCollider.gameObject.tag=="Player") { Triggered=false; }}IEnumerator Wait(){//等待5秒在執行yield return new WaitForSeconds(5);}}
一起來看看效果示範吧:
喜歡我的部落格請記住我的名字:秦元培,我的部落格地址是:blog.csdn.net/qinyuanpei
轉載請註明出處,本文作者:秦元培,本文出處:http://blog.csdn.net/qinyuanpei/article/details/24198893