Unity学习笔记3 简易2D横版RPG游戏制作(三)
這一篇本來應該是在上一篇后面直接補進去的。不過因為排版的問題。所以我就另開一篇來整理了,好了,廢話不多說,馬上整理:
十八、關卡的鎖定與解鎖
前面我們已經解決了在游戲開始時可以選擇關卡的問題,接下來我們就要解決下一個問題了。那就是游戲關卡的解鎖問題。玩過像憤怒的小鳥、植物大戰(zhàn)僵尸等等的游戲的人應該知道,很多游戲都有這樣的設定,在你還沒有開始過完第一關的時候,是不可以玩第二關和第三關的。有些游戲需要這種功能,有些游戲則不需要。不管需不需要,我們在這里就順便把這個問題也給研究一下吧:
首先先想一下思路,思路當然就是制作一個變量,來進行判定,如果過了某一關,某個變量就會變成某個值,那么打開下一關的按鈕就可以順利執(zhí)行了。現(xiàn)在我們來處理一下之前的Door腳本,我就整個貼出來吧:
using UnityEngine; using System.Collections;public class Door : MonoBehaviour {public string Level;GameManager gameManager;GameObject gameObjectGM;void Start() {gameObjectGM = GameObject.FindGameObjectWithTag("GameManager");gameManager = gameObjectGM.GetComponent<GameManager>();}void OnTriggerEnter(Collider other){if (other.tag == "Player"){gameManager.SaveGame();PlayerPrefs.SetInt("LevelUnlock",2);Application.LoadLevel(Level);?}?} }在這個腳本里面,我主要是加了這么一句:PlayerPrefs.SetInt("LevelUnlock",?2);?里面的這個LevelUnlock是自己隨便起的一個變量,保存這個腳本之后,我們進入游戲場景1,然后撞擊里面的door物體,就會在跳到下一個場景之前先保存這么一個變量。這里有個地方需要注意一下,PlayerPrefs.SetInt("LevelUnlock",?2);這句話最好是放在Application.LoadLevel(Level);?的前面,雖然我測試過,放在前面的話,載入新場景的時候它還是有順便儲存這么一個變量。但是有可能只是因為這句話比較短,在跳到下一個場景之前就已經執(zhí)行完畢了。如果在Application.LoadLevel(Level);?這句話后面放了太多句話,讓它根本沒有時間去執(zhí)行的話,它可能就沒辦法全部執(zhí)行的。因為直接使用Application.LoadLevel(Level);?的話,在進入新場景的時候是會摧毀舊有場景的一切物體的,自然也包括他們身上的所有腳本了。所以在這個地方大家最好注意一下。
接著我們來到LevelSelect場景,打開攝像機上面的LevelSelect腳本,然后照下面這樣編輯:
using UnityEngine; using System.Collections;public class LevelSelect : MonoBehaviour {int sw = Screen.width;int sh = Screen.height;public string Level1;public string Level2;void OnGUI(){//進入第一關的按鈕if (GUI.Button(new Rect(0, 0, sw * .5f, sh), "第一關")){Application.LoadLevel(Level1);}//判斷是否進入第二關if (PlayerPrefs.GetInt("LevelUnlock", 0) >= 2){if (GUI.Button(new Rect(sw * .5f, 0, sw * .5f, sh), "第二關")) {PlayerPrefs.DeleteKey("LevelUnlock");Application.LoadLevel(Level2);}}else{GUI.Box(new Rect(sw * .5f, 0, sw * .5f, sh),"未解鎖\n"+ "第二關");} } }GUI.Box就是顯示一個無法點擊的東西,這個就不解釋了。當然,你用GUI.Button也是完全沒問題的。如果LevelUnlock這個變量加載之后大于等于2的話,那么我們就可以啟動第二關的GUI按鈕功能,否則的話,第二關的按鈕就會變成一個無法點擊的東西。在沒有進入第一關碰到那個door物體之前,如果直接載入LevelSelect場景的話,LevelUnlock值由于沒有賦值,就是零,自然就不可能大于等于2了。這樣就可以實現(xiàn)我們的解鎖功能了。至于那句PlayerPrefs.DeleteKey("LevelUnlock");是用來刪除某個已經保存的變量的。在這里我們可不是想把整個游戲存檔給清理了,所以只需要使用DeleteKey功能而不是DeleteAll,千萬不要弄錯了哈哈。
這樣清理掉這個變量僅僅是我在測試的過程中使用的。清理掉之后,如果我們再次載入LevelSelect,就會發(fā)現(xiàn)第二關的按鈕又被鎖定了。可能有人會說,這樣搞有什么用?這樣搞當然是很有用的。我們在制作游戲的過程中可能需要重復測試,自然不希望被某個已經保存了的變量干擾到我們的測試結果。而且,這種“反解鎖”的idea可以用于一些比較狡猾的游戲設計:比如你在游戲里面連續(xù)輸了太多次,或者是因為某些原因降級了,那么就可以通過這種設計方法,反鎖你的某些已進入的關卡,或者是已經習得的技能。同樣的,在一些任務和劇情設計中,有可能在某個特定時間上,你是不可以進入某個地方的。比如你的劇情設計自己的小鎮(zhèn)外面突然來了一大堆進擊的巨人,那么可能在巨人來襲的時候,玩家是不可以出城的,我們就可以在城門進行一個這樣的設定,就打不開了。(不是每個人都是兵長,可以把巨人當白蘿卜切割的嘛~~)
下面我截了一些圖來看看測試結果,我先把所有的存檔給清空。然后將場景1復制多了一個,變成場景2,并且把這個場景2中的door物體刪掉,用于區(qū)分兩個場景。
首先我們來到Mainmenu場景,改一下攝像機的MainMenu腳本里面的Level,改成LevelSelect,這樣是為了點擊“載入游戲”時載入LevelSelect場景。
接下來運行:
然后我們點擊載入游戲,我們看到的就是這樣。因為還沒弄畫面,所以有點丑,不過我們先學好基本原理再說,大家見諒。(畫面中間那個quad物體是我之前隨便擺放進去的,不用管它,直接無視就行。)
接著我們點擊左邊的按鈕進入我們熟悉的場景1,并且去碰撞我們的door物體。(我設定為深綠色的那個物體)
碰到之后我們會自動跳轉到下一個場景,下一個場景是沒有door物體的,剛剛我們刪了,其他的和場景1一模一樣。(因為下面的圖是我事后截的圖,游戲存檔被我清理過一次,所以細心一些的朋友會發(fā)現(xiàn)左上角的紅心減少了,其實你正常進入的話是不會影響你保存的curHealth的變量的。)
我們可以看到,深綠色的door不見了,我們已經來到場景2了。現(xiàn)在我們保存一下游戲,然后退出。然后重新進入到LevelSelect的畫面中:
這一次,右邊的第二關按鈕已經解鎖了。我們可以按第二關的按鈕進入我們的游戲了!!到這里,解鎖功能就做好了,我們馬上點一下看看:
嗯,沒錯,是我們的第二關。
但是在實際操作中會有這樣一個問題。因為我的設計是讓載入第二關的瞬間就清理掉LevelUnlock的值,所以如果這樣做的話,在那個LevelSelect畫面進入第二關的畫面的過程中,你會看到第二關的GUI.Button會變成GUI.Box,雖然只是一瞬間,但要是真的做成游戲的話,視覺體驗上就會很差了。解決這個問題的最簡單方法就是不要在那里刪掉LevelUnlock這個變量,就不會出事。當然,如果你實在要這樣做,也還有一個辦法的,那就是讓整個場景變暗,然后再重新亮起來,這樣就可以實現(xiàn)我們要的效果了。關于淡入淡出效果,我還在研究,所以暫時沒辦法整理到教程里面來。請見諒。
好了,關于解鎖關卡的研究就到這里,下面我們繼續(xù)學習。
十九、金錢
如果說前面幾講稍微有點復雜的話,那么這一講就實在是太簡單了。這一講其實就是增加一個簡單的變量。因為我們暫時還沒有涉及到交易系統(tǒng),所以也沒什么好說的。
首先呢,我們建一個變量,static?public?int?curCoins?=?0;這個是弄在我們的GameManager腳本里面的,就不再解釋了。
接著修改void?Awake(),在里面讀取存檔后增加一個curCoins?=?PlayerPrefs.GetInt("Player?Coins");
修改Update()里面的這個:if?(playerStats)?{statsDisplay.text?=?"等級:"?+?level?+?"\n經驗:"?+?curEXP?+?"/"?+?maxEXP?+?"\n攻擊力:"?+?bulletDamage?+?"\n金錢"?+?curCoins;}?
這樣的話在顯示的時候就可以連“金錢”也一起顯示出來。
在SaveGame()里面增加PlayerPrefs.SetInt("Player?Coins",?curCoins);這一句。
然后保存我們的腳本。
為了大家方便,我將這個腳本重新貼出來:
using UnityEngine; using System.Collections;public class GameManager : MonoBehaviour {//引用Controller2Dpublic Controller2D controller2D;//角色生命值public Texture playersHealthTexture;//控制上面那個Teture的屏幕所在位置public float screenPositionX;public float screenPositionY;//控制桌面圖標的大小public int iconSizeX = 25;public int iconSizeY = 25;//初始生命值static public int curHealth = 3;//游戲剛開始時,第一級的最大生命值,以后每級增加1。public int maxHealth = 3;GameObject player;//我們的子彈的攻擊力static public int bulletDamage = 1;//當前經驗值public int curEXP;//從第一級升到下一級需要的經驗值(以后每一級增加50)int maxEXP = 50;//游戲剛開始時的等級int level = 1;//游戲剛開始的金錢static public int curCoins = 0;//這個布爾值用于判定是否顯示角色的狀態(tài)bool playerStats;//下面這個用于顯示角色的狀態(tài)public GUIText statsDisplay;//用于暫停的布爾值bool pauseMenu;//用于判斷是否是否保存int saved = 0;//自動保存計時器public float autoSaveTimer;void Awake(){saved = PlayerPrefs.GetInt ("Game Saved");if (saved == 1) {curEXP = PlayerPrefs.GetInt ("Player EXP");level = PlayerPrefs.GetInt ("Player Level");curCoins = PlayerPrefs.GetInt("Player Coins");maxEXP = level * 50;maxHealth = level + 2;curHealth = maxHealth;} }//這個地方定義了私有變量player作為一個GameObject,然后用下面的FindGameObjectWithTag獲取它,這樣的話,在下面的傷害判斷時,就可以用player.renderer了。void Start(){player = GameObject.FindGameObjectWithTag("Player");}void Update(){//自動存檔功能autoSaveTimer += Time.deltaTime;if (autoSaveTimer >= 10f) {SaveGame(); print ("保存啦~~");autoSaveTimer =0;}if (Input.GetKeyDown (KeyCode.P)) {pauseMenu = !pauseMenu; }if (curEXP >= maxEXP) {LevelUp(); }if (Input.GetKeyDown (KeyCode.C)) {playerStats = !playerStats; }if (Input.GetKeyDown (KeyCode.E)) {curEXP += 10; }if (playerStats) {statsDisplay.text = "等級:" + level + "\n經驗:" + curEXP + "/" + maxEXP + "\n攻擊力:" + bulletDamage + "\n金錢" + curCoins;} else {statsDisplay.text = ""; }if (curHealth > maxHealth) {curHealth = maxHealth;}}//這個函數用于角色升級void LevelUp(){curEXP = 0;maxEXP = maxEXP + 50;level++;//升級的功效maxHealth++;}//OnGUI函數最好不要出現(xiàn)多次,容易造成混亂,所以我把要展示的東西都整合在這個里面void OnGUI(){//控制角色生命值的心的顯示for (int h =0; h < curHealth; h++) {GUI.DrawTexture(new Rect(screenPositionX + (h*iconSizeX),screenPositionY,iconSizeX,iconSizeY),playersHealthTexture,ScaleMode.ScaleToFit,true,0);}if (pauseMenu) {//“保存游戲”按鈕if(GUI.Button(new Rect(Screen.width*.25f,Screen.height*.4f,Screen.width*.5f,Screen.height*.1f),"保存游戲")){SaveGame();}//“顯示保存的數據”按鈕if(GUI.Button(new Rect(Screen.width*.25f,Screen.height*.6f,Screen.width*.5f,Screen.height*.1f),"顯示保存的數據")){print ("顯示保存的數據");print("當前等級:"+ PlayerPrefs.GetInt("Player Level"));print("當前經驗:"+ PlayerPrefs.GetInt("Player EXP"));print("是否保存:"+ PlayerPrefs.GetInt("Game Saved"));}}}public void SaveGame(){saved = 1;PlayerPrefs.SetInt("Player Level",level);PlayerPrefs.SetInt("Player EXP",curEXP);PlayerPrefs.SetInt("Player Coins", curCoins);PlayerPrefs.SetInt("Game Saved",saved);print ("已保存");}void PlayerDamaged(int damage){ //此處使用player.renderer.enabled來進行判斷,如果角色沒有在閃爍,也就是存在的狀態(tài)為真,那么才會受到傷害,這樣可以避免角色連續(xù)受傷,還有另外一種方法是采用計時,這里沒有采用那種方法。if (player.renderer.enabled) {if (curHealth > 0) {curHealth -= damage; }if (curHealth <= 0) {RestartScene (); }}}void RestartScene(){Application.LoadLevel (Application.loadedLevel);} }
不想認真看那幾處修改位置的可以直接復制之后覆蓋原來的GameManager腳本。
然后打開Enemy2D腳本,修改一處:
void EnemyDamaged(int damage){if (enemyHealth > 0) {enemyHealth -= damage; }if (enemyHealth <= 0) {enemyHealth = 0;Destroy(gameObject);if(basicEnemy){gameManager.curEXP += 5;GameManager.curCoins += 5;}if (advancedEnemy){gameManager.curEXP += 10;GameManager.curCoins += 10; } }}修改完成之后,我們打到basic級別的敵人就會得到五點經驗,五塊錢,advanced級別的敵人就是十點經驗和十塊錢。這樣就比較像正常的RPG游戲了。
好了,這一講沒什么內容,我們馬上看下一講。
二十、開始我們的武器設置
其實視頻里面這一講是非常簡單的,首先是調整一下原本的LevelSelect畫面的尺寸,我就不嘮叨了,直接貼出代碼:
using UnityEngine; using System.Collections;public class LevelSelect : MonoBehaviour {int sw = Screen.width;int sh = Screen.height;public string Level1;public string Level2;void OnGUI(){//進入第一關的按鈕if (GUI.Button(new Rect(sw * .1f, sh * .2f, sw * .3f, sh * .5f), "第一關")){Application.LoadLevel(Level1);}//判斷是否進入第二關if (PlayerPrefs.GetInt("LevelUnlock", 0) >= 2){if (GUI.Button(new Rect(sw * .6f, sh * .2f, sw * .3f, sh * .5f), "第二關")){PlayerPrefs.DeleteKey("LevelUnlock");Application.LoadLevel(Level2);}}else{GUI.Box(new Rect(sw * .6f, sh * .2f, sw * .3f, sh * .5f), "\n\n\n未解鎖\n" + "第二關");}} }(我用了VS?2013的自動排版,感覺挺不錯的,這樣看起來就整齊多了。其實看很多視頻,mono也是可以自動排版的,但是我實在搞不懂是怎么實現(xiàn)那些功能的。)
然后就是截個圖讓大家看看調整之后的效果:
這樣是不是整齊多了呢?
接著是對GameManager進行修改,由于下一節(jié)還要繼續(xù)改,就暫時不放代碼。我們先看看要改哪個部分。首先是pauseMenu,也就是暫停按鈕的設置。
上面這個,在之前的p按鈕里面稍微改下就可以的。我就不多說了。退出游戲的話,可以利用Application.LoadLevel("Mainmenu");回到主菜單,然后再在主菜單那里退出。或者也可以用Application.Quit();這個是直接退出游戲的,不推薦現(xiàn)在使用,因為這個無法在我們的unity里面測試,要測試這個指令就必須把游戲導出來,然后再去測試。現(xiàn)在知道有這么個東西就行了。
if (Input.GetKeyDown(KeyCode.P)){//pauseMenu = !pauseMenu; pauseMenu = true;Time.timeScale = 0;}input這里,增加一個Time.timeScale?=?0;就可以讓整個游戲畫面禁止。當然,也包括我們的玩家。暫停游戲就是這么實現(xiàn)的。當這個數字為1時則是正常速度運行游戲,數值變小或者變大都會對我們整個游戲的運行產生影響。在弄這個玩意的時候我突然靈光一閃,想到了一點很有趣的東西。有時候我們需要實現(xiàn)一種這樣的效果,讓除了主角之外的全場變慢,這個是很多電影里面經常看到的東西。最笨的方法,就是把和主角在一起的全部互動物體通通減速,但是這樣除非所有物體都標有相同的tag,否則很難實現(xiàn)。另一種方法就是利用這個Time.timeScale,比如說,我們可以讓它等于0.5,那么就可以實現(xiàn)敵人慢動作的效果了。有人會說,你進水了呀,這樣調整之后我們主角也慢動作了啊。可是,我們可以在這種特殊的情況下提高主角的速度嘛。如果只是針對主角一人的話,那就好辦了。主角可以速度翻倍,甚至翻四倍,那就夠了,嘿嘿。這樣才能讓全場的機關慢下來,哈哈哈哈。我在想,也許有些忍者游戲可以這樣設計~~
好了,如果我們想要回到游戲,只需要讓Time.timeScale的值重新等于1就可以了。也可以讓它在一定時間內慢慢增加或者慢慢減少,來讓我們的游戲達到某種突然變得松弛或緊張起來的感覺。
至于武器菜單,看下一講吧:
二十一、簡單的武器菜單
在這個游戲教程里面,并沒有那種NPC式的商店或者是比較復雜的購物系統(tǒng),所以,目前我們的金錢暫時沒辦法用來進行復雜的購物設計,只能用來做一些比較簡單的解鎖。首先我先將整個修改之后的GameManager腳本貼出來吧,貼出來之后我再來說明一下:
using UnityEngine; using System.Collections;public class GameManager : MonoBehaviour {//引用Controller2Dpublic Controller2D controller2D;//角色生命值public Texture playersHealthTexture;//控制上面那個Teture的屏幕所在位置public float screenPositionX;public float screenPositionY;//控制桌面圖標的大小public int iconSizeX = 25;public int iconSizeY = 25;//初始生命值static public int curHealth = 3;//游戲剛開始時,第一級的最大生命值,以后每級增加1。public int maxHealth = 3;GameObject player;//我們的子彈的攻擊力static public int bulletDamage = 1;//當前經驗值public int curEXP;//從第一級升到下一級需要的經驗值(以后每一級增加50)int maxEXP = 50;//游戲剛開始時的等級int level = 1;//游戲剛開始的金錢static public int curCoins = 0;//這個布爾值用于判定是否顯示角色的狀態(tài)bool playerStats;//下面這個用于顯示角色的狀態(tài)public GUIText statsDisplay;//用于暫停的布爾值bool pauseMenu;//用于判斷是否是否保存int saved = 0;//自動保存計時器public float autoSaveTimer;//用于是否顯示武器菜單bool weaponsMenu;//屏幕寬度int sw = Screen.width;//屏幕高度int sh = Screen.height;void Awake(){saved = PlayerPrefs.GetInt("Game Saved");if (saved == 1){curEXP = PlayerPrefs.GetInt("Player EXP");level = PlayerPrefs.GetInt("Player Level");curCoins = PlayerPrefs.GetInt("Player Coins");maxEXP = level * 50;maxHealth = level + 2;curHealth = maxHealth;}}//這個地方定義了私有變量player作為一個GameObject,然后用下面的FindGameObjectWithTag獲取它,這樣的話,在下面的傷害判斷時,就可以用player.renderer了。void Start(){player = GameObject.FindGameObjectWithTag("Player");}void Update(){//洗錢if(Input.GetKeyDown(KeyCode.M)){curCoins += 100;}//自動存檔功能autoSaveTimer += Time.deltaTime;if (autoSaveTimer >= 10f){SaveGame();print("保存啦~~");autoSaveTimer = 0;}if (Input.GetKeyDown(KeyCode.P)){//pauseMenu = !pauseMenu; pauseMenu = true;Time.timeScale = 0;}if (curEXP >= maxEXP){LevelUp();}if (Input.GetKeyDown(KeyCode.C)){playerStats = !playerStats;}if (Input.GetKeyDown(KeyCode.E)){curEXP += 10;}if (playerStats){statsDisplay.text = "等級:" + level + "\n經驗:" + curEXP + "/" + maxEXP + "\n攻擊力:" + bulletDamage + "\n金錢" + curCoins;}else{statsDisplay.text = "";}if (curHealth > maxHealth){curHealth = maxHealth;}}//這個函數用于角色升級void LevelUp(){curEXP = 0;maxEXP = maxEXP + 50;level++;//升級的功效maxHealth++;}//OnGUI函數最好不要出現(xiàn)多次,容易造成混亂,所以我把要展示的東西都整合在這個里面void OnGUI(){//控制角色生命值的心的顯示for (int h = 0; h < curHealth; h++){GUI.DrawTexture(new Rect(screenPositionX + (h * iconSizeX), screenPositionY, iconSizeX, iconSizeY), playersHealthTexture, ScaleMode.ScaleToFit, true, 0);}if (pauseMenu){//武器菜單按鈕if (GUI.Button(new Rect(Screen.width * .25f, Screen.height * .3f, Screen.width * .5f, Screen.height * .1f), "武器菜單")){pauseMenu = false;weaponsMenu = true;}//保存游戲按鈕if (GUI.Button(new Rect(Screen.width * .25f, Screen.height * .4f, Screen.width * .5f, Screen.height * .1f), "保存游戲")){SaveGame();}//“顯示保存的數據”按鈕//if (GUI.Button(new Rect(Screen.width * .25f, Screen.height * .6f, Screen.width * .5f, Screen.height * .1f), "顯示保存的數據"))//{// print("顯示保存的數據");// print("當前等級:" + PlayerPrefs.GetInt("Player Level"));// print("當前經驗:" + PlayerPrefs.GetInt("Player EXP"));// print("是否保存:" + PlayerPrefs.GetInt("Game Saved"));//}//回到游戲按鈕if (GUI.Button(new Rect(Screen.width * .25f, Screen.height * .5f, Screen.width * .5f, Screen.height * .1f), "回到游戲")){Time.timeScale = 1;pauseMenu = false;}//退出游戲按鈕if (GUI.Button(new Rect(Screen.width * .25f, Screen.height * .6f, Screen.width * .5f, Screen.height * .1f), "退出游戲")){Application.LoadLevel("Mainmenu");//Application.Quit();}}if (weaponsMenu){//第一武器if (PlayerPrefs.GetInt("Weapon1", 0) >= 1){bulletDamage = 3;if (GUI.Button(new Rect(sw * .1f, sh * .2f, sw * .3f, sh * .5f), "已裝備武器1")){bulletDamage = 3;}}else{if (GUI.Button(new Rect(sw * .1f, sh * .2f, sw * .3f, sh * .5f), "購買武器1"+"\n價格:200金幣")){if (curCoins >= 200) {curCoins -= 200;PlayerPrefs.SetInt("Weapon1", 1);}}}//第二武器if (PlayerPrefs.GetInt("Weapon2", 0) >= 1){bulletDamage = 6;if (GUI.Button(new Rect(sw * .6f, sh * .2f, sw * .3f, sh * .5f), "已裝備武器2")){bulletDamage = 6;}}else{if (GUI.Button(new Rect(sw * .6f, sh * .2f, sw * .3f, sh * .5f), "購買武器2" + "\n價格:500金幣")){if (curCoins >= 500){curCoins -= 500;PlayerPrefs.SetInt("Weapon2", 1);}}}//回到游戲按鈕if (GUI.Button(new Rect(Screen.width * .25f, Screen.height * .5f, Screen.width * .5f, Screen.height * .1f), "回到游戲")){Time.timeScale = 1;weaponsMenu = false;}}}public void SaveGame(){saved = 1;PlayerPrefs.SetInt("Player Level", level);PlayerPrefs.SetInt("Player EXP", curEXP);PlayerPrefs.SetInt("Player Coins", curCoins);PlayerPrefs.SetInt("Game Saved", saved);PlayerPrefs.SetInt("Player Damage", bulletDamage);print("已保存");}void PlayerDamaged(int damage){ //此處使用player.renderer.enabled來進行判斷,如果角色沒有在閃爍,也就是存在的狀態(tài)為真,那么才會受到傷害,這樣可以避免角色連續(xù)受傷,還有另外一種方法是采用計時,這里沒有采用那種方法。if (player.renderer.enabled){if (curHealth > 0){curHealth -= damage;}if (curHealth <= 0){RestartScene();}}}void RestartScene(){Application.LoadLevel(Application.loadedLevel);} }內容很長,所以有興趣的要耐心地好好看,雖然增加的內容也并不是很多。哈哈。我用VS?2013進行了自動排版操作,所以看起來整齊多了。mono的排版并不是很給力,所以我并不是很喜歡。首先我們增加了一個參數。bool?weaponsMenu;用于判定是否顯示武器菜單,這個在武器菜單的GUI中用到的。接著呢,我們做了個這樣的小東西:
//洗錢if(Input.GetKeyDown(KeyCode.M)){curCoins += 100;}這個只是我在測試過程中用于快速增加金錢,不用慢慢去打怪收錢就可以馬上購買裝備的一個測試而已,好孩紙不要研究怎么作弊哈。接著呢,就在GUI這一塊做了點處理,并且我已經設計好了,購買了武器1的話,我們的bulletDamage(也就是攻擊力,因為在目前來說,我們只有一種武器,沒有一堆武器)就會變成3,購買了武器2的話,我們的bulletDamage就會變成6,不過有個小問題我還沒處理的,就是購買了武器2之后,理論上來說還是可以購買武器1的,而且購買了武器1之后,理應還保持武器2的戰(zhàn)斗力(除非進行武器的切換)不過這個是個小問題,大家可以用一些布爾值來解決,我就不再贅述了。至于武器的切換,以及武器在場景中的實際發(fā)揮(尤其是近戰(zhàn)武器),這個是以后的研究重點,這一篇就暫時先不說了。
其實前面提到的關卡解鎖和這次提到的所謂購買武器,并沒有什么本質上的區(qū)別。武器的購買系統(tǒng)并沒有真正的做出來,武器的合成、錘煉、優(yōu)化等等這方面的內容那就更不用說了。所以,目前只能算是個非常非常簡單的2D?RPG的雛形,但是這幾天的總結和學習也確實讓我掌握了很多很多的東西。我覺得,搞開發(fā)的人確實很有必要寫博客。因為有些東西只有寫出來才不會忘記,也才能加深印象。自己稍微懂了和能夠用文字表述出來是兩個完全不同的檔次,還是有很大區(qū)別的。所以,我建議有學習Unity的朋友也一起寫寫博客,有空多多交流吧。
二十二、結束場景
這是本篇中的最后一講了。下一篇博客暫時不會繼續(xù)講2D?RPG的內容。好了,我們繼續(xù)看內容,這一篇只是在炒冷飯,并沒有增加什么新的知識點。就是制作一個游戲結尾的場景而已。
我們建一個新的場景,命名Endscene,然后命名一個叫做EndScene的腳本,扔到這個場景的攝像機上面去,進行以下編輯:
using UnityEngine; using System.Collections;public class EndScene : MonoBehaviour {public Texture backgroundTexture;public float sPlaceX;public float sPlaceY;public float sSizeX;public float sSizeY;public string Level;void OnGUI(){GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), backgroundTexture);if (GUI.Button(new Rect(Screen.width * sPlaceX, Screen.height * sPlaceY, Screen.width * sSizeX, Screen.height * sSizeY), "回到主菜單")){Application.LoadLevel(Level);}} }然后就隨便找一張圖片做背景(這個隨你喜歡),然后在外面設置你要返回的那個Level的名字。這個嘛,我們就設置為Mainmenu就可以了。
接著我們在場景2里面隨便建一個物體,讓主角碰到它之后就會跳轉到結束場景。這個比較簡單,我自己就沒弄了。有需要的再去弄一下。然后不要忘了,我們還要把這個叫做Endscene的場景拖拽到菜單欄的File→Build?Settings的場景里面去:
然后測試運行,基本沒什么問題的,我就不截圖了。
好啦,到這里,我們就已經實現(xiàn)了一個2D橫版RPG游戲的許多基本功能,包括場景加載、簡單的戰(zhàn)斗計算、經驗系統(tǒng)、游戲存檔、跳躍、踏板、解鎖裝置、自動存檔、武器系統(tǒng)等等。雖然說這些東西都比較簡單,暫時做不出什么大型和炫酷的效果,而且既沒有音效,也沒有貼圖和動畫,非常單調。不過這些基本的要素掌握了之后,相信很多人可以利用發(fā)散性的想法設計出很多有趣的東西來了。我覺得看教程最大的意義是學習一種方法并借鑒別人的解決方案,而不是從頭到尾照做一遍,那樣的話還是沒辦法設計出屬于自己的東西的。接下來的這幾天可能稍有點忙,估計暫時不更新博客了。不過一有空我就會馬上更新的。
這篇寫了三天的博客就先到這里,如果大家有什么看的不太清楚的可以留言。歡迎大家一起學習,一起交流,以后我會盡量把一些好東西上傳到自己的資源里面去。當然,我也會把這兩天的教程的內容上傳到我的CSDN資源里面共享給大家。需要注意的是必須使用4.3或者以上版本的Unity才能打開我的資源。這些資源將免費公開,不收取任何下載幣,嘻嘻。
本次教程的工程文件下載: http://download.csdn.net/detail/sinolzeng/7279823
總結
以上是生活随笔為你收集整理的Unity学习笔记3 简易2D横版RPG游戏制作(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity学习笔记2 简易2D横版RPG
- 下一篇: Unity学习笔记4 更换编辑器为VS2