6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【ChatGPT】AIにUnityのスクリプトを書かせてみる

Last updated at Posted at 2022-12-06

KuMA Advent Calendar 2022 7日目の記事です.

ChatGPT という賢いAIが登場したので,Unityのスクリプトを書いてもらいます.

今回は,キー入力で3Dのキャラクターを歩かせるコードを書いてもらおうと思います.スーパーマ〇オブラザーズで,方向ボタンを押してマ〇オを歩かせる部分のイメージです.

image.png

CharacterController.cs
using UnityEngine;

public class CharacterController : MonoBehaviour
{
    // 歩行アニメーションを再生するためのAnimatorコンポーネント
    private Animator animator;

    // 初期化処理
    void Start()
    {
        // Animatorコンポーネントを取得
        animator = GetComponent<Animator>();
    }

    // 1フレーム毎に呼び出される処理
    void Update()
    {
        // 入力がある間
        if (Input.anyKey)
        {
            // 歩行アニメーションを再生する
            animator.SetBool("IsWalking", true);
        }
        else
        {
            // 歩行アニメーションを停止する
            animator.SetBool("IsWalking", false);
        }
    }
}

image.png

このコードを読むと,アニメーションの再生は行われているようですが,「キャラクターをキー入力で動かす」という処理が書かれていません.「動かす」の定義が曖昧だったかもしれません.もう一度注文してみます.

image.png

CharacterController.cs
using UnityEngine;

public class CharacterController : MonoBehaviour
{
    // 歩行アニメーションを再生するためのAnimatorコンポーネント
    private Animator animator;

    // 移動速度
    public float speed = 1.0f;

    // 初期化処理
    void Start()
    {
        // Animatorコンポーネントを取得
        animator = GetComponent<Animator>();
    }

    // 1フレーム毎に呼び出される処理
    void Update()
    {
        // 入力がある間
        if (Input.anyKey)
        {
            // 歩行アニメーションを再生する
            animator.SetBool("IsWalking", true);

            // 入力されたキーに応じて、キャラクターを移動させる
            if (Input.GetKey(KeyCode.UpArrow))
            {
                // キャラクターを前方に移動させる
                transform.position += Vector3.forward * speed * Time.deltaTime;
            }
            else if (Input.GetKey(KeyCode.DownArrow))
            {
                // キャラクターを後方に移動させる
                transform.position += Vector3.back * speed * Time.deltaTime;
            }
            else if (Input.GetKey(KeyCode.LeftArrow))
            {
                // キャラクターを左方向に移動させる
                transform.position += Vector3.left * speed * Time.deltaTime;
            }
            else if (Input.GetKey(KeyCode.RightArrow))
            {
                // キャラクターを右方向に移動させる
                transform.position += Vector3.right * speed * Time.deltaTime;
            }
        }
        else
        {
            // 歩行アニメーションを停止する
            animator.SetBool("IsWalking", false);
        }
    }
}

image.png

これなら動きそうです.Unityに実装して動かした結果は以下のようになりました.

動きましたね!

カメラが固定されているので,カメラをキャラクターの移動に合わせて動かすコードも書いてもらいます.

image.png

CameraController.cs
public Transform target; // 追従するオブジェクト

void Update()
{
    transform.position = target.position; // カメラの位置をキャラクターの位置に設定する
    transform.rotation = target.rotation; // カメラの向きをキャラクターの向きに設定する
}

image.png

targetを指定してそのオブジェクトの座標と回転を代入しているようです.
targetをキャラクターに指定してしまうとキャラクター位置とカメラ位置が完全に一致してうまく映らなさそうです.
ここは人間側が忖度して,アバターの子に追従用のtargetオブジェクトを用意します.

実装結果は以下のようになりました.

確かに,キャラの移動に合わせてカメラが動くようになりました!いい感じです!

このままだとアバターが前を向いたまま横にスライドするような歩き方をしていて不自然なので,今度はキャラクターが進行方向を向く処理を追加してもらおうと思います.
image.png

AIさんも疲れたようなので,今日はここで終わろうと思います.

これからはAIにコーディングの手伝いをしてもらいながらプログラミングをするのが当たり前になるのかもしれないと感じました.

6
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?