Unity3D遊戲開發之傷害數值顯示

       衆所周知,在RPG遊戲策劃中最爲重要的一個環節是數值策劃。數值策劃是一個關於遊戲平衡方面的概念,它是一種非常深奧的概念。遊戲從某種意義上 是多種選擇的組合,因此如果一個遊戲失去平衡,那麼就會減少選擇而影響遊戲的樂趣。數值策劃人員通常需要按照一定的規則和方法將整個遊戲系統的相關數值調整到一個合適的範圍,以確保玩家可以有更多地選擇以增強遊戲的可玩性。數值策劃是近年來國內遊戲行業從國外遊戲業引申過來的一個概念,我們在學習遊戲設計的過程中,除了專注於技術上的實現以外,還應該對遊戲設計中的相關理論有所瞭解。關於數值策劃的詳細內容,大家可以從這裏瞭解:http://baike.baidu.com/view/1756429.htm

      下面我們開始今天的Unity3D技能培訓。 我們學習Unity3D培訓目標:讓U3D初學者可以更快速的掌握U3D技術,自行製作修改素材,可以獨立完成2D、3D小規模遊戲及網頁遊戲開發。

       Unity3D遊戲開發之傷害數值顯示。如圖所示,是一部遊戲《血雨前傳:蜃樓》。這部遊戲雖然脫離了前兩部作品回合制的模式,以爽快的ACT橫版過關模式再次進入玩家的視野中,但是相信只有真正玩過這個遊戲的人才知道這是一部地地道道的RPG遊戲,詭異、獨特的畫面風格,古龍式武俠敘事風格都爲這部作評帶來了無限的生命力。而《雨血》系列更是近年來少有的走出國門、享譽國外的遊戲。這部遊戲一招一式都很華麗,而且爽快的打擊感讓人欲罷不能。作爲一部PRG遊戲,在戰鬥中最重要的當屬敵我雙方生命值的對比,所以在戰鬥中實時顯示玩家對敵人造成的傷害值十分重要。《仙劍奇俠傳五前傳》更是在戰鬥中加入了傷害統計,方便玩家對於戰場局勢的把握。好了,講了這麼多,我們來繼續我們的Unity3D學習之旅,在下面的文章中,我們將使用Unity3D中的OnGUI()方法來實現傷害數值的 顯示。

       既然是基於OnGUI()方法的, 相信大家一定很熟悉了,所以我們直接給出代碼:

[csharp] view plaincopyprint?

  1. using UnityEngine;  

  2. using System.Collections;  

  3.   

  4. public class DamagePopup : MonoBehaviour {  

  5.   

  6.     //目標位置  

  7.     private Vector3 mTarget;  

  8.     //屏幕座標  

  9.     private Vector3 mScreen;  

  10.     //傷害數值  

  11.     public int Value;  

  12.   

  13.     //文本寬度  

  14.     public float ContentWidth=100;  

  15.     //文本高度  

  16.     public float ContentHeight=50;  

  17.   

  18.     //GUI座標  

  19.     private Vector2 mPoint;  

  20.   

  21.     //銷燬時間  

  22.     public float FreeTime=1.5F;  

  23.   

  24.     void Start ()   

  25.     {  

  26.         //獲取目標位置  

  27.         mTarget=transform.position;  

  28.         //獲取屏幕座標  

  29.         mScreen= Camera.main.WorldToScreenPoint(mTarget);  

  30.         //將屏幕座標轉化爲GUI座標  

  31.         mPoint=new Vector2(mScreen.x,Screen.height-mScreen.y);  

  32.         //開啓自動銷燬線程  

  33.         StartCoroutine("Free");  

  34.     }  

  35.   

  36.     void Update()  

  37.     {  

  38.         //使文本在垂直方向山產生一個偏移  

  39.         transform.Translate(Vector3.up * 0.5F * Time.deltaTime);  

  40.         //重新計算座標  

  41.         mTarget=transform.position;  

  42.         //獲取屏幕座標  

  43.         mScreen= Camera.main.WorldToScreenPoint(mTarget);  

  44.         //將屏幕座標轉化爲GUI座標  

  45.         mPoint=new Vector2(mScreen.x,Screen.height-mScreen.y);  

  46.     }  

  47.   

  48.     void OnGUI()  

  49.     {  

  50.         //保證目標在攝像機前方  

  51.         if(mScreen.z>0)  

  52.         {  

  53.            //內部使用GUI座標進行繪製  

  54.            GUI.Label(new Rect(mPoint.x,mPoint.y,ContentWidth,ContentHeight),Value.ToString());  

  55.         }  

  56.     }  

  57.   

  58.     IEnumerator Free()  

  59.     {  

  60.         yield return new WaitForSeconds(FreeTime);  

  61.         Destroy(this.gameObject);  

  62.     }  

  63. }  

       在上面的代碼中我們需要把握下面幾點:

       1、根據Transform組件獲取位置座標,將此座標轉化爲屏幕座標及GUI座標。

       2、Unity3D中常見的四種座標系:

             a、世界座標:場景中物體的座標,使用 transform.position獲得。

             b、屏幕座標:以像素來定義的,以屏幕的左下角爲(0,0)點,右上角爲(Screen.width,Screen.height),Z的位置是以相機的世界單位來衡量的。如Input.mousePosition即爲屏幕座標。

             c、視口座標:視口座標是標準的和相對於相機的。相機的左下角爲(0,0)點,右上角爲(1,1)點,Z的位置是以相機的世界單位來衡量的。

             d、GUI座標:該座標系以屏幕的左上角爲(0,0)點,右下角爲(Screen.width,Screen.height)。

      3、在代碼中我們將世界座標先轉化爲屏幕座標,再轉化爲GUI座標

更多精彩unity3d技術文章請點擊 http://www.gopedu.com/article

      好了,下面我們將這個腳本綁定在一個空的遊戲體上,並製作成預設,在下面的示例中,我們將使用這個預設。

       如圖,我們希望實現當角色***紅色的膠囊體時,在遊戲場景中顯示玩家對膠囊體造成的傷害值。具體怎麼做呢?我們可以先給模型和膠囊體加上碰撞器,並勾選IsTrigger使其成爲一個觸發器。我們分別將他們的tag設爲Player和Enemy。接下來,爲Enemy編寫一個腳本:

[csharp] view plaincopyprint?

  1. using UnityEngine;  

  2. using System.Collections;  

  3.   

  4. public class Enemy : MonoBehaviour {  

  5.   

  6.     public GameObject PopupDamage;  

  7.   

  8.     void OnTriggerEnter(Collider mCollider)  

  9.     {  

  10.         if(mCollider.gameObject.tag=="Player")  

  11.         {  

  12.             //克隆傷害彈出組件  

  13.             GameObject mObject=(GameObject)Instantiate(PopupDamage,transform.position,Quaternion.identity);  

  14.             mObject.GetComponent<DamagePopup>().Value=Random.Range(20,40);  

  15.         }  

  16.     }  

  17. }  

      這裏我們設定玩家對敵人造成的傷害值爲20到40,運行程序,我們會得到下面的結果:

        由於這裏使用的是非精確碰撞,所以導致程序一開始角色就和膠囊體發生了碰撞,而OnTrigger()方法由於只能在碰撞開始的時候捕捉碰撞,所以這裏只顯示了一次傷害值。理論上只有當玩家***膠囊體,纔會觸發傷害值的顯示,不過這個問題再這裏我們可以先不追究,因爲我們關注的是傷害數值的顯示。到目前爲止,這個問題已經圓滿的解決了。

        有朋友可能會問:爲什麼人家的遊戲裏顯示的傷害效果看起來那麼眩目,而你的程序卻只能顯示普普通通的文字呢?對於這個問題,我們這裏給出兩種思路,留給大家自己去探究啊。第一種方法是在項目中創建一個GUISkin,然後在DamagePopup腳本中添加一個GUIStyle類型的成員變量mStyle,通過該變量我們可以引用到在項目中創建的GUISkin。這樣,我們就可以定義整體的GUI樣式。此時,我們將OnGUI中的方法修改爲:

[csharp] view plaincopyprint?

  1. GUI.Label(new Rect(mPoint.x,mPoint.y,ContentWidth,ContentHeight),Value.ToString(),mStyle);  

這樣我們就可以實現自定義的文字效果了。第二種方法是使用貼圖,即首先準備0-9的數字圖片,然後我們將Value各個數位上的數字分別截取出來,根據截取的結果來繪製貼圖,這樣同樣可以實現自定義的效果。好了,今天的內容就是這樣了.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章