前回 「**に出会った」というメッセージを表示しました
今回はメッセージ表示後に次のアクションの選択肢を表示して 選択した方を実行するまでをやっていきます
1.ヒエラルキーのCanvasを右クリックして UI/画像を選択
2.位置横の四角をクリック
アンカープリセットのbottom/rightをAltキーを押しながらクリック
3.位置や大きさを調整し 画像をドラッグ&ドロップ
オブジェクトの名前を分かりやすいようにSelectLeftに変更
4.SelectLeftを右クリックし UI/古い機能/テキストを選択
5.位置横の四角をクリック
アンカープリセットのstretch/stretchをAltキーを押しながらクリック
6.メッセージと同じフォントをドラッグ&ドロップ
テキストは「こんにちは」と入力 フォントサイズは45 オブジェクト名はSelectLeftTextに変更
7.SelectLeftを右クリックし 複製を選択
8.位置を調整し オブジェクトの名前をSelectRight テキストをSelectRightTextに変更
テキストは「バイバイ」と入力
9.MessageBox SelectLeft SelectRightのチェックを外して非表示にする
10.Witchを編集
using System.Collections; using UnityEngine; using UnityEngine.UI; public class Witch : MonoBehaviour { [SerializeField] GameObject messageBox; [SerializeField] Text messageText; [SerializeField] GameObject selectLeft; [SerializeField] Text selectLeftText; [SerializeField] GameObject selectRight; [SerializeField] Text selectRightText; [SerializeField] GameObject player; private int select = 0; //0:左選択 1:右選択 private void Update() { if (!player.GetComponent<PlayerWalk>().isWalk) { select = SelectLR(select); if (Input.GetKeyDown(KeyCode.Space)) //スペースキーが押されたら決定 { if(select == 0) //左(こんにちは)選択 { player.GetComponent<Sound>().SeHellow(); } else //右(バイバイ)選択 { player.GetComponent<Sound>().SeByebye(); } messageBox.SetActive(false); //非表示 selectLeft.SetActive(false); selectRight.SetActive(false); player.GetComponent<PlayerWalk>().isWalk = true; //プレーヤーは歩く } } } private void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.tag == "Player") { player.GetComponent<PlayerWalk>().isWalk = false; //プレーヤーは動かない StartCoroutine(TypeMessage("魔女に出会った")); } } IEnumerator TypeMessage(string message) { messageText.text = ""; foreach (char letter in message) { messageBox.SetActive(true); messageText.text += letter; yield return new WaitForSeconds(1f / 5); } //選択肢を表示(初めに左側が選択されている状態にする) select = 0; selectLeft.SetActive(true); selectLeftText.color = Color.red; selectRight.SetActive(true); selectRightText.color = Color.black; } //今回OnCollisionExit2Dは不要 /*private void OnCollisionExit2D(Collision2D collision) { if (collision.gameObject.tag == "Player") { messageBox.SetActive(false); } }*/ private int SelectLR(int currentNo) { //→キーを押されたら右側が選択されている状態 if (Input.GetKeyDown(KeyCode.RightArrow)) { if (currentNo < 1) { currentNo++; selectRightText.color = Color.red; selectLeftText.color = Color.black; } } //←キーを押されたら左側が選択されている状態 if (Input.GetKeyDown(KeyCode.LeftArrow)) { if (currentNo > 0) { currentNo--; selectLeftText.color = Color.red; selectRightText.color = Color.black; } } return currentNo; } }
11.PlayerにアタッチしているSoundを編集
using UnityEngine; public class Sound : MonoBehaviour { public AudioClip walk; public AudioClip hellow; public AudioClip byebye; AudioSource audioSource; // Start is called before the first frame update void Start() { audioSource = GetComponent<AudioSource>(); } public void SoundWalk() { audioSource.PlayOneShot(walk); } public void SeHellow() { audioSource.PlayOneShot(hellow); } public void SeByebye() { audioSource.PlayOneShot(byebye); } }
12.PlayerにアタッチしているPlayerWalkを編集
using UnityEngine; public class PlayerWalk : MonoBehaviour { [SerializeField] int moveSpeed; //移動スピード private Rigidbody2D rb; private Animator playerAnim; public bool isWalk = true; // Start is called before the first frame update void Start() { rb = this.GetComponent<Rigidbody2D>(); playerAnim = this.GetComponent<Animator>(); } // Update is called once per frame void Update() { if (isWalk) { rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")).normalized * moveSpeed; if (rb.velocity != Vector2.zero) { playerAnim.enabled = true; //方向とアニメーションを連動 if (Input.GetAxisRaw("Horizontal") != 0) //横方向の移動 { if (Input.GetAxisRaw("Horizontal") > 0) //右 { playerAnim.SetFloat("X", 1f); playerAnim.SetFloat("Y", 0); } else //左 { playerAnim.SetFloat("X", -1f); playerAnim.SetFloat("Y", 0); } } else if (Input.GetAxisRaw("Vertical") > 0) //後 { playerAnim.SetFloat("X", 0); playerAnim.SetFloat("Y", 1f); } else //前 { playerAnim.SetFloat("X", 0); playerAnim.SetFloat("Y", -1f); } } else //止まっている { playerAnim.enabled = false; } } //以下のelse{ }部分を追加 else { playerAnim.enabled = false; } } }
13.WitchオブジェクトのWitchスクリプトにSelectLeft SelectLeftText SelectRight SelectRightText Playerをドラッグ&ドロップ
14.PlayerオブジェクトのSoundスクリプトに準備した音声をドラッグ&ドロップ
これで実行すると
プレーヤーが魔女に近づくとメッセージが表示され 次のアクションを選択できるようになります
←キー →キーで左右を選択 スペースキーで決定です
決定したアクションが実行され プレーヤーはまた移動できるようになります
(再生できなくなっていたので2024.1.25に修正しました)