溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Unity3D游戲開(kāi)發(fā)之傷害數(shù)值顯示

發(fā)布時(shí)間:2020-08-02 08:59:26 來(lái)源:網(wǎng)絡(luò) 閱讀:1199 作者:1248359860 欄目:開(kāi)發(fā)技術(shù)

Unity3D游戲開(kāi)發(fā)之傷害數(shù)值顯示

       眾所周知,在RPG游戲策劃中最為重要的一個(gè)環(huán)節(jié)是數(shù)值策劃。數(shù)值策劃是一個(gè)關(guān)于游戲平衡方面的概念,它是一種非常深?yuàn)W的概念。游戲從某種意義上 是多種選擇的組合,因此如果一個(gè)游戲失去平衡,那么就會(huì)減少選擇而影響游戲的樂(lè)趣。數(shù)值策劃人員通常需要按照一定的規(guī)則和方法將整個(gè)游戲系統(tǒng)的相關(guān)數(shù)值調(diào)整到一個(gè)合適的范圍,以確保玩家可以有更多地選擇以增強(qiáng)游戲的可玩性。數(shù)值策劃是近年來(lái)國(guó)內(nèi)游戲行業(yè)從國(guó)外游戲業(yè)引申過(guò)來(lái)的一個(gè)概念,我們?cè)趯W(xué)習(xí)游戲設(shè)計(jì)的過(guò)程中,除了專(zhuān)注于技術(shù)上的實(shí)現(xiàn)以外,還應(yīng)該對(duì)游戲設(shè)計(jì)中的相關(guān)理論有所了解。關(guān)于數(shù)值策劃的詳細(xì)內(nèi)容,大家可以從這里了解:http://baike.baidu.com/view/1756429.htm。

      下面我們開(kāi)始今天的Unity3D技能培訓(xùn)。 我們學(xué)習(xí)Unity3D培訓(xùn)目標(biāo):讓U3D初學(xué)者可以更快速的掌握U3D技術(shù),自行制作修改素材,可以獨(dú)立完成2D、3D小規(guī)模游戲及網(wǎng)頁(yè)游戲開(kāi)發(fā)。

       Unity3D游戲開(kāi)發(fā)之傷害數(shù)值顯示。如圖所示,是一部游戲《血雨前傳:蜃樓》。這部游戲雖然脫離了前兩部作品回合制的模式,以爽快的ACT橫版過(guò)關(guān)模式再次進(jìn)入玩家的視野中,但是相信只有真正玩過(guò)這個(gè)游戲的人才知道這是一部地地道道的RPG游戲,詭異、獨(dú)特的畫(huà)面風(fēng)格,古龍式武俠敘事風(fēng)格都為這部作評(píng)帶來(lái)了無(wú)限的生命力。而《雨血》系列更是近年來(lái)少有的走出國(guó)門(mén)、享譽(yù)國(guó)外的游戲。這部游戲一招一式都很華麗,而且爽快的打擊感讓人欲罷不能。作為一部PRG游戲,在戰(zhàn)斗中最重要的當(dāng)屬敵我雙方生命值的對(duì)比,所以在戰(zhàn)斗中實(shí)時(shí)顯示玩家對(duì)敵人造成的傷害值十分重要?!断蓜ζ?zhèn)b傳五前傳》更是在戰(zhàn)斗中加入了傷害統(tǒng)計(jì),方便玩家對(duì)于戰(zhàn)場(chǎng)局勢(shì)的把握。好了,講了這么多,我們來(lái)繼續(xù)我們的Unity3D學(xué)習(xí)之旅,在下面的文章中,我們將使用Unity3D中的OnGUI()方法來(lái)實(shí)現(xiàn)傷害數(shù)值的 顯示。

Unity3D游戲開(kāi)發(fā)之傷害數(shù)值顯示

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

[csharp] view plaincopyprint?

  1. using UnityEngine;  

  2. using System.Collections;  

  3.   

  4. public class DamagePopup : MonoBehaviour {  

  5.   

  6.     //目標(biāo)位置  

  7.     private Vector3 mTarget;  

  8.     //屏幕坐標(biāo)  

  9.     private Vector3 mScreen;  

  10.     //傷害數(shù)值  

  11.     public int Value;  

  12.   

  13.     //文本寬度  

  14.     public float ContentWidth=100;  

  15.     //文本高度  

  16.     public float ContentHeight=50;  

  17.   

  18.     //GUI坐標(biāo)  

  19.     private Vector2 mPoint;  

  20.   

  21.     //銷(xiāo)毀時(shí)間  

  22.     public float FreeTime=1.5F;  

  23.   

  24.     void Start ()   

  25.     {  

  26.         //獲取目標(biāo)位置  

  27.         mTarget=transform.position;  

  28.         //獲取屏幕坐標(biāo)  

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

  30.         //將屏幕坐標(biāo)轉(zhuǎn)化為GUI坐標(biāo)  

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

  32.         //開(kāi)啟自動(dòng)銷(xiāo)毀線程  

  33.         StartCoroutine("Free");  

  34.     }  

  35.   

  36.     void Update()  

  37.     {  

  38.         //使文本在垂直方向山產(chǎn)生一個(gè)偏移  

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

  40.         //重新計(jì)算坐標(biāo)  

  41.         mTarget=transform.position;  

  42.         //獲取屏幕坐標(biāo)  

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

  44.         //將屏幕坐標(biāo)轉(zhuǎn)化為GUI坐標(biāo)  

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

  46.     }  

  47.   

  48.     void OnGUI()  

  49.     {  

  50.         //保證目標(biāo)在攝像機(jī)前方  

  51.         if(mScreen.z>0)  

  52.         {  

  53.            //內(nèi)部使用GUI坐標(biāo)進(jìn)行繪制  

  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. }  

       在上面的代碼中我們需要把握下面幾點(diǎn):

       1、根據(jù)Transform組件獲取位置坐標(biāo),將此坐標(biāo)轉(zhuǎn)化為屏幕坐標(biāo)及GUI坐標(biāo)。

       2、Unity3D中常見(jiàn)的四種坐標(biāo)系:

             a、世界坐標(biāo):場(chǎng)景中物體的坐標(biāo),使用 transform.position獲得。

             b、屏幕坐標(biāo):以像素來(lái)定義的,以屏幕的左下角為(0,0)點(diǎn),右上角為(Screen.width,Screen.height),Z的位置是以相機(jī)的世界單位來(lái)衡量的。如Input.mousePosition即為屏幕坐標(biāo)。

             c、視口坐標(biāo):視口坐標(biāo)是標(biāo)準(zhǔn)的和相對(duì)于相機(jī)的。相機(jī)的左下角為(0,0)點(diǎn),右上角為(1,1)點(diǎn),Z的位置是以相機(jī)的世界單位來(lái)衡量的。

             d、GUI坐標(biāo):該坐標(biāo)系以屏幕的左上角為(0,0)點(diǎn),右下角為(Screen.width,Screen.height)。

      3、在代碼中我們將世界坐標(biāo)先轉(zhuǎn)化為屏幕坐標(biāo),再轉(zhuǎn)化為GUI坐標(biāo)

更多精彩unity3d技術(shù)文章請(qǐng)點(diǎn)擊 http://www.gopedu.com/article

      好了,下面我們將這個(gè)腳本綁定在一個(gè)空的游戲體上,并制作成預(yù)設(shè),在下面的示例中,我們將使用這個(gè)預(yù)設(shè)。

Unity3D游戲開(kāi)發(fā)之傷害數(shù)值顯示

       如圖,我們希望實(shí)現(xiàn)當(dāng)角色***紅色的膠囊體時(shí),在游戲場(chǎng)景中顯示玩家對(duì)膠囊體造成的傷害值。具體怎么做呢?我們可以先給模型和膠囊體加上碰撞器,并勾選IsTrigger使其成為一個(gè)觸發(fā)器。我們分別將他們的tag設(shè)為Player和Enemy。接下來(lái),為Enemy編寫(xiě)一個(gè)腳本:

[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. }  

      這里我們?cè)O(shè)定玩家對(duì)敵人造成的傷害值為20到40,運(yùn)行程序,我們會(huì)得到下面的結(jié)果:

Unity3D游戲開(kāi)發(fā)之傷害數(shù)值顯示

        由于這里使用的是非精確碰撞,所以導(dǎo)致程序一開(kāi)始角色就和膠囊體發(fā)生了碰撞,而OnTrigger()方法由于只能在碰撞開(kāi)始的時(shí)候捕捉碰撞,所以這里只顯示了一次傷害值。理論上只有當(dāng)玩家***膠囊體,才會(huì)觸發(fā)傷害值的顯示,不過(guò)這個(gè)問(wèn)題再這里我們可以先不追究,因?yàn)槲覀冴P(guān)注的是傷害數(shù)值的顯示。到目前為止,這個(gè)問(wèn)題已經(jīng)圓滿的解決了。

        有朋友可能會(huì)問(wèn):為什么人家的游戲里顯示的傷害效果看起來(lái)那么眩目,而你的程序卻只能顯示普普通通的文字呢?對(duì)于這個(gè)問(wèn)題,我們這里給出兩種思路,留給大家自己去探究啊。第一種方法是在項(xiàng)目中創(chuàng)建一個(gè)GUISkin,然后在DamagePopup腳本中添加一個(gè)GUIStyle類(lèi)型的成員變量mStyle,通過(guò)該變量我們可以引用到在項(xiàng)目中創(chuàng)建的GUISkin。這樣,我們就可以定義整體的GUI樣式。此時(shí),我們將OnGUI中的方法修改為:

[csharp] view plaincopyprint?

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

這樣我們就可以實(shí)現(xiàn)自定義的文字效果了。第二種方法是使用貼圖,即首先準(zhǔn)備0-9的數(shù)字圖片,然后我們將Value各個(gè)數(shù)位上的數(shù)字分別截取出來(lái),根據(jù)截取的結(jié)果來(lái)繪制貼圖,這樣同樣可以實(shí)現(xiàn)自定義的效果。好了,今天的內(nèi)容就是這樣了.


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI