日々是好日~every day is a good day~

日常の中の非日常の備忘録

【Unity】アクションの選択

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