【Unity 2Dローグライク】公式チュートリアルをやってみる part.13~UIを作る
こんにちは!ヤギです!
Unityの2Dローグライクの
公式チュートリアルをやってみる part.13になります!
※前回(part.12)の記事はこちら
www.yagigame.com
記事概要
今回の記事では、食料を表示するUIやレベルの管理についてご説明していきます。※part.13に対応する公式チュートリアルの章は、Enemy Animator Controllerです!
unity3d.com
※この記事は、ひよこのたまご様の記事をリスペクトしています。
hiyotama.hatenablog.com
UIの作成
まず初めに、背景から作成していきます。1. GameObject > UI > Canvasをクリックし、UIを表示する空間を作成します。
2. GameObject > UI > Imageをクリックし、背景を表示する空間を作成します。
※Canvasの子として作成されます。
※Scene viewからCanvasとimageを確認すると、Canvasの一部にimageがあります。
3. imageのAnchorをクリックし、option(またはalt)を押しながら、右下の広げるマークをクリックします。
※これでCanvas全体に、imageが広がります。
4. Colorをクリックし、色を黒色に変更します。
5. imageの名前をLevelImageとします。
6. GameObject > UI > Textをクリックし、レベルを表示する空間を作成します。
※名前をLevelTextとします
7. LevelTextのInspectorから以下の内容の修正を行います。
・Font Size を32にする。
・FontをPressStart2Pに変更する。
・Colorを白にする。
・Horizon OverflowとVectical OverflowをOverflowにする。
・Alignmentを真ん中にする。
・TextをDay 1とする。
※これを行うと、次の画面のようになります!
8. Hierarchy上で、LevelTextをLevelImageの文字の上にドラッグします。
※これで、LevelTextがLevelImageの子になります。
9. GameObject > UI > Textをクリックし、食料を表示する空間を作成します。
※名前をFoodTextとします。
10. Anchorをクリックし、option(またはalt)を押しながら画面中央の下をクリックします。
11. FoodTextのInspectorから以下の内容の修正を行います。
・Font Size を24にする。
・FontをPressStart2Pに変更する。
・Colorを白にする。
・Horizon OverflowとVectical OverflowをOverflowにする。
・Alignmentを真ん中にする。
・TextをFood: 100とする。
・Anchor > Max > Y を0.05にする。
・Anchor > Min > Y を0.05にする。
・Pos Yを0にする。
※これで、画面下に食料が表示されます。
12. Hierarchy上で、FoodTextをCanvasの直下にドラッグします。
※これで、FoodTextがCanvasの子になります。Canvasの下の方にあるオブジェクトから優先されるため、FoodTextが表示されなくなります。
※一通りUIが完成しました。次にUIを制御するスクリプトを作成していきます。
UIを制御するスクリプト(レベルの表示)の作成
1. GameManager.csを開き、スクリプトにUIを制御する部分を追加していきます。※GameManage.csにはレベル(Day)の表示を制御する部分を追加していきます。
※ソース内に解説を記載しました。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; //part.13で追加 UIを使うために必要 public class GameManager : MonoBehaviour { //ここからpart.13で追加 public float levelStartDelay = 2f; //レベルスタート時の時間間隔 private Text levelText; //レベルを表示するテキスト private GameObject levelImage; //UIの表示領域 表示のオンオフを切り替える private bool doingSetup; //設定中かどうかのフラグ //ここまでpart.13で追加 //ここからpart.12で追加 public float turnDelay = .1f; //1ターンの時間 private List<Enemy> enemies; //複数の敵を管理 private bool enemiesMoving; //敵の移動フラグ //ここまでpart.12で追加 //クラスに属し、複数のシーンで使われる変数を宣言 //Staticにすることで、他のスクリプトからも呼び出すことができます public static GameManager instance = null; //ここから:part.10で追加 public int playerFoodPoints = 100; //プレイヤーの食料 //HideInspectorをつけることで、Inspector viewに表示されなくなる [HideInInspector] public bool playerTurn = true; //プレイヤーのターンかの判定フラグ //ここまで:part.10で追加 //BoardManager型の変数を宣言 private BoardManager boardScript; //テストとして、敵が出現するレベルの3とする //part.13で1に修正 private int level = 1; // AwakeはStartよりも前、最初に呼ばれる void Awake() { //GameManagerが存在しなければ、このオブジェクトを設定する if (instance == null) instance = this; else if (instance != this) //すでに存在する場合、このオブジェクトは不要なため破壊する Destroy(gameObject); //シーン遷移時に、このオブジェクトは破壊せず引き継ぐ DontDestroyOnLoad(gameObject); //ここからpart.12で追加 enemies = new List<Enemy>(); //敵を初期化 //ここまでpart.12で追加 //BoardManagerのコンポーネントを取得 boardScript = GetComponent<BoardManager>(); //ステージ生成の関数を呼ぶための、関数を呼ぶ InitGame(); } //ここからpart.13で追加 //シーンが飛び出されたタイミングで実行される [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(); } //ここまでpart.13で追加 void InitGame() { //ここからpart.13で追加 //設定中フラグをオンにする doingSetup = true; //levelImageにUIを設定する levelImage = GameObject.Find("LevelImage"); //levelTextにUIのテキストを取得し設定する levelText = GameObject.Find("LevelText").GetComponent<Text>(); //levelTextにゲーム内のlevelを設定する levelText.text = "Day " + level; //UIを表示する levelImage.SetActive(true); //2秒後にUIを非表示にする Invoke("HideLevelImage", levelStartDelay); //ここまでpart.13で追加 //ここからpart.12で追加 enemies.Clear(); //ステージ移動時は敵をリセットする //ここまでpart.12で追加 //ステージ生成の関数を呼ぶ boardScript.SetupScene(level); } //ここからpart.13で追加 //UIを非表示にする private void HideLevelImage() { levelImage.SetActive(false); doingSetup = false; } //ここまでpart.13で追加 //ここまでpart.10で追加 //ここからpart.12で追加 void Update() { //プレイヤーのターンか、敵の動いている場合は、アップデートしない //part.13でdoigSetupを追加 if (playerTurn || enemiesMoving ||doingSetup) return; //敵の動いていない、敵のターンのみ敵を動かす StartCoroutine(MoveEnemies()); } //敵をリストに加える処理 public void AddEnemyList(Enemy script){ enemies.Add(script); } //敵を移動させる処理 IEnumerator MoveEnemies() { //エネミー移動フラグをtrueにする enemiesMoving = true; //1ターン待つ yield return new WaitForSeconds(turnDelay); //敵がいなければ if (enemies.Count == 0) { //1ターン待つ yield return new WaitForSeconds(turnDelay); } //敵の数だけ、敵を移動させる for (int i = 0; i < enemies.Count; i++) { enemies[i].MoveEnemy(); //1ターン待つ yield return new WaitForSeconds(turnDelay); } //プレイヤーのターンにする playerTurn = true; enemiesMoving = false; } //ここまでpart.12で追加 //ここかpart.10で追加 public void GameOver() { //ここからpart.13で追加 //ゲームオーバー時のテキストを設定 levelText.text = "After " + level + " days, you starved."; //UIを表示 levelImage.SetActive(true); //enabledをfalseにすることで、GameManagerが無効になる enabled = false; } }
※これで、Day 1などが表示されるようになりました!
UIを制御するスクリプト(食料の表示)の作成
1. Player.csを開き、スクリプトにUIを制御する部分を追加していきます。※Player.csには食料(Food)の表示を制御する部分を追加していきます。
※ソースの中の解説をご参照ください!
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; //シーンの読み込みに必要 using UnityEngine.UI; //part.13で追加 //MovingObjectクラスを継承する public class Player : MovingObject { //ここからpart.13で追加 public Text foodText; //食料を表示するテキスト //ここまでpart.13で追加 public int wallDamage = 1; //壁へのダメージ量 public int pointsPerFood = 10; //食べ物の回復量 public int pointsPerSoda = 20; //ソーダの回復量 public float restartLevelDeray = 1f; //ステージ移動時の時間 private Animator animator; //アニメーション用変数 private int food; //食料 // Use this for initialization //MovingObjectクラスのStartを継承する protected override void Start () { //animatorのコンポーネントを設定 animator = GetComponent<Animator>(); //foodをステージ間で引き継げるように、GameManagerから設定 food = GameManager.instance.playerFoodPoints; //ここからpart.13で追加 //foodTextを初期化 foodText.text = "Food: " + food; //ここまでpart.13で追加 //GameObjectのStartを呼び出す base.Start(); } //PlayerのfoodをGameManageに保存する public void OnDisable() { GameManager.instance.playerFoodPoints = food; } protected override void AttemptMove<T>(int xDir, int yDir) { //移動するたびに食料が減る food--; //ここからpart.13で追加 //減らした食料をUIに表示する foodText.text = "Food: " + food; //ここまでpart.13で追加 //MovingObjectのAttemptMoveを呼び出す base.AttemptMove<T>(xDir, yDir); RaycastHit2D hit; //ゲームオーバーか確認 CheckIfGameOver(); //プレイヤーのターン終了 GameManager.instance.playerTurn = false; } //プレイヤーが壁にぶつかった場合、壁をチョップする protected override void OnCantMove<T>(T component) { //Wallスクリプトを使えるように設定 Wall hitWall = component as Wall; //壁にダメージを与える hitWall.DamageWall(wallDamage); //チョップするアニメーションを呼び出す animator.SetTrigger("PlayerChop"); } //プレイヤーが、Exit、Food、Sodaと接触した場合に呼び出す private void OnTriggerEnter2D(Collider2D other) { //Exitと接触した場合 if(other.tag == "Exit"){ //ステージ移動の時間分待ってから、次のツテージに移動する Invoke("Restart", restartLevelDeray); enabled = false; }else if(other.tag == "Food"){ //食料と接触した場合 //食料を回復 food += pointsPerFood; //ここからpart.13で追加 //増えた食料をUIに表示する foodText.text = "+"+pointsPerFood+" Food: " + food; //ここまでpart.13で追加 //食料を削除 other.gameObject.SetActive(false); }else if(other.tag == "Soda"){ //食料を回復 food += pointsPerSoda; //ここからpart.13で追加 //増えた食料をUIに表示する foodText.text = "+" + pointsPerFood + " Food: " + food; //ここまでpart.13で追加 //ソーダを削除 other.gameObject.SetActive(false); } } //プレイヤーがExitに到達した場合、次のステージを呼び出す private void Restart(){ //シーンを呼び直す SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex,LoadSceneMode.Single); } //プレイヤーが敵に攻撃された場合、食料を減らす public void LoseFood(int loss){ //攻撃を受けたアニメーションを呼び出す animator.SetTrigger("PlayerHit"); //食料を減らす food -= loss; //ここからpart.13で追加 //減らした食料をUIに表示する foodText.text = "-" + loss+ " Food: " + food; //ここまでpart.13で追加 //ゲームオーバーか判定 CheckIfGameOver(); } // Update is called once per frame void Update () { //プレイヤーのターンではない場合、何も実行しない if (!GameManager.instance.playerTurn) { return; } //左右の移動 int horizontal = 0; //上下の移動 int vertical = 0; //左右の移動量を受け取る horizontal = (int)Input.GetAxisRaw("Horizontal"); //上下の移動量を受け取る vertical = (int)Input.GetAxisRaw("Vertical"); //上下左右のいずれかに移動を制限する if(horizontal != 0){ vertical = 0; } //左右上下のいずれかに移動する場合 if(horizontal != 0 || vertical != 0){ //プレイヤーの侵攻方向に壁があるか確認 AttemptMove<Wall>(horizontal, vertical); } } //食料が0いかになった場合、ゲームオーバーにする private void CheckIfGameOver(){ if(food <= 0){ //GameManagerのGameOverを呼び出す GameManager.instance.GameOver(); } } }
2. Hierarchy view > PlayerのInspector内の Player Script > FoodTextに、Canvas > FoodTextをドラッグして設定します。
※これで、ゲーム内で食料が表示されるようになります。
ゲームを実行してみよう!
ゲームを実行してみましょう!プレイヤーが移動すると、食料が減り、Exitにたどり着くと、ステージが遷移することができると思います!
次回予告
次回の記事では、ゲーム内の効果音などサウンドについて書いていきたいと思います。※次回の記事はこちら
www.yagigame.com
※Unityのチュートリアルの章としては、次回は(Audio and Sound Manager)となります!
読んでいただきありがとうございました!
【Unity 2Dローグライク】公式チュートリアルをやってみる part.12~敵のアニメーションの管理
こんにちは!ヤギです!
Unityの2Dローグライクの
公式チュートリアルをやってみる part.12になります!
※前回(part.11)の記事はこちら
www.yagigame.com
記事概要
今回の記事では、敵のアニメーションの管理についてご説明していきます。※part.12に対応する公式チュートリアルの章は、Enemy Animator Controllerです!
unity3d.com
※この記事は、ひよこのたまご様の記事をリスペクトしています。
hiyotama.hatenablog.com
敵のアニメーションコントローラの修正
1. Enemy1のアニメーションコントローラを開きます。2. Enemy1IdleとEnemy1Attackを右クリックし、Make Transitionで矢印を結びます。
3. Animator view > Parameters > +をクリックし、アニメーションを遷移させるTriggerを新規作成します。
※名前はEnemyAttackとします。
4. Enemy1IdleからEnemy1Attackに遷移する矢印をクリックし、Inspector viewを開きます。
5. Conditionsに先ほど作成した、EnemyAttackを設定します。
6. Enemy1Idleはループして表示するため、Has Exit Timeのチェックを外し、アニメーションを即座に切り替えるため、Transition Durationを0にします。
7. Enemy1AttackからEnemyIdleにつながる矢印をクリックし、Inspector viewを開きます。
8. Enemy1Attackは一定時間表示したら、自動でEnemy1Idleに戻るため、Has Exit Timeもチェックをつけたままにします。
9. 一定時間表示する時間を設定するために、Exit Timeを1と設定します。
10. アニメーションを即座に切り替えるため、Transition Durationを0にします。
※8~10の設定後のInspector viewは以下の通りです。
※これで敵のアニメーションコントローラが完成しました!
GameManager.csの修正
GameManager.csをゲーム内のターンなどを管理できるように修正していきます。※ソース内に解説を記載いたしました。ご参照ください。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { //ここからpart.12で追加 public float turnDelay = .1f; //1ターンの時間 private List<Enemy> enemies; //複数の敵を管理 private bool enemiesMoving; //敵の移動フラグ //ここまでpart.12で追加 //クラスに属し、複数のシーンで使われる変数を宣言 //Staticにすることで、他のスクリプトからも呼び出すことができます public static GameManager instance = null; //ここから:part.10で追加 public int playerFoodPoints = 100; //プレイヤーの食料 //HideInspectorをつけることで、Inspector viewに表示されなくなる [HideInInspector] public bool playerTurn = true; //プレイヤーのターンかの判定フラグ //ここまで:part.10で追加 //BoardManager型の変数を宣言 private BoardManager boardScript; //テストとして、敵が出現するレベルの3とする private int level = 3; // AwakeはStartよりも前、最初に呼ばれる void Awake() { //GameManagerが存在しなければ、このオブジェクトを設定する if (instance == null) instance = this; else if (instance != this) //すでに存在する場合、このオブジェクトは不要なため破壊する Destroy(gameObject); //シーン遷移時に、このオブジェクトは破壊せず引き継ぐ DontDestroyOnLoad(gameObject); //ここからpart.12で追加 enemies = new List<Enemy>(); //敵を初期化 //ここまでpart.12で追加 //BoardManagerのコンポーネントを取得 boardScript = GetComponent<BoardManager>(); //ステージ生成の関数を呼ぶための、関数を呼ぶ InitGame(); } void InitGame() { //ここからpart.12で追加 enemies.Clear(); //ステージ移動時は敵をリセットする //ここまでpart.12で追加 //ステージ生成の関数を呼ぶ boardScript.SetupScene(level); } //ここまでpart.10で追加 //ここからpart.12で追加 void Update() { //プレイヤーのターンか、敵の動いている場合は、アップデートしない if (playerTurn || enemiesMoving) return; //敵の動いていない、敵のターンのみ敵を動かす StartCoroutine(MoveEnemies()); } //敵をリストに加える処理 public void AddEnemyList(Enemy script){ enemies.Add(script); } //敵を移動させる処理 IEnumerator MoveEnemies() { //エネミー移動フラグをtrueにする enemiesMoving = true; //1ターン待つ yield return new WaitForSeconds(turnDelay); //敵がいなければ if (enemies.Count == 0) { //1ターン待つ yield return new WaitForSeconds(turnDelay); } //敵の数だけ、敵を移動させる for (int i = 0; i < enemies.Count; i++) { enemies[i].MoveEnemy(); //1ターン待つ yield return new WaitForSeconds(turnDelay); } //プレイヤーのターンにする playerTurn = true; enemiesMoving = false; } //ここまでpart.12で追加 //ここかpart.10で追加 public void GameOver() { //enabledをfalseにすることで、GameManagerが無効になる enabled = false; } }
※これでGameManager.csの修正は完了です。
Enemy.csの修正
最後に、Enemy.csに敵の攻撃アニメーションの呼び出しなどを追加しましょう。※ソースの中に解説を記載しています!
using System.Collections; using System.Collections.Generic; using UnityEngine; //MovingObjectを継承する public class Enemy : MovingObject { public int playerDamage; //プレイヤーへのダメージ private Animator animator; private Transform target; //プレイヤー場所 private bool skipMove; //動くか判定 // Use this for initialization //継承クラス protected override void Start () { //ここからpart.12で追加 //敵をリストに加える GameManager.instance.AddEnemyList(this); //ここまでpart.12で追加 //Animatorコンポーネント取得 animator = GetComponent<Animator>(); //プレイヤーの場所を取得する target = GameObject.FindGameObjectWithTag("Player").transform; //MovingObjectクラスのStartを呼び出す base.Start(); } //敵のターンか判定、移動を試みる処理 protected override void AttemptMove<T>(int xDir, int yDir) { //敵のターンではない場合 if(skipMove){ //敵のターンにする skipMove = false; return; } base.AttemptMove<T>(xDir, yDir); //敵のターンを終わる skipMove = true; } //敵を移動させる処理 public void MoveEnemy(){ int xDir = 0; //左右の移動量 int yDir = 0; //上下の移動量 //敵とプレイヤーの左右の距離がほぼ0の場合 if(Mathf.Abs(target.position.x - transform.position.x) < float.Epsilon){ //プレイヤーが上にいれば、1とし、下にいれば、-1とする yDir = target.position.y > transform.position.y ? 1 : -1; }else{ //プレイヤーが右にいれば、1とし、左にいれば、-1とする xDir = target.transform.position.x > transform.position.x ? 1 : -1; } //移動する AttemptMove<Player>(xDir, yDir); } //敵が移動できない時の処理 protected override void OnCantMove<T>(T component) { //衝突したプレイヤーを設定 Player hitPlayer = component as Player; //ここからpart.12で追加 //プレイヤーに攻撃するアニメーションを呼び出す animator.SetTrigger("EnemyAttack"); //ここまでpart.12で追加 //プレイヤーの食料を減らす hitPlayer.LoseFood(playerDamage); } }
※これでEnemy.csの修正は完了です。
Enemy Prefabの設定を修正する
作成したEnemy.csをEnemyにアタッチしましょう。1. Prefabs > Enemy1とEnemy2をシフトを押しながらクリックし、両方選択します。
2. 画面上部のConponent > Scripts > Enemyをクリックし、Enemy.csをアタッチします。
3. Enemy PrefabのInspector > Blocking Layer をblocking Layerに設定します。
4. Enemy PrefabのInspector > Player Damegeに任意の数値を設定します。
※これで、Enemy Prefabの設定も完了です!
ゲームを実行してみよう!
ここまででゲームを実行してみましょう!プレイヤーや敵がスムーズに動くことが確認できると思います!!!
次回予告
次回の記事では、画面のUIや、ステージのレベル管理について書いていきたいと思います。※次回の記事はこちら
www.yagigame.com
※Unityのチュートリアルの章としては、次回は(Adding UI & Level Transitions)となります!
読んでいただきありがとうございました!
【Unity 2Dローグライク】公式チュートリアルをやってみる part.11~敵の動かし方
こんにちは!ヤギです!
Unityの2Dローグライクの
公式チュートリアルをやってみる part.11になります!
※前回(part.10)の記事はこちら
www.yagigame.com
記事概要
今回の記事では、敵の動かし方についてご説明していきます。※part.11に対応する公式チュートリアルの章は、Writing the Enemy Scriptです!
unity3d.com
※この記事は、ひよこのたまご様の記事をリスペクトしています。
hiyotama.hatenablog.com
敵を動かすスクリプトの作成
1. Enemy.csを作成する。2. 敵を動かすスクリプトを書いていきます。
※ソース内に解説を記載いたしました。ご参照ください。
using System.Collections; using System.Collections.Generic; using UnityEngine; //MovingObjectを継承する public class Enemy : MovingObject { public int playerDamage; //プレイヤーへのダメージ private Animator animator; private Transform target; //プレイヤー場所 private bool skipMove; //動くか判定 // Use this for initialization //継承クラス protected override void Start () { //Animatorコンポーネント取得 animator = GetComponent<Animator>(); //プレイヤーの場所を取得する target = GameObject.FindGameObjectWithTag("Player").transform; //MovingObjectクラスのStartを呼び出す base.Start(); } //敵のターンか判定、移動を試みる処理 protected override void AttemptMove<T>(int xDir, int yDir) { //敵のターンではない場合 if(skipMove){ //敵のターンにする skipMove = false; return; } base.AttemptMove<T>(xDir, yDir); //敵のターンを終わる skipMove = true; } //敵を移動させる処理 public void MoveEnemy(){ int xDir = 0; //左右の移動量 int yDir = 0; //上下の移動量 //敵とプレイヤーの左右の距離がほぼ0の場合 if(Mathf.Abs(target.position.x - transform.position.x) < float.Epsilon){ //プレイヤーが上にいれば、1とし、下にいれば、-1とする yDir = target.position.y > transform.position.y ? 1 : -1; }else{ //プレイヤーが右にいれば、1とし、左にいれば、-1とする xDir = target.transform.position.x > transform.position.x ? 1 : -1; } //移動する AttemptMove<Player>(xDir, yDir); } //敵が移動できない時の処理 protected override void OnCantMove<T>(T component) { //衝突したプレイヤーを設定 Player hitPlayer = component as Player; //プレイヤーの食料を減らす hitPlayer.LoseFood(playerDamage); } }
※これで敵を動かすスクリプトが完成しました。
次回予告
次回の記事では、敵のアニメーションの管理について書いていきたいと思います。※次回の記事はこちら
www.yagigame.com
※Unityのチュートリアルの章としては、次回は(Enemy Animator Controller)となります!
読んでいただきありがとうございました!
【Unity 2Dローグライク】公式チュートリアルをやってみる part.10~プレイヤーの動かし方
こんにちは!ヤギです!
Unityの2Dローグライクの
公式チュートリアルをやってみる part.10になります!
※前回(part.9)の記事はこちら
www.yagigame.com
記事概要
今回の記事では、プレイヤーの動かし方についてご説明していきます。※part.10に対応する公式チュートリアルの章は、Writing the Player Scriptです!
unity3d.com
※この記事は、ひよこのたまご様の記事をリスペクトしています。
hiyotama.hatenablog.com
プレイヤーの管理を行うスクリプト作成
まず初めに、プレイヤーの体力や、ターン、ゲームオーバーを管理するためのスクリプトを作成します。GameManage.csを修正していきます。
※ソースの中に、解説を記載しています。ご参照ください。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { //クラスに属し、複数のシーンで使われる変数を宣言 //Staticにすることで、他のスクリプトからも呼び出すことができます public static GameManager instance = null; //ここから:part.10で追加 public int playerFoodPoints = 100; //プレイヤーの食料 //HideInspectorをつけることで、Inspector viewに表示されなくなる [HideInInspector] public bool playerTurn; //プレイヤーのターンかの判定フラグ //ここまで:part.10で追加 //BoardManager型の変数を宣言 public BoardManager boardScript; //テストとして、敵が出現するレベルの3とする private int level = 3; // AwakeはStartよりも前、最初に呼ばれる void Awake () { //GameManagerが存在しなければ、このオブジェクトを設定する if(instance = null){ instance = this; }else{ //すでに存在する場合、このオブジェクトは不要なため破壊する Destroy(this); } //シーン遷移時に、このオブジェクトは破壊せず引き継ぐ DontDestroyOnLoad(gameObject); //BoardManagerのコンポーネントを取得 boardScript = GetComponent<BoardManager>(); //ステージ生成の関数を呼ぶための、関数を呼ぶ InitGame(); } void InitGame(){ //ステージ生成の関数を呼ぶ boardScript.SetupScene(level); } //ここから:part.10で追加 public void GameOver(){ //enabledをfalseにすることで、GameManagerが無効になる enabled = false; } //ここまで:part.10で追加 }
プレイヤーを動かすスクリプト作成
ここからは、プレイヤーを動かすためのスクリプトを作成していきます。1. Player.csを作成します。
※ソースの中に解説を記載しました。ご参照ください。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; //シーンの読み込みに必要 //MovingObjectクラスを継承する public class Player : MovingObject { public int wallDamage = 1; //壁へのダメージ量 public int pointsPerFood = 10; //食べ物の回復量 public int pointsPerSoda = 20; //ソーダの回復量 public float restartLevelDeray = 1f; //ステージ移動時の時間 private Animator animator; //アニメーション用変数 private int food; //食料 // Use this for initialization //MovingObjectクラスのStartを継承する protected override void Start () { //animatorのコンポーネントを設定 animator = GetComponent<Animator>(); //foodをステージ間で引き継げるように、GameManagerから設定 food = GameManager.instance.playerFoodPoints; Debug.Log(food); //GameObjectのStartを呼び出す base.Start(); } //PlayerのfoodをGameManageに保存する public void OnDisable() { GameManager.instance.playerFoodPoints = food; } protected override void AttemptMove<T>(int xDir, int yDir) { //移動するたびに食料が減る food--; //MovingObjectのAttemptMoveを呼び出す base.AttemptMove<T>(xDir, yDir); RaycastHit2D hit; //ゲームオーバーか確認 CheckIfGameOver(); //プレイヤーのターン終了 GameManager.instance.playerTurn = false; } //プレイヤーが壁にぶつかった場合、壁をチョップする protected override void OnCantMove<T>(T component) { //Wallスクリプトを使えるように設定 Wall hitWall = component as Wall; //壁にダメージを与える hitWall.DamageWall(wallDamage); //チョップするアニメーションを呼び出す animator.SetTrigger("PlayerChop"); } //プレイヤーが、Exit、Food、Sodaと接触した場合に呼び出す private void OnTriggerEnter2D(Collider2D other) { //Exitと接触した場合 if(other.tag == "Exit"){ //ステージ移動の時間分待ってから、次のツテージに移動する Invoke("Restart", restartLevelDeray); }else if(other.tag == "Food"){ //食料と接触した場合 //食料を回復 food += pointsPerFood; //食料を削除 other.gameObject.SetActive(false); }else if(other.tag == "Soda"){ //食料を回復 food += pointsPerSoda; //ソーダを削除 other.gameObject.SetActive(false); } } //プレイヤーがExitに到達した場合、次のステージを呼び出す private void Restart(){ //シーンを呼び直す SceneManager.LoadScene(0); } //プレイヤーが敵に攻撃された場合、食料を減らす private void LoseFood(int loss){ //攻撃を受けたアニメーションを呼び出す animator.SetTrigger("PlayerHit"); //食料を減らす food -= loss; //ゲームオーバーか判定 CheckIfGameOver(); } // Update is called once per frame void Update () { //プレイヤーのターンではない場合、何も実行しない if(!GameManager.instance.playerTurn) return; //左右の移動 int horizontal = 0; //上下の移動 int vertical = 0; //左右の移動量を受け取る horizontal = (int)(Input.GetAxisRaw("Horizontal")); //上下の移動量を受け取る vertical = (int)(Input.GetAxisRaw("Vertical")); //上下左右のいずれかに移動を制限する if(horizontal != 0){ vertical = 0; } //左右上下のいずれかに移動する場合 if(horizontal != 0 || vertical != 0){ //プレイヤーの侵攻方向に壁があるか確認 AttemptMove<Wall>(horizontal, vertical); } } //食料が0いかになった場合、ゲームオーバーにする private void CheckIfGameOver(){ if(food <= 0){ //GameManagerのGameOverを呼び出す GameManager.instance.GameOver(); } } }
※作成したPlayer.csをPlayer Prefabにアタッチしておきましょう!
※これで、プレイヤーを動かすスクリプトが完成です!
次回予告
次回の記事では、敵の動かし方について書いていきたいと思います。※次回の記事はこちら
www.yagigame.com
※Unityのチュートリアルの章としては、次回は(Writing the Enemy Script)となります!
読んでいただきありがとうございました!
【Unity 2Dローグライク】公式チュートリアルをやってみる part.9~プレイヤーのアニメーション作成
こんにちは!ヤギです!
Unityの2Dローグライクの
公式チュートリアルをやってみる part.9になります!
※前回(part.8)の記事はこちら
www.yagigame.com
記事概要
今回の記事では、プレイヤーのアニメーション作成についてご説明していきます。※part.9に対応する公式チュートリアルの章は、Player Animator Controllerです!
unity3d.com
※この記事は、ひよこのたまご様の記事をリスペクトしています。
hiyotama.hatenablog.com
プレイヤーの攻撃アニメーションの設定
1. Player PrefabをHierarchyに戻す。2. Animations > Playerアニメーションコントローラーをクリックします。
※以下のPlayerのAnimation viewが表示されます。
※オレンジのPlayerIdleがデフォルトで呼ばれるアニメーションになります。
3. Paramerers > Triggerをクリックし、名前を「PlayerChop」と「PlayerHit」にします。
※アニメーションを遷移させるためのきっかけの設定をおこなっています。
4. PlayerIdle上で右クリックを押し、MakeTransitionを選択します。
5. 矢印をPlayerChopに繋げます。
※アニメーション間の遷移の関係を設定します。
6. 4~5同様に、PlayerChopからPlayerIdleにも矢印を繋ぎます。
7. PlayerIdleからPlayerChopにつながる矢印をクリックし、Inspector viewを開きます。
8. PlayerIdleはループして表示するため、Has Exit Timeのチェックを外し、アニメーションを即座に切り替えるため、Transition Durationを0にします。
9. ConditionsにPlayerIdleからPlayerChopへ遷移するきっかけのPlayerChop Triggerを設定します。
※Triggerをスクリプトから呼び出すことで、アニメーションを遷移させます。
10. PlayerChopからPlayerIdleにつながる矢印をクリックし、Inspector viewを開きます。
11. PlayerChopは一定時間表示したら、自動でPlayerIdleに戻るため、Has Exit Timeもチェックをつけたままにします。
12. 一定時間表示する時間を設定するために、Exit Timeを1と設定します。
13. アニメーションを即座に切り替えるため、Transition Durationを0にします。
※11~13の設定後のInspector viewは以下の通りです。
※これで、プレイヤーの攻撃アニメーションが完成です!
プレイヤーが攻撃を受けたアニメーションの設定
先ほどの攻撃アニメーションの設定と同様の手順で行います。1. 矢印をPlayerIdleとPlayerHitの間に繋げます。
2. PlayerIdleからPlayerHitにつながる矢印をクリックし、Inspector viewを以下のように設定します。
3. PlayerHitからPlayerIdleにつながる矢印をクリックし、Inspector viewを以下のように設定します。
※これで、プレイヤーが攻撃を受けたアニメーションが完成です!
アニメーションを確認する
1. Game viewとAnimation viewを同時に見れるようにします。2. この画面の状態で、ゲームを実行します。
3. Animation viewのPlayerChop Triggerや、PlayerHit Triggerをクリックします。
※これでアニメーションが正しく遷移するかを確認することができます。
次回予告
次回の記事では、プレイヤーを動かすためのスクリプトについて書いていきたいと思います。※Unityのチュートリアルの章としては、次回は(Writing the Player Script)となります!
※次回の記事はこちら
www.yagigame.com
読んでいただきありがとうございました!
【Unity 2Dローグライク】公式チュートリアルをやってみる part.8~壊せる壁の作り方
こんばんは!ヤギです!
Unityの2Dローグライクの
公式チュートリアルをやってみる part.8になります!
※前回(part.7)の記事はこちら
www.yagigame.com
記事概要
今回の記事では、壊せる壁の作り方についてご説明していきます。※part.8に対応する公式チュートリアルの章は、Creating Destructible Wallsです!
unity3d.com
※この記事は、ひよこのたまご様の記事をリスペクトしています。
hiyotama.hatenablog.com
壊せる壁のスクリプトの作成
1. Wall.csを作成します。2. ソースを書いていきます。
※解説をコード内に記載いたしました。ご参照ください。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Wall : MonoBehaviour { //sprite = 画像 public Sprite dmgSprite; //攻撃された時の壁の画像 public int hp = 4; //壁のHP private SpriteRenderer spriteRenderer; // 画像を表示するコンポーネント // Use this for initialization void Awake () { //コンポーネントを読み込む spriteRenderer = GetComponent<SpriteRenderer>(); } //壁が攻撃されたときに呼ばれる public void DamageWall(int loss){ //攻撃された時の画像を表示 spriteRenderer.sprite = dmgSprite; //HPを減らす hp -= loss; //hpが0以下になった場合 if(hp <= 0){ //壁を無効にする gameObject.SetActive(false); } } }
壁にスクリプトを適用する
1. Prefabsフォルダを開きます。2. Wall(1~8)を選択し、Add Componentをクリックします。
3. Wallを選択し、アタッチします。
※これで全てのWall Prefabに、Wall.csのスクリプトが適用されました。
4. Wall1 > Wall(Script) > Dmg SpriteにScavengers_SpriteSeet_48を設定します。
5. Wall2にScavengers_SpriteSeet_49を、同様にWall3からWall8にScavengers_SpriteSeet_50以降を設定します。
これで、壊れる壁の設定は完了です。
次回予告
次回の記事では、プレイヤーのアニメーションの設定について書いていきたいと思います。※Unityのチュートリアルの章としては、次回は(Player Animator Controller)となります!
読んでいただきありがとうございました!
【Unity 2Dローグライク】公式チュートリアルをやってみる part.7~オブジェクトの動かし方
こんばんは!ヤギです!
Unityの2Dローグライクの
公式チュートリアルをやってみる part.7になります!
※前回(part.6)の記事はこちら
www.yagigame.com
記事概要
今回の記事では、プレイヤーや敵などのオブジェクトを動かすためのスクリプトについてご説明していきます。※今回作成するスクリプトは抽象クラスとなります。
※part.7に対応する公式チュートリアルの章は、Moving Object Scriptです!
unity3d.com
※この記事は、ひよこのたまご様の記事をリスペクトしています。
hiyotama.hatenablog.com
オブジェクトを動かすスクリプトの作成
1. MovingObject.csを作成します。2. ソースを書いていきます。
※解説をコード内に記載いたしました。ご参照ください。
using System.Collections; using System.Collections.Generic; using UnityEngine; //抽象クラスとして作成していく public abstract class MovingObject : MonoBehaviour { public float moveTime = 0.1f; // //動く時間 public LayerMask blockingLayer; private BoxCollider2D boxCollider; //コンポーネント private Rigidbody2D rd2D; //コンポーネント private float inverseMoveTime; // Use this for initialization //継承クラスでオーバーライドできるようにする protected virtual void Start () { //コンポーネントを取得する boxCollider = GetComponent<BoxCollider2D>(); rd2D = GetComponent<Rigidbody2D>(); inverseMoveTime = 1f / moveTime; } //移動可能か判断する ※blockingLayerに衝突する場合、移動しない //boolはtrueかfalseを返す //outで指定した変数は、取得可能になる protected bool Move(int xDir,int yDir, out RaycastHit2D hit){ //現在地を取得 Vector2 start = transform.position; //移動先を取得 Vector2 end = start + new Vector2(xDir, yDir); //自身のColliderを一旦無効化する ※startとendの間にblockingLayerがあるか確認するときに不要なため boxCollider.enabled = false; //現在地と移動先の間にblockingLayerがあるか確認、ある場合取得 hit = Physics2D.Linecast(start, end, blockingLayer); //確認が終わったため、Colliderを有効化する boxCollider.enabled = true; //現在地と移動先の間に、BlockingLayerがなければ移動する if(hit.transform == false){ StartCoroutine(SmoothMovement(end)); //移動可能 return true; } //移動不可 return false; } //継承クラスでオーバーライドできるようにする //移動を試し、書が異物がある場合、移動不可の場合の処理を呼び出す protected virtual void AttemptMove <T>(int xDir, int yDir) where T : Component //後からコンポーネントを決める { RaycastHit2D hit; //Moveメソッドを実行し、移動可能か判定する bool canMove = Move(xDir, yDir, out hit); //hitがnullの場合 ※現在地から目的地の間にblockingLayerに該当するものがない場合 if(hit.transform == null){ return; } //現在地から目的地の間にblockingLayerに該当するものがある場合 //障害物のコンポーネントを取得 T hitComponet = hit.transform.GetComponent<T>(); //障害物がある場合、移動不可の場合の処理を呼び出す if(!canMove && hitComponet != null){ OnCantMove(hitComponet); } } //現在地から目的地までの距離を求めて移動する protected IEnumerator SmoothMovement(Vector3 end){ //目的地までの距離を計算 ※現在地:transform.position、目的地:end、距離を求める:.sqrMagnitude float sqrRemainingDistance = (transform.position - end).sqrMagnitude; //目的地に限りなく近くまで繰り返し実行する while(sqrRemainingDistance > float.Epsilon){ //1フレームあたりの移動距離を計算する ※Time.deltaTime:1フレームあたりの時間 Vector3 newPosition = Vector3.MoveTowards(rd2D.position, end, inverseMoveTime * Time.deltaTime); //移動距離分、移動する rd2D.MovePosition(newPosition); //移動した場所から、目的地までの距離を再計算する sqrRemainingDistance = (transform.position - end).sqrMagnitude; //移動するのに1フレーム使うため、1フレーム待機 yield return null; } } //抽象クラス protected abstract void OnCantMove<T>(T component) where T : Component; }
スクリプトの説明
- Generic機能:後から、型を指定する機能になります。障害物が敵と壁というように複数ある際に、どちらに衝突しているかで、衝突後の処理を変えるために使います。
- 抽象クラス:継承して使うためのクラスです。※抽象クラスだけでは、処理が完成しません。
- 継承クラス:抽象クラスを継承して使います。※抽象クラス内のabstractを指定したメソッドを上書きして処理を行えるようにします。
- AttemptMove
(int xDir, int yDir) :移動を試し、障害物がある際は、移動不可の場合の処理を呼び出します。 - Move(int xDir,int yDir, out RaycastHit2D hit):移動可能か判断します。可能な場合移動します。※AttemptMoveから呼び出されます。
- SmoothMovement(Vector3 end):現在地から目的地までの距離を求めて移動します。
- OnCantMove
(T component) :障害物がある場合の処理を行います。※Generic機能を使い、障害物(敵や壁)によって処理を切り替えます。
次回予告
次回の記事では、壊せる壁の作り方について書いていきたいと思います。※次回の記事はこちら
www.yagigame.com
※Unityのチュートリアルの章としては、次回は(Creating Destructible Walls)となります!
読んでいただきありがとうございました!
【Unity 2Dローグライク】公式チュートリアルをやってみる part.6~ランダムなステージ生成2
こんばんは!ヤギです!
Unityの2Dローグライクの
公式チュートリアルをやってみる part.6になります!
※前回(part.5)の記事はこちら
www.yagigame.com
- 記事概要
- ステージ作成を呼ぶスクリプト(GameManager.cs)の作成
- GameManagerとPrefab(敵やアイテム)を紐付ける
- ゲームを写すカメラの修正
- GameManagerを呼び出すスクリプト(Loader.cs)の作成
- 次回予告
記事概要
今回の記事では、ゲームのステージをランダムに生成するためのスクリプトを呼ぶ方法をご説明していきます。※part.6に対応する公式チュートリアルの章は、Writing the Game Managerです!
unity3d.com
※この記事は、ひよこのたまご様の記事をリスペクトしています。
hiyotama.hatenablog.com
ステージ作成を呼ぶスクリプト(GameManager.cs)の作成
1. Hierarchy viewのGameManagerに、スクリプト(BoardManager.csとGameManage.cs)をアタッチします。2. GameManager.csを開き、スクリプトを書きます。
※スクリプトの中に、解説を書いております。ご参照ください。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { //クラスに属し、複数のシーンで使われる変数を宣言 //Staticにすることで、他のスクリプトからも呼び出すことができます public static GameManager instance = null; //BoardManager型の変数を宣言 public BoardManager boardScript; //テストとして、敵が出現するレベルの3とする private int level = 3; // AwakeはStartよりも前、最初に呼ばれる void Awake () { //GameManagerが存在しなければ、このオブジェクトを設定する if(instance = null){ instance = this; }else{ //すでに存在する場合、このオブジェクトは不要なため破壊する Destroy(this); } //シーン遷移時に、このオブジェクトは破壊せず引き継ぐ DontDestroyOnLoad(gameObject); //BoardManagerのコンポーネントを取得 boardScript = GetComponent<BoardManager>(); //ステージ生成の関数を呼ぶための、関数を呼ぶ InitGame(); } void InitGame(){ //ステージ生成の関数を呼ぶ boardScript.SetupScene(level); } }
GameManagerとPrefab(敵やアイテム)を紐付ける
1. Hierarchy view > GameManagerを選択し、Inspectorを表示する。2. この後の手順で1で開いたInspectorを常に表示するために、鍵マークをクリックしロックする。
3. Prefabs > Exit をInspectorview > Exitにドラッグする。
4. Prefabs > Floor(1~8)を全て、Inspector > Floor Tilesにドラッグする。
※複数のFloor Prefabを選択して、まとめてドラッグ可能です。
5. 同様にPrefabs > Wall(1~8)をInspector > Wall Tilesにドラッグする。
6. Prefabs > FoodとSodaをInspector > Food Tilesにドラッグする。
7. Prefabs > Enemy(1~2)をInspector > Enemy Tilesにドラッグする。
8. Prefabs > OuterWall(1~3)をInspector > OuterWall Tilesにドラッグする。
※1~8を実施すると、GameManagerのInspectorは下記のようになります。
9. GameManagerのInspectorの修正が全て完了したので、ロックを解除しておきます。
10. GameManagerが完成したので、Prefabsフォルダにドラッグし、Prefabにしておきます。
※この状態で、ゲームを実行してみましょう!
※カメラがずれていますが、ステージが生成されています!感動!
ゲームを写すカメラの修正
ステージが全て表示されるように、カメラの位置を修正していきます。1. Hierarchy > Main Cameraをクリックし、Inspector viewを開きます。
2. Inspector > Transform > Position のxとyを、3.5に変更します。
3. backgroundを黒色に変更します。
※この状態で、ゲームを実行してみましょう!
※カメラがずれずに、ステージが生成されています!とても感動!
GameManagerを呼び出すスクリプト(Loader.cs)の作成
GameManagerを呼び出すスクリプトを作成していきます。1. Project > Create > C#scriptをクリックし、Loader.csを作成します。
2. Loader.csを開き、スクリプトを書きます。
※スクリプトの中に、解説を書いております。ご参照ください。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Loader : MonoBehaviour { //GameManager変数を宣言 public GameObject gameManager; // 最初に呼び出される関数 void Awake () { //GameManagerが存在しなければ if(GameManager.instance == null){ //GameManagerを作成する ※InspectorでGameObjectにGameManagerを設定する Instantiate(gameManager); } } }
3. Loader.csをMainCameraにドラッグし、紐付けます。
4. MainCameraのInspector > Loader.cs > GameObjectにGameManageのPrefabを設定します。
※1~4を実施後のMainCameraのInspectorは下記のようになります。
5. 最後にHierarchy > GameObjectは削除しておきます。
ランダムなステージの作成は以上で完了となります!
次回予告
次回の記事では、オブジェクトの動かし方について書いていきたいと思います。※次回の記事はこちら
www.yagigame.com
※Unityのチュートリアルの章としては、次回は(Moving Object Script)となります!
読んでいただきありがとうございました!
【Unity 2Dローグライク】公式チュートリアルをやってみる part.5~ランダムなステージ生成
こんにちは!ヤギです!
Unityの2Dローグライクの
公式チュートリアルをやってみる part.5になります!
※前回(part.4)の記事はこちら
www.yagigame.com
記事概要
今回の記事では、ゲームのステージをランダムに生成するためのスクリプトを作成します!※part.5に対応する公式チュートリアルの章は、Creating the Tile Prefabsです!
unity3d.com
※この記事は、ひよこのたまご様の記事をリスペクトしています。
hiyotama.hatenablog.com
スクリプトの前準備
1. Project > Create > c#Scriptから、スクリプトを2つ作成します。※名前をBordManagerと、GameManagerとします。
2. Hierarchy > Create Emptyでからのゲームオブジェクトを作成します。
※名前をGameManagerとします。
スクリプト(BoardManager)の作成
ステージを生成するためのスクリプト(BoardManager)を書いていきます。※スクリプト内にコメントに説明を書きましたので、ご参照ください。
using System.Collections; using System.Collections.Generic; //配列を使う using UnityEngine; using System; using Random = UnityEngine.Random; //ランダム要素を使う public class BoardManager : MonoBehaviour { [Serializable] //Inspectorに表示する public class Count{ public int minimum; public int maximum; public Count(int min, int max){ minimum = min; maximum = max; } } public int columns = 8; //ステージの横幅 public int rows = 8; //ステージの縦幅 public Count wallCount = new Count(5, 8); //壁の個数の最小と最大を決める public Count foodCount = new Count(1, 5); //食料の個数の最小と最大を決める public GameObject exit; public GameObject[] floorTiles; public GameObject[] wallTiles; public GameObject[] foodTiles; public GameObject[] enemyTiles; public GameObject[] outerWallTiles; private Transform boardHolder; //オブジェクトの位置を保存 private List<Vector3> gridPositions = new List<Vector3>(); //オブジェクトを配置できる範囲を指定 //敵やアイテム、内側の壁(Wall)を配置できる位置を特定 void InitializeList(){ //gridPositionsを初期化 gridPositions.Clear(); //gridPositionsに敵やアイテムを配置できる範囲を設定する //横方向の範囲 for (int x = 1; x < columns - 1; x++){ //縦方向の範囲 for (int y = 1; y < rows - 1; y++){ //範囲をgridPositionsに追加していく gridPositions.Add(new Vector3(x, y, 0f)); } } } //外側の壁(OuterWall)、床を配置する void BoardSetUp(){ //boradHolderを位置情報を持つゲームオブジェクト(Board)として初期化する boardHolder = new GameObject("Board").transform; for (int x = -1; x < columns + 1; x++){ for (int y = -1; y < rows + 1; y++){ //床をランダムに選択 GameObject toInstantiate = floorTiles[Random.Range(0, floorTiles.Length)]; if(x == -1 || x == columns || y == -1 || y == rows){ //ステージの外周には、OuterWallを選択する toInstantiate = outerWallTiles[Random.Range(0, outerWallTiles.Length)]; } //選択した床や、壁を実際に生成する GameObject instance = Instantiate(toInstantiate, new Vector3(x, y, 0f), Quaternion.identity) as GameObject; //生成したオブジェクトをBoardオブジェクトの子オブジェクトとする instance.transform.SetParent(boardHolder); } } } //ランダムな位置を返す Vector3 RandomPosition() { //返す位置の範囲は、アイテムを配置できる範囲 int randomIndex = Random.Range(0, gridPositions.Count); //ランダムな位置の座標を取得 Vector3 randomPosition = gridPositions[randomIndex]; //重複しないように、取得した場所は削除する gridPositions.RemoveAt(randomIndex); //位置の座標を返す return randomPosition; } //敵やアイテム、内側の壁(Wall)を配置する ※SetupSceneから呼ばれる void LayoutObjectAtRandom(GameObject[] tileArray,int minimum, int maximum){ //ランダムな回数ループする int objectCount = Random.Range(minimum,maximum+1); for (int i = 0; i < objectCount; i++){ //gridPositionからランダムな位置を取得 Vector3 randomPosition = RandomPosition(); //tileArrayからオブジェクトの種類をランダムに選択 GameObject tileChoice = tileArray[Random.Range(0, tileArray.Length)]; //ランダムで決めた位置に、ランダムに決めたオブジェクトを配置 Instantiate(tileChoice, randomPosition, Quaternion.identity);[f:id:yagigame:20181031102151p:plain] } } //レベルに応じてステージを作成する ※GameManager.csから呼ばれる public void SetupScene(int level){ //外側の壁(OuterWall)、床を配置する BoardSetUp(); //敵やアイテム、内側の壁(Wall)を配置できる位置を特定 InitializeList(); //敵やアイテム、内側の壁(Wall)を配置する LayoutObjectAtRandom(wallTiles, wallCount.minimum, wallCount.maximum); LayoutObjectAtRandom(foodTiles, foodCount.minimum, foodCount.maximum); //敵の数をLogで計算 int enemyCount = (int)Mathf.Log(level,2f); LayoutObjectAtRandom(enemyTiles, enemyCount, enemyCount); //出口を右上に配置する Instantiate(exit, new Vector3(columns - 1, rows - 1, 0f), Quaternion.identity); } }
スクリプト説明
- InitializeList():以下の画面の範囲にに、敵や食料を配置する場所を設定します。
- BoardSetUp():以下の画面の範囲に、外側の壁を設定します。
- RandomPosition():ゲームオブジェクトを配置するランダムな座標を特定します。
- LayoutObjectAtRandom(GameObject[] tileArray,int minimum, int maximum):実際に、敵やアイテムを配置します。
- SetupScene:上4つの関数を呼び出すことで、ステージを作成します。
※ランダムなステージを作成するためのスクリプト(BoardManager)が完成しました!
次回予告
次回の記事では、今回作成したBordManagerを呼び出すGameManagerの作成について書いていきたいと思います。次回の記事で、ランダムなステージの作成が完了します。
※Unityのチュートリアルの章としては、次回は(Writing the Game Manager)となります!
読んでいただきありがとうございました!
【Unity 2Dローグライク】公式チュートリアルをやってみる part.4~床やアイテムの作成
こんばんは!ヤギです!
Unityの2Dローグライクの
公式チュートリアルをやってみる part.4になります!
※前回(part.3)の記事はこちら
www.yagigame.com
記事概要
今回の記事では、ゲームに登場する床や、アイテムを作っていきます!※part.4に対応する公式チュートリアルの章は、Creating the Tile Prefabsです!
unity3d.com
※この記事は、ひよこのたまご様の記事をリスペクトしています。
hiyotama.hatenablog.com
床の作成
まず初めに床を作っていきます。1. 空のゲームオブジェクトを作成し、名前をFloor1とします。
2. Inspector view > Add ComponentからSprite Rendererを追加します。
3. Sprite RendererのSpriteにScavengers_SpriteSheet_32を設定します。
4. Sprite RendererのSorting LayerをFloorに変更します。
5. Floor1をPrefabsフォルダにドラッグし、Prefabにします。
※これで一つ目の床が完成しました。
6. Hierarchy viewのFloor1の名前をFloor2と変えます。
7. Sprite RendererのSpriteにScavengers_SpriteSheet_33を設定します。
8. Floor2をPrefabsフォルダにドラッグし、Prefabにします。
※6~7を繰り返し、Floor8まで作ります。
出口(Exit Tile)の作成
1. Hierarchy viewのFloor8の名前をExitと変えます。2. Sprite RendererのSpriteにScavengers_SpriteSheet_20を設定します。
3. プレイヤーが出口に到達したことを検知するために、Box Collider 2Dをアタッチします。
4. 出口にプレイヤーが衝突して、到達できないことを防ぐために、Is Triggerにチェックを付けます。
5. Sprite RendererのSorting LayerをItemsに変更します。
6. TagをExitに変更します。
7. ExitをPrefabsフォルダにドラッグし、Prefabにします。
※これで出口の完成です。
食料(Food)の作成
1. Hierarchy viewのExitの名前をExitと変えます。2. Sprite RendererのSpriteにScavengers_SpriteSheet_19を設定します。
3. TagをFoodに変更します。
4. FoodをPrefabsフォルダにドラッグし、Prefabにします。
※これで食料の完成です。
ソーダの作成
1. Hierarchy viewのFoodの名前をSodaと変えます。2. Sprite RendererのSpriteにScavengers_SpriteSheet_18を設定します。
3. TagをSodaに変更します。
4. SodaをPrefabsフォルダにドラッグし、Prefabにします。
※これでソーダの完成です。
壁の作成
※壁は2種類作成します。1. Hierarchy viewのSodaの名前をOuterWall1と変えます。
2. Sprite RendererのSpriteにScavengers_SpriteSheet_25を設定します。
3. 壁にプレイヤーが侵入できないようにするために、Is Triggerのチェックを外します。
4. TagをUnTaggedに変更します。
5. Sprite RendererのSorting LayerをFloorに変更します。
6. LayerをBlockingLayerに設定します。
7. OuterWall1をPrefabsフォルダにドラッグし、Prefabにします。
※これで一つ目の壁の完成です。
8. Hierarchy viewのOuterWall1の名前をOuterWall2と変えます。
9. Sprite RendererのSpriteにScavengers_SpriteSheet_26を設定します。
10. OuterWall2をPrefabsフォルダにドラッグし、Prefabにします。
※8~10までを繰り返して、OuterWall3まで作ります。
11. Sprite RendererのSorting LayerをItemsに変更します。
12. Hierarchy viewのOuterWall3の名前をWall1と変えます。
13. Sprite RendererのSpriteにScavengers_SpriteSheet_21を設定します。
14. Wall1をPrefabsフォルダにドラッグし、Prefabにします。
※12~14までをくりかえっして、Wall8まで作ります。
以上で、床やアイテムの作成が完了となります!
次回予告
次回の記事では、ランダムなステージの生成方法について書いていきたいと思います。※次の記事はこちら
www.yagigame.com
※Unityのチュートリアルの章としては、次回は(Writing the Board Manager)となります!
読んでいただきありがとうございました!
【Unity 2Dローグライク】公式チュートリアルをやってみる part.3~エネミーの作成
こんばんは!ヤギです!
Unityの2Dローグライクの
公式チュートリアルをやってみる part.3になります!
※前回(part.2)の記事はこちら
www.yagigame.com
記事概要
今回の記事では、ゲームに登場するエネミーを作っていきます!※基本的には、par.2の記事で紹介したプレイヤーにアニメーションと付けた方法と同様の方法になります。
※part.2に対応する公式チュートリアルの章は、Player and Enemy Animationsです!
unity3d.com
※この記事は、ひよこのたまご様の記事をリスペクトしています。
hiyotama.hatenablog.com
エネミー(1体目)の作成
1. Hierarchy > Create > Create Emptyをクリックし、Enemy1とします。2. Project view > Sprites のエネミーの画像を選択し、ゲームオブジェクトのEnemy1にドラッグします。
※アニメーションの名前は、Enemy1Idleとします。
3. 2と同様に以下のエネミーの画像を選択し、ゲームオブジェクトのEnemy1にドラッグします。
※アニメーションの名前は、Enemy1Attackとします。
4. Enemy1のInspector viewから Add Component > Box Collider 2Dを選択し、コンポーネントを追加します。
5. Enemy1のInspector viewから Add Component > Rigidbody 2Dを選択し、コンポーネントを追加します。
※4と5を実施すると、Enemy1のInspector viewにコンポーネントが追加されます。
6. Rigidbody 2D > Body Type > Kinematicを選択します。
7. ゲームオブジェクトのEnemy1のInspector viewから、Tag > Enemyを選択します。
8. Layer > Blocking Layerを選択します。
9. Sorting Layer > Unitsを選択します。
10. Hierarchy viewのEnemy1を、Project > Prefabsにドラッグし、Enemy1をプレハブ化します。
※これで1体目の敵が完成いたしました。
エネミー(2体目)の作成
Hierarchy viewのEnemy1を修正することで、もう一体のエネミー(Enemy2)を作っていきます。1. Hierarchy view > Enemy1の名前をEnemy2に変更します。
2. Project view > Sprites のエネミー2用の画像を選択し、ゲームオブジェクトのEnemy2にドラッグします。
※アニメーションの名前は、Enemy2IdleとEnemy2Attackとします。
3. Project > Animationsフォルダ > Emey1のアニメーターコントローラをクリックし、Animator viewを開きます。
4. Animator viewから、Enemy2IdleとEnemy2Attackを削除します。
5. Project > Create > Animator Override Controller をクリックし、名前をEnemy2とします。
※Enemy1と同じ制御で、アニメーションを動かすためのアニメーターコントローラを作ります。
6. Enemy2のアニメーターコントローラのInspector viewのControllerにEnemy1のアニメーターコントローラをドラッグします。
7. 6のInspector viewにEnemy2IdleとEnemy2Attackもドラッグします。
※手順6と7を実施後のEnemy2のアニメーターコントローラは次のようになります。
8. Enemy2のInspector viewを開き、Animator > ControllerをEnemy2のアニメーターコントローラに変更します。
9. Hierarchy viewのEnemy2を、Project > Prefabsにドラッグし、Enemy2をプレハブ化します。
※これで2体目の敵が完成いたしました。
シーンの保存
10. Hierarchy viewからEnemy2を削除します。※Prefabにしているため、いつでも再度利用できます。
11 シーンの名前をMainとして、Scenesフォルダに保存します。
これで、今回の記事で紹介する内容は以上です!
敵が2体作成できました!
次回予告
次回の記事では、床や、壁、アイテムなどを作っていきたいと思います!※次回の記事はこちらになります。
www.yagigame.com
※Unityのチュートリアルの章としては、次回は(Creating the Tile Prefabs)となります!
読んでいただきありがとうございました!
【Unity 2Dローグライク】公式チュートリアルをやってみる part.2~プレイヤーの作成
こんばんは!ヤギです!
Unityの2Dローグライクの
公式チュートリアルをやってみる part.2になります。
※part.1の記事はこちら
yagigame.hatenablog.com
記事概要
今回の記事では、ゲームで自分が動かすプレイヤーを作っていきます!※前回の記事はこちら
※part.2に対応する公式チュートリアルの章は、Player and Enemy Animationsです!
unity3d.com
※この記事は、ひよこのたまご様の記事をリスペクトしています。
hiyotama.hatenablog.com
プレイヤーの作成
1. Hierarchy view > Create > Create Emptyをクリックし、ゲームオブジェクトを作成する。※名前を、Playerとする。
2. Project view > Sprites のプレイヤーの画像を選択し、ゲームオブジェクトのPlayerにドラッグします。
3. Create New Animation画面が表示されるので、PlayerIdleという名前で、Animationsフォルダに保存します。
※Animationsフォルダがない場合は、新規作成します。
※Animationsフォルダの中に、2つのアニメーションとコントローラがセットで作成されます。
4. 同様の手順で、PlayerChopと、PlayerHitのアニメーションのセットを作ります。
5. Playerのアニメーターコントローラをクリックし、Animator viewを起動します。
6. PlayerIdleをクリックし、表示されたInspector viewのspeedを0.5にします。
※これで、表示されるアニメーションがゆっくりになります。
7. ゲームオブジェクトのPlayerのInspector viewから、Tag > Playerを選択します。
8. Layer > Blocking Layerを選択します。
9. Sorting Layer > Unitsを選択します。
10. PlayerのInspector viewから Add Component > Box Collider 2Dを選択し、コンポーネントを追加します。
11. PlayerのInspector viewから Add Component > Rigidbody 2Dを選択し、コンポーネントを追加します。
※10と11で追加したコンポーネントによって、衝突判定が可能になります。
※この状態で、実行してみましょう!Playerが重力によって落下してしまいます。
12. Rigidbody 2D > Body Type > Kinematicを選択します。
※これで落下しなくなりました。
13. Box Collider 2D > sizeをxとy共に0.9としておきます。
※衝突検知の範囲を設定します。
14. Hierarchy viewのPlayerを、Project > Prefabsにドラッグし、Playerをプレハブ化します。
※Prefabsフォルダがない場合は、フォルダを新規作成しましょう。
※Prefabが作成されました!
15. Hierarchy viewのPlayerは削除します。
※Prefabを作成しているため、いつでもHierarchyにPlayerを再作成可能です。
これでPlayerが完成しました!
次回予告
次回の記事では、Enemyを作っていきたいと思います!※次回の記事はこちらになります。
www.yagigame.com
※Unityのチュートリアルの章としては、次回も今回と同じ章(Player and Enemy Animations)となります!
読んでいただきありがとうございました!
【Unity 2Dローグライク】公式チュートリアルをやってみる part.1~導入~
こんにちは!ヤギです!
Unityでローグライクゲームを作れるようになりたいと思い、Unity公式の2Dローグライクのチュートリアルにチャレンジすることにしました!
チャレンジしながら、記事を書いていきます!
記事概要
今回の記事では、Unityの公式チュートリアルの2Dローグライクゲームをインポートし、実際にゲームを体験するところまで書いていきます。※part.1に対応する公式チュートリアルの章は、Project Introductionです!
unity3d.com
※この記事は、ひよこのたまご様の記事をリスペクトしています。
hiyotama.hatenablog.com
Unityとプロジェクトをインストールする
1. リンクからUnityの公式サイトにいきUnityをインストールする。Personal版であれば、無料で使うことができます!
store.unity.com
2.Unityを起動し、新規プロジェクトを作成する。
※2Dのゲームのため、形式は2Dを選択します。
3. UnityのAsset Storeから2Dローグライクのプロジェクトをインポートする。
※インポートすると、Project Viewに表示されます。
※_Complete-Gameフォルダに完成版が入っています。
完成版で遊んでみる
Project viewの_Complete-Gameシーンを開き、実行すると完成版のゲームで遊ぶことができます。これから作るのがどのようなゲームなのか体験してみましょう!
次回予告
次回は、ゲームで自分が操作するPlayerの作成方法について紹介していきます!※次回の記事はこちらになります。
www.yagigame.com
※Unityのチュートリアルの章としては、「Player and Enemy Animations」になります。
記事を読んでいただきありがとうございました!
引き続き2Dローグライクについての記事を書いていきたいと思います!
【Unity】アプリのアイコンとタイトルを設定する方法
こんにちは!ヤギです!
昨日初めて、Google Playにアプリをリリースしましたが、
インストールすると、アイコンがUnityのデフォルトのままでした。
play.google.com
- Google Developer コンソールにはちゃんと画像を保存したのに,,,,
- Google Playからのインストールも問題なくできるのに....
途方に暮れていましたが、この方の記事に出会い、解決しました!
freesworder.net
Unity内でアイコンとタイトルを設定する
アプリのアイコンとタイトルは、Google Developer コンソールに登録するのかと思っていました。しかし、実はUnity内で設定しておく必要がありました!
設定の方法について、ご紹介いたします。
アイコンとタイトルの設定方法
1. File > Build Settings > Player Settingsをクリックします。2. Product nameにタイトルを、Default Iconにアイコンを設定します。
※アイコンを設定する時は、Project viewに設定したいアイコンを配置し、Default Iconにドラックします!
これで、アプリのアイコンとタイトルを設定することが出来ます!
修正したアプリをリリースする方法
修正したアプリをリリースするためには、再度apkファイルを作成する必要があります。その際、Versionを既にリリース済みのapkファイルより上げなければいけません。
※以下の方法で、バージョンを上げて、aokファイルを作成することが出来ます。
※この方法以外にも、バージョンを上げる方法はあると思います。
3. Player Settings > Bundle Version Code を前回リリース時の数字より大きくする。
4. Buildしapkファイルを作成し、Google Developer コンソールからリリースする。
これで、修正したアプリをリリースすることが可能です。
今回も読んでいただきありががとうございました!
【Unityゲーム】スワイプの速度を測るゲームを作る 最終回
こんにちは!ヤギです!
スワイプの速度を測るゲームを作るの最終回となります!
※今回の記事では、Google Playへのリリース方法も紹介しています!
前回からの更新点
前回の記事から、以下2つの機能を追加しています!- フォントを変更する!
- ベストスコアをセーブ、ロードして表示する!
汎用的な技術のため、別の記事として紹介いたしました!
yagigame.hatenablog.com
yagigame.hatenablog.com
※ここまでで、ゲームとしては完成となります!
※完成したゲームは、Google Playで公開しています!
よろしければ、遊んでみてください!
play.google.com
Google Playへのリリースの方法
Google Playへのリリースの方法について、簡単にご紹介いたします。1. Google Play コンソールに登録する。
※25ドル必要です。
developer.android.com
2. Google Playコンソールから、リリースするアプリの情報を入力する。
※アプリのアイコン(512*512 PNG形式)など、ゲーム以外の素材も必要となります。
※リリースするためには、署名付きapkファイルが必要になります。
※apkファイルの作り方を紹介していきます!
3. Unityから署名付きapkファイルを作成する。
3.1 File > Build Settings > Player Settingsをクリックする。3.2 Publishing Setting > Create a new keystoneにチェックをつける。
3.3 Browse Keystone をクリックし、任意の名前で保存する。
3.4 任意のパスワードを入力する。
3.5 Key > Alias > create new keyをクリックする。
※3.6の画面が表示されます。
3.6 Key Creation画面に以下の必須情報を入力し、Create Keyをクリックする。
・Alias:キーの名前
・Password/Confirm:パスワード
・First and Last name:名前
3.7 この状態で、Buildすることで署名付きapkファイルが作成されます。
これで署名付きapkファイルを作成することができました!
皆様も是非、Google Playにアプリをリリースしてください!
記事を読んでいただきありがとうございました!