Unity3D遊戲開發之傷害數值顯示,unity3d遊戲開發
眾所周知,在RPG遊戲策劃中最為重要的一個環節是數值策劃。數值策劃是一個關於遊戲平衡方面的概念,它是一種非常深奧的概念。遊戲從某種意義上 是多種選擇的組合,因此如果一個遊戲失去平衡,那麼就會減少選擇而影響遊戲的樂趣。數值策劃人員通常需要按照一定的規則和方法將整個遊戲系統的相關數值調整到一個合適的範圍,以確保玩家可以有更多地選擇以增強遊戲的可玩性。數值策劃是近年來國內遊戲行業從國外遊戲業引申過來的一個概念,我們在學習遊戲設計的過程中,除了專註於技術上的實現以外,還應該對遊戲設計中的相關理論有所瞭解。關於數值策劃的詳細內容,大家可以從這裡瞭解:http://baike.baidu.com/view/1756429.htm。
好了,下面我們開始今天的內容:Unity3D遊戲開發之傷害數值顯示。,是一部遊戲《血雨前傳:蜃樓》。這部遊戲雖然脫離了前兩部作品回合制的模式,以爽快的ACT橫版過關模式再次進入玩家的視野中,但是相信只有真正玩過這個遊戲的人才知道這是一部地地道道的RPG遊戲,詭異、獨特的畫面風格,古龍式武俠敘事風格都為這部作評帶來了無限的生命力。而《雨血》系列更是近年來少有的走出國門、享譽國外的遊戲。這部遊戲一招一式都很華麗,而且爽快的打擊感讓人慾罷不能。作為一部PRG遊戲,在戰鬥中最重要的當屬敵我雙方生命值的對比,所以在戰鬥中即時顯示玩家對敵人造成的傷害值十分重要。《仙劍奇俠傳五前傳》更是在戰鬥中加入了傷害統計,方便玩家對於戰場局勢的把握。好了,講了這麼多,我們來繼續我們的Unity3D學習之旅,在下面的文章中,我們將使用Unity3D中的OnGUI()方法來實現傷害數值的 顯示。
既然是基於OnGUI()方法的, 相信大家一定很熟悉了,所以我們直接給出代碼:
[csharp] view plaincopyprint?
- 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編寫一個指令碼:
[csharp] view plaincopyprint?
- 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中的方法修改為:
[csharp] view plaincopyprint?
- GUI.Label(new Rect(mPoint.x,mPoint.y,ContentWidth,ContentHeight),Value.ToString(),mStyle); 更多精彩unity3d技術文章請點擊http://www.gopedu.com/article
這樣我們就可以實現自訂的文字效果了。第二種方法是使用貼圖,即首先準備0-9的數字圖片,然後我們將Value各個數位上的數字分別截取出來,根據截取的結果來繪製貼圖,這樣同樣可以實現自訂的效果。好了,今天的內容就是這樣了.
Unity3D開發的遊戲發布到android手機上後中文不可以顯示,怎解決?源碼
我記得U吧裡面有關於植入廣告的解決方案..摟主看下 unity3d8.com/...%AA%A4
用RPG MAKER XP可以不可以做出傷害時顯示傷害數值的效果?怎做?高分(追加)
喵~同樓上哦,要給分的……
用“傷害值美化指令碼”
用到的圖片如下:
(這個是自己找到的,不是原來的圖片)
請把圖片命名為“damage”放到\Graphics\Pictures內
#==============================================================================
# 本指令碼來自www.66RPG.com,使用和轉載請保留此資訊
#==============================================================================
# ============================================================================
# 傷害效果美化 v1.0 by SailCat
# ============================================================================
# 指令碼使用說明:
# 1.使用時需要將Damage.png複製到你的遊戲的Graphics/Pictures目錄下
# 2.Damage.png檔案的格式:
# 大小為180 x 96
# (0, 0) - (179, 31)為傷害值的數字表,其中每個數字寬18,高32
# (0, 32) - (179, 63)為回複值(傷害負值)的數字表,其中每個數字寬18,高32
# (0, 64) - (89, 95)為會心一擊標記的圖畫,長寬為90 x 32
# (90, 64) - (179, 95)為未命中標記的圖畫,長寬為90 x 32
# ============================================================================
module RPG
class Sprite < ::Sprite
#--------------------------------------------------------------------------
# ● 傷害值描畫
#--------------------------------------------------------------------------
def damage(value, critical)
# 釋放傷害
dispose_damage
# 如果傷害值是數值
if value.is_a?(Numeric)
# 絕對值轉為字串
damage_string = value.abs.to_s
else
# 轉為字串
damage_string = value.to_s
end
# 初始化位元影像
bitmap = Bitmap.new(162, 64)
bitmap.font.name = "Arial Black"
bitmap.font.siz......餘下全文>>