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

[KuMA Advent Calendar 2022](https://adventar.org/calendars/8188)　7日目の記事です．

[ChatGPT](https://chat.openai.com/chat) という賢いAIが登場したので，Unityのスクリプトを書いてもらいます．

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


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459660/c02dc7d3-e18c-2901-6867-43fdb36c4040.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459660/19892b92-2ca4-52ea-8d5f-64426879adf3.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459660/e758f89c-5b23-1896-ffa3-fa9faa0256fb.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459660/1e2da2dc-d337-2e79-f24a-93dba950f6fa.png)

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

<iframe width="560" height="315" src="https://www.youtube.com/embed/1KZdSRKSu6Y" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

動きましたね！

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459660/489507b2-7521-da95-37ee-17c9ce8c1b7d.png)
~~~CameraController.cs
public Transform target; // 追従するオブジェクト

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

~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459660/c23d6526-2c56-7a0b-9d07-72ce3ba9533b.png)


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

実装結果は以下のようになりました．
<iframe width="560" height="315" src="https://www.youtube.com/embed/MjzMzn_uXV4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


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

このままだとアバターが前を向いたまま横にスライドするような歩き方をしていて不自然なので，今度はキャラクターが進行方向を向く処理を追加してもらおうと思います．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459660/a58dc950-2387-8865-0d1b-84a828b34a17.png)

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

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