創作內容

5 GP

程式筆記: Unity 2Droguelike 筆記 - 1

作者:Fantasy.S│Unity(遊戲引擎)│2017-08-19 00:05:27│巴幣:10│人氣:2785
純粹筆記, 該來乖乖面對Unity了
趁現在稍微有空一點(嗎?)

---

來源網站
https://unity3d.com/learn/tutorials/projects/2d-roguelike-tutorial

遊戲內容
盡量簡短說, 就是一個格子移動類型的遊戲
每次移動的時候, 敵人會跟著移動
(一種敵人2回合走一次, 另一種敵人3回合走一次)
類似不可思議迷宮的玩法
沒有辦法擊殺敵人, 只能盡可能的在最少消耗的狀況下走下下一層
隨機迷宮的地圖, 只有三種地形(可以走, 可以挖, 不能穿越)
以及數種食物(吃了可以增加體力)
體力耗盡或血量耗盡時, 遊戲結束

以下直接拆解code來看

Loader.cs
這是一個綁在MainCamera上面的script
基本上就是一個一開遊戲就會執行的script

功能也只是創建GameManager與SoundManager

+ 強制Instantiate物件的方法
public GameObject gameManager;
public GameObject soundManager;
void Awake () {
    if (GameManager.instance == null)
        Instantiate(gameManager);
    if (SoundManager.instance == null)
        Instantiate(soundManager);
}

GameManager.cs
+ 隱藏變數
[HideInInspector] public bool playersTurn = true;
用處應該只是讓Inspector可以比較整齊一點吧XD

+ 利用static來實現"唯一"
public static GameManager instance = null;
void Awake() {
    if (instance == null)
        instance = this;
    else if (instance != this)
        Destroy(gameObject);
}
若不是唯一就把自己砍了

+ 避免在換scene的時候被砍掉
這項指令, 建議寫在Awake之中,
讓自己很快帶有不被砍掉的屬性.
DontDestroyOnLoad(gameObject);

+ 調用同Inspector的其他物件
boardScript = GetComponent<BoardManager>();

+ 讀取畫面觸發之事件
老實說這個有夠複雜的, 反正會考記得背起來(X
using UnityEngine.SceneManagement;
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
static public void CallbackInitialization() {
    //register the callback to be called everytime the scene is loaded
    SceneManager.sceneLoaded += OnSceneLoaded;
}
static private void OnSceneLoaded(Scene arg0, LoadSceneMode arg1) {
    instance.level++;
    instance.InitGame();
}
基本上就是, 載入畫面的執行順序是:
Awake() --> CallbackInitialization() --> OnSceneLoaded() --> OnSceneLoaded() --> ...
原因是這個scene是不斷重複的類型
所以以RPGmaker的說法, Scene_Map可能也要做一樣的事情
來確保重新讀取scene的時候不會沒有動作

另外值得注意的是CallbackInitialization跟OnSceneLoaded都是自己註冊的名字
所以可以更改.

+ 找尋scene中的物件
levelImage = GameObject.Find("LevelImage");
感覺是一種很不安全的找尋方法
通常必須針對該物件為static比較好

但這個找尋方法比設定一堆沒必要的pointer
或者是沒事就建立global的方法好吧?

例如我設定了一個GameManager
之後我的GameMap, GameCharacter之類的都放在裡面
這樣我就不需要特別宣告一個global變數
任何一個物件都可以利用find的方式找到他

但我想這還是建立在尋找"scene"中預設的唯一物件
創建出來的應該比較難找
(最後還是得去MainCamera裡面找啊orz)

+ 計時器委任
public float levelStartDelay = 2f;
Invoke("HideLevelImage", levelStartDelay);
天啊又是一個很恐怖的東西
看起來會製造一個thread之後去等待
(因為下方的code會繼續執行)
其中HideLevelImage是一個function,

+ 敵方單位的移動
StartCoroutine (MoveEnemies ());
IEnumerator MoveEnemies() { ... }
這感覺又是個恐怖的東西
應該跟物件路徑移動有相關
先放置, 之後再回來研究更詳細吧

+ 開關物件
enabled = false;
就這樣, 恩
script物件本身可以直接用enabled關掉.

---

這篇就先到這邊,
下一篇應該會在筆記關於BoardManager之類的東西


引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3689019
Some rights reserved. 姓名標示-非商業性 2.5 台灣

相關創作

同標籤作品搜尋:Unity(遊戲引擎)

留言共 1 篇留言

樂小呈
請問還會更新類似的文嗎?

10-17 21:55

我要留言提醒:您尚未登入,請先登入再留言

5喜歡★roger0514 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:劇情筆記: 「冰菓」入門... 後一篇:程式筆記: Unity ...

追蹤私訊切換新版閱覽

作品資料夾

xzp83502在線巴哈們
果果日記小屋更新中~ 歡迎進來參觀 謝謝^^看更多我要大聲說昨天23:32


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】