前回 「**に出会った」というメッセージを表示しました
今回はメッセージ表示後に次のアクションの選択肢を表示して 選択した方を実行するまでをやっていきます
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に修正しました)