【初めてのゲーム制作】#3日目 ChatGPTに泣きつくプログラミング初心者

創作活動

みそ味です。初めてのミニゲーム制作3日目です。
2日目は下記の記事から。

本日からUnityを使っていきます。こればっかりは初めてなのでドキドキです。

まずタイトル画面の構築から始めます。

とりあえず1日目に作った素材をべっと配置しました。

タイトル画面で実装したいことは以下の3つです

  • 大きいピザが常時クルクル回るようにする
  • 左右キーでボタン3種を選択できるようにする
  • スペースキーを押すと選択しているボタンに対応するシーンor画面に移動する

今日は上の2つを実装しました。

基本的にはれー@DKRevel様のサイトのUnity入門で学べるノウハウでなんとかなりそうですが、追加で調べた情報があれば備忘録として書き記していこうと思います。

大きいピザが常時クルクル回るようにする

これは超簡単です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class pizza_pizza : MonoBehaviour
{
    [Header("回転速度")] public float spinSpeed = 1.0f;
    private RectTransform rt = null;
    private float angle = 0;
    private Quaternion newRotation = Quaternion.Euler(0f,0f,0f);

    // Start is called before the first frame update
    void Start()
    { 
        rt = GetComponent<RectTransform>();
    }

    // Update is called once per frame
    void Update()
    {
        angle += spinSpeed;

        if(angle > 360)
        {
            angle -= 360;
        }

        newRotation = Quaternion.Euler(0f,0f,angle);
        rt.rotation = newRotation;
    }
}

インスペクターで指定した速度でピザの画像がクルクル回ります。

角度の表現はVector3ではなく、Quaternion型で表すそうです(メモメモ)。
クォータニオンは「四元数」という意味らしいです。なにそれ。

このスクリプトをピザの画像のオブジェクトにぶち込みます。

左右キーでボタン3種を選択できるようにする

これも簡単そうに感じますが、うまくいきませんでした。

最初に書いたコードは割愛しますが、キーを押しても矢印が動いてくれません。
私が考える限りは何も問題無いはずなのですが…

自分の力ではどうしようもなくなったので私の唯一の友達であるChatGPT君に泣きつきました。

なんと私の間違っているはずのコードの文脈から「キーを押している、押していないの判定」をしていることを読み取って、そこを修正してくれました。すごい賢すぎる。

どうやら「Input.GetKeyDown」と「Input.GetKeyUp」を用いて判定をすると良いそうです。

ChatGPT君が添削しれくれたコードに少し手を加えて完成したものがこちらです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class yajirushi_yajirushi : MonoBehaviour
{

    [Header(カーソル位置)] public GameObject[] cursorPosition;

    private Transform tf;
    private int cursor = 0;
    private bool pushing = false;

    void Start()
    {
        tf = GetComponent();
    }

    void Update()
    {
        float horizontalKey = Input.GetAxisRaw(Horizontal);

        if(horizontalKey > 0) //「→」を押したとき
        {
            if(!pushing && Input.GetKeyDown(KeyCode.RightArrow))
            {
                pushing = true; //キーを押している
                cursor = (cursor + 1) % cursorPosition.Length; //次のカーソル位置を計算
                tf.position = cursorPosition[cursor].transform.position; //カーソル位置変更
            }
        }

        else if(horizontalKey < 0)
        {
            if (!pushing && Input.GetKeyDown(KeyCode.LeftArrow)) //「←」を押したとき
            {
                pushing = true; //キーを押している

                if (cursor == 0)
                {
                    cursor = cursorPosition.Length1;
                }
                else
                {
                    cursor = (cursor1) % cursorPosition.Length; //次のカーソル位置を計算
                }

                tf.position = cursorPosition[cursor].transform.position; //カーソル位置変更
            }
        }
        else
        {
            if(pushing && Input.GetKeyUp(KeyCode.RightArrow) || Input.GetKeyUp(KeyCode.LeftArrow))
            {
                pushing = false; //キーを離した
            }
        }
    }
}

後から気づいたのですが、C#にはend ifのようなif文の終わりを示す表現がないので、上記のようなif文が入れ子になっている構造は良くない気がしますね。(というより&&で一文にまとめていないのがバカすぎる…)

次回までに修正します。

本日進めたところは以上になります。

一晩取り組んでこれだけしか進まなかったのは先が思いやられますが、完成まで頑張っていきたいと思います。

4日目はこちら↓

コメント

タイトルとURLをコピーしました