[Unity3D]Unity3D遊戲開發之基於Trigger的觸發式動畫設計

來源:互聯網
上載者:User

       大家好,我是秦元培,歡迎大家關注我的部落格,我的部落格地址是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


     

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.