大家好,我是秦元培,歡迎大家關注我的博客,我的博客地址是blog.csdn.net/qinyuanpei。眾所周知,在RPG游戲策划中最為重要的一個環節是數值策划。數值策划是一個關於游戲平衡方面的概念,它是一種非常深奧的概念。
游戲從某種意義上 是多種選擇的組合,因此假設一個游戲失去平衡,那么就會降低選擇而影響游戲的樂趣。
數值策划人員通常須要依照一定的規則和方法將整個游戲系統的相關數值調整到一個合適的范圍。以確保玩家能夠有很多其它地選擇以增強游戲的可玩性。數值策划是近年來國內游戲行業從國外游戲業引申過來的一個概念。博主覺得我們在學習游戲設計的過程中,除了專注於技術上的實現以外,還應該對游戲設計中的相關理論有所了解。關於數值策划的具體內容,大家能夠從這里了解:http://baike.baidu.com/view/1756429.htm。
好了,以下我們開始今天的內容:Unity3D游戲開發之傷害數值顯示。如圖所看到的,是博主十分喜歡的一部游戲《血雨前傳:蜃樓》。這部游戲盡管脫離了前兩部作品回合制的模式。以爽快的ACT橫版過關模式再次進入玩家的視野中,可是相信僅僅有真正玩過這個游戲的人才知道這是一部地地道道的RPG游戲。詭異、獨特的畫面風格,古龍式武俠敘事風格都為這部作評帶來了無限的生命力。而《雨血》系列更是近年來少有的走出國門、享譽國外的游戲。
這部游戲一招一式都非常華麗,並且爽快的打擊感讓人欲罷不能。
作為一部PRG游戲,在戰斗中最重要的當屬敵我兩方生命值的對照,所以在戰斗中實時顯示玩家對敵人造成的傷害值十分重要。《仙劍奇俠傳五前傳》更是在戰斗中加入了傷害統計。方便玩家對於戰場局勢的把握。好了,講了這么多,我們來繼續我們的Unity3D學習之旅,在以下的文章中,我們將使用Unity3D中的OnGUI()方法來實現傷害數值的 顯示。
既然是基於OnGUI()方法的, 相信大家一定非常熟悉了。所以我們直接給出代碼:
using UnityEngine; using System.Collections; public class DamagePopup : MonoBehaviour { //目標位置 private Vector3 mTarget; //屏幕坐標 private Vector3 mScreen; //傷害數值 public int Value; //文本寬度 public float ContentWidth=100; //文本高度 public float ContentHeight=50; //GUI坐標 private Vector2 mPoint; //銷毀時間 public float FreeTime=1.5F; void Start () { //獲取目標位置 mTarget=transform.position; //獲取屏幕坐標 mScreen= Camera.main.WorldToScreenPoint(mTarget); //將屏幕坐標轉化為GUI坐標 mPoint=new Vector2(mScreen.x,Screen.height-mScreen.y); //開啟自己主動銷毀線程 StartCoroutine("Free"); } void Update() { //使文本在垂直方向山產生一個偏移 transform.Translate(Vector3.up * 0.5F * Time.deltaTime); //又一次計算坐標 mTarget=transform.position; //獲取屏幕坐標 mScreen= Camera.main.WorldToScreenPoint(mTarget); //將屏幕坐標轉化為GUI坐標 mPoint=new Vector2(mScreen.x,Screen.height-mScreen.y); } void OnGUI() { //保證目標在攝像機前方 if(mScreen.z>0) { //內部使用GUI坐標進行繪制 GUI.Label(new Rect(mPoint.x,mPoint.y,ContentWidth,ContentHeight),Value.ToString()); } } IEnumerator Free() { yield return new WaitForSeconds(FreeTime); Destroy(this.gameObject); } }在上面的代碼中我們須要把握以下幾點:
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坐標
好了。以下我們將這個腳本綁定在一個空的游戲體上。並制作成預設,在以下的演示樣例中。我們將使用這個預設。
如圖,我們希望實現當角色攻擊紅色的膠囊體時。在游戲場景中顯示玩家對膠囊體造成的傷害值。具體怎么做呢?我們能夠先給模型和膠囊體加上碰撞器,並勾選IsTrigger使其成為一個觸發器。我們分別將他們的tag設為Player和Enemy。
接下來,為Enemy編寫一個腳本:
using UnityEngine; using System.Collections; public class Enemy : MonoBehaviour { public GameObject PopupDamage; void OnTriggerEnter(Collider mCollider) { if(mCollider.gameObject.tag=="Player") { //克隆傷害彈出組件 GameObject mObject=(GameObject)Instantiate(PopupDamage,transform.position,Quaternion.identity); mObject.GetComponent<DamagePopup>().Value=Random.Range(20,40); } } }這里我們設定玩家對敵人造成的傷害值為20到40,執行程序,我們會得到以下的結果:
因為這里博主使用的是非精確碰撞,所以導致程序一開始角色就和膠囊體發生了碰撞,而OnTrigger()方法因為僅僅能在碰撞開始的時候捕捉碰撞。所以這里僅僅顯示了一次傷害值。
理論上僅僅有當玩家攻擊膠囊體,才會觸發傷害值的顯示。只是這個問題再這里我們能夠先不追究,因為我們關注的是傷害數值的顯示。
到眼下為止,這個問題已經圓滿的攻克了。
有朋友可能會問:為什么人家的游戲里顯示的傷害效果看起來那么眩目,而你的程序卻僅僅能顯示普普通通的文字呢?對於這個問題,我們這里給出兩種思路,留給大家自己去探究啊。
第一種方法是在項目中創建一個GUISkin,然后在DamagePopup腳本中加入一個GUIStyle類型的成員變量mStyle。通過該變量我們能夠引用到在項目中創建的GUISkin。
這樣,我們就能夠定義總體的GUI樣式。此時,我們將OnGUI中的方法改動為:
GUI.Label(new Rect(mPoint.x,mPoint.y,ContentWidth,ContentHeight),Value.ToString(),mStyle);
這樣我們就能夠實現自己定義的文字效果了。另外一種方法是使用貼圖,即首先准備0-9的數字圖片,然后我們將Value各個數位上的數字分別截取出來,依據截取的結果來繪制貼圖,這樣相同能夠實現自己定義的效果。好了。今天的內容就是這樣了。感謝大家關注我的博客,希望大家能夠喜歡今天的內容。
每日箴言:活得優雅些,別人壓不垮你,內心的強大才是真正的強大。
喜歡我的博客請記住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei
轉載請注明出處。本文作者:秦元培,本文出處:http://blog.csdn.net/qinyuanpei/article/details/27492689