您好,登錄后才能下訂單哦!
眾所周知,在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?
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坐標
更多精彩unity3d技術文章請點擊 http://www.gopedu.com/article
好了,下面我們將這個腳本綁定在一個空的游戲體上,并制作成預設,在下面的示例中,我們將使用這個預設。
如圖,我們希望實現當角色***紅色的膠囊體時,在游戲場景中顯示玩家對膠囊體造成的傷害值。具體怎么做呢?我們可以先給模型和膠囊體加上碰撞器,并勾選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);
這樣我們就可以實現自定義的文字效果了。第二種方法是使用貼圖,即首先準備0-9的數字圖片,然后我們將Value各個數位上的數字分別截取出來,根據截取的結果來繪制貼圖,這樣同樣可以實現自定義的效果。好了,今天的內容就是這樣了.
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。