?

本教程將介紹如何使用Unity創(chuàng)建一個(gè)RPG游戲。該游戲?qū)齻€(gè)場(chǎng)景:主場(chǎng)景、城鎮(zhèn)場(chǎng)景和戰(zhàn)斗場(chǎng)景。本篇中我們先來(lái)了解一下該RPG游戲的主場(chǎng)景,帶您快速入門(mén)。

課前準(zhǔn)備
為了更好地理解這篇教程,希望您熟悉以下概念:

  • C#編程
  • Unity檢視面板的使用,如導(dǎo)入資源,創(chuàng)建預(yù)制件和添加組件
  • 基本的瓦片地圖創(chuàng)建,如添加Tileset和創(chuàng)建瓦片層


在開(kāi)始閱讀這篇教程之前,請(qǐng)新建Unity項(xiàng)目,并從示例項(xiàng)目中導(dǎo)入所有可用的精靈(Sprite)。您將需要對(duì)相應(yīng)的精靈圖集(Spritesheet)進(jìn)行切割。

請(qǐng)下載本教程的示例項(xiàng)目(使用版本:Unity 5.4.0f3),下載地址:http://pan.baidu.com/s/1pLv0uwz。

資源版權(quán)說(shuō)明
本教程所使用的圖片都來(lái)源于Pixel-boy的Superpowers Asset Packs。所有圖片可遵循Creative Commons Zero (CC0) 許可使用。您可以隨意使用這些資源,也可用于商業(yè)游戲。

主場(chǎng)景
下面按步驟為大家介紹如何在Unity中制作本教程的主場(chǎng)景。

1. 背景
首先在主場(chǎng)景中創(chuàng)建一個(gè)畫(huà)布(Canvas)來(lái)顯示背景圖片。新建Canvas命名為BackgroundCanvas,將渲染模式(Render Mode)設(shè)為Screen Space - Camera,將主相機(jī)(Main Canvas)設(shè)為畫(huà)布相機(jī)。然后將Canvas Scaler中的UI縮放模式(UI Scale Mode)設(shè)為與屏幕大小一致,而參考分辨率(Reference Resolution)設(shè)為1280x960。
?


然后新建圖片(Image)對(duì)象,讓它作為這個(gè)畫(huà)布的子對(duì)象。將源圖片(Source Image)設(shè)置成背景圖片,為了正確顯示背景圖,將其大小設(shè)為原始大小。

2.HUD畫(huà)布
現(xiàn)在,我們要另一個(gè)Canvas來(lái)顯示HUD元素。主場(chǎng)景中包括主題文本和播放按鈕。

首先,新建Canvas,與創(chuàng)建BackgroundCanvas步驟相同。但為了將這個(gè)畫(huà)布顯示在背景畫(huà)布的上方,需要正確地設(shè)置它的Sorting Layer。新建層命名為HUD,并將HUDCanvas放于該層。
?


最后,創(chuàng)建兩個(gè)HUD對(duì)象:一個(gè)是Text,另一個(gè)是Button。對(duì)于Text對(duì)象,只需要設(shè)置它的文本。而對(duì)于Button對(duì)象,需要設(shè)置它的OnClick回調(diào)函數(shù)。
?


PlayButton對(duì)象的OnClick回調(diào)函數(shù)在下面的ChangeScene腳本中。該腳本僅有一個(gè)方法,用于根據(jù)給定的場(chǎng)景名稱(chēng)切換至目標(biāo)場(chǎng)景。然后設(shè)置播放按鈕的OnClick回調(diào)函數(shù),讓它調(diào)用loadNextScene方法,參數(shù)為“Town”。
?

[C#]?純文本查看?復(fù)制代碼
public class ChangeScene : MonoBehaviour {
  
public void loadNextScene(string sceneName) {
SceneManager.LoadScene (sceneName);
}
}
public class ChangeScene : MonoBehaviour {
  
public void loadNextScene(string sceneName) {
SceneManager.LoadScene (sceneName);
}
}
3.玩家部分
游戲希望保存玩家單位的數(shù)據(jù),即使切換場(chǎng)景數(shù)據(jù)也不會(huì)丟失。所以新建持久化對(duì)象命名為“PlayerParty”,即使切換場(chǎng)景,這個(gè)對(duì)象也不會(huì)被銷(xiāo)毀。同時(shí)要正確設(shè)置它的坐標(biāo),讓它在戰(zhàn)斗場(chǎng)景中顯示在正確的位置。
?

通過(guò)下面的StartBattle腳本,讓PlayerParty對(duì)象在切換場(chǎng)景時(shí)不被銷(xiāo)毀。該腳本在Start方法中調(diào)用DontDestroyOnLoad函數(shù)以防止切換場(chǎng)景時(shí)銷(xiāo)毀對(duì)象。腳本還增加了一個(gè)回調(diào)函數(shù),當(dāng)加載新場(chǎng)景時(shí)將PlayerParty對(duì)象設(shè)置為非激活態(tài),這樣就不會(huì)顯示在主場(chǎng)景中。
?
[C#]?純文本查看?復(fù)制代碼
public class StartBattle : MonoBehaviour {
 
        // Use this for initialization
        void Start () {
                DontDestroyOnLoad (this.gameObject);
 
                SceneManager.sceneLoaded += OnSceneLoaded;
 
                this.gameObject.SetActive (false);
        }
 
        private void OnSceneLoaded(Scene scene, LoadSceneMode mode) {
                if (scene.name == "Title") {
                        SceneManager.sceneLoaded -= OnSceneLoaded;
                        Destroy (this.gameObject);
                } else {
                        this.gameObject.SetActive(scene.name == "Battle");
                }
        }
 
}
public class StartBattle : MonoBehaviour {
 
        // 用來(lái)初始化的方法
        void Start () {
                DontDestroyOnLoad (this.gameObject);
 
                SceneManager.sceneLoaded += OnSceneLoaded;
 
                this.gameObject.SetActive (false);
        }
 
        private void OnSceneLoaded(Scene scene, LoadSceneMode mode) {
                if (scene.name == "Title") {
                        SceneManager.sceneLoaded -= OnSceneLoaded;
                        Destroy (this.gameObject);
                } else {
                        this.gameObject.SetActive(scene.name == "Battle");
                }
        }
 
}

PlayerParty還需要有兩個(gè)表示玩家單位的子對(duì)象。創(chuàng)建PlayerUnit預(yù)制件,目前內(nèi)容很少。在教程后面部分,我們會(huì)為它添加更多行為。

目前PlayerUnit上帶有Sprite Renderer組件和UnitStats腳本,該腳本會(huì)保存每個(gè)單位的狀態(tài),如生命值、魔法值、攻擊力、魔法攻擊力、防御力和速度等參數(shù)。
?

[C#]?純文本查看?復(fù)制代碼
public class UnitStats : MonoBehaviour {
  
public float health;
public float mana;
public float attack;
public float magic;
public float defense;
public float speed;
  
}
public class UnitStats : MonoBehaviour {
  
public float health;
public float mana;
public float attack;
public float magic;
public float defense;
public float speed;
  
}

?下圖展示了一個(gè)玩家單位的例子,叫做法師單位(MageUnit)。在本例中,UnitStats還有其他屬性如Animator和Damage Text Prefab,后面會(huì)用到。

?


到此已經(jīng)可以測(cè)試游戲的主場(chǎng)景了。您可以新建一個(gè)空?qǐng)鼍懊麨椤癟own”,來(lái)測(cè)試點(diǎn)擊播放按鈕是否能正確切換場(chǎng)景。
?


總結(jié)
本篇教程主要為您介紹了該RPG游戲主場(chǎng)景的部分,我們會(huì)在后續(xù)為您繼續(xù)介紹剩下的場(chǎng)景。如果您對(duì)類(lèi)似教程感興趣,請(qǐng)關(guān)注Unity官方微信平臺(tái)(Unity-GreaterChina ),查看更多相關(guān)內(nèi)容。

?

?

銳亞教育