ChatGPT(AI) vs 現役のUnityプログラマー 対決！！

![27089.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389614/67e30b4f-3f28-76ce-41c3-8ffba3be7596.png)

この記事は、[ChatGPT](https://openai.com/blog/chatgpt/)と現役のUnityプログラマーの対決の記録です。
※ 質問は日本語でおこなっておりますが、ChatGPTの回答は英語なので日本語に翻訳しています。

# 対決のルール
[質問者] プログラマー
[回答者] ChatGPT(AI)

回答者(ChatGPT)が回答できなかったり、的外れだったり、回答漏れがあった時点でダウンとします。
質問者(プログラマー)はダウン中に回答者を上回る回答ができればKO、質問者の勝利となります。
逆に質問者の質問が無くなった時点で回答者の勝利です。

# 対決直前 質問者控え室
まず、**AIになんて負ける気がしません。**
プログラムには専門というものがあって、コードが書けるからと言ってUnityプログラマーとして通用する訳では無いのです。ボコボコにしてやりますかねぇぇ。ポキポキ

# 第1ラウンド
まず無言で問題のあるコードを投げてみます。

### 質問
```C#
using UnityEngine;

public sealed class TestLearnClass : MonoBehaviour
{
    void Update()
    {
        transform.position += new Vector3(0, 0.1f, 0);
    }
}
```

### Chat GPTの回答
UnityのC#スクリプトです。`TestLearnClass`は`MonoBehaviour`を継承しており、`sealed`と表示されているので、これ以上継承することはできません。`Update`メソッドは1フレームに1回呼ばれ、このスクリプトがアタッチされているオブジェクトの`transform.position`を更新することで、Y軸方向に0.1単位上方向に移動させます。

### まぁ理解はしてるけども…ねぇ
確かにその通り。AIがUnityのAPIやC#を理解できてるのに正直驚いたけど、そんな事よりこのコードには問題がありますよねぇ？(大人気ない)

# 第2ラウンド
1ラウンドでKOだと思いますけど念の為質問してみます。

### 質問

このプログラムの問題点を教えてください。

### Chat GPTの回答
このプログラムには大きな問題はないです。しかし、改善するための提案としては

1. `Update`メソッドで`Time.deltaTime`を使って、移動のフレームレートを独立させる。
2. オブジェクトが無制限に移動しないように、オブジェクトの境界をチェックする機能を追加する。
3. パブリック変数を追加して、移動速度を調整できるようにする。

### !!!?
あれ？こいつ思ったよりやるぞ。「問題無いけど、こうした方がいいよ。」ってコードを書いた人への配慮をAIがするの！？ しかも、移動範囲や速度調整の提案までしてくれて好きなタイプの回答者かもしれん…

# 第3ラウンド
いやいや、ちょっとおでれぇたけどまだまだこれからですねぇ！！

### 質問
提案の1,3を修正しました。2に関しては今は考慮しない事にしました。ありがとうございました。修正したコードのパフォーマンスを追求するコードを教えてください。

```C#
using UnityEngine;

public sealed class TestLearnClass : MonoBehaviour
{
    [SerializeField] float _speed;
    
    void Update()
    {
        transform.position += new Vector3(0, 0.1f, 0) * (_speed * Time.deltaTime);
    }
}
```

### Chat GPTの回答
このスクリプトのパフォーマンスを向上させるために、最適化を行うことができます。
`transform`をキャッシュする。`transform`に何度もアクセスするのは良く無いので、`Awake`メソッド内のプライベート変数にキャッシュしておくと、パフォーマンスが向上します。

```C#
private Transform _transform;

private void Awake()
{
    _transform = transform;
}

void Update()
{
    _transform.position += new Vector3(0, 0.1f, 0) * (_speed * Time.deltaTime);
}
```

### マジか!!!?
おい！コード書きだしたぞ！
しかも質問者の事を考えて、聞かれれば答える、小出しにできる押し付けがましくない回答者！？俺ならもうラウンド2でこの解答をしてる。やるな

# 第4ラウンド
実力は分かりました。正直ここまでできるとは思っていませんでした。
次で決めますかねぇ！

### 質問

下記コードのパフォーマンスを上げる方法を教えてください。

```C#
using UnityEngine;

public sealed class TestLearnClass : MonoBehaviour
{
    [SerializeField] float _speed;

    Transform _transform;

    void Awake()
    {
        _transform = transform;
    }
    
    void Update()
    {
        _transform.position += (new Vector3(0, 0.1f, 0) * _speed) * Time.deltaTime;
    }
}
```

### Chat GPTの回答

以下は、コード内のパフォーマンスを向上させるための追加ヒントです。

1. `new Vector3(0, 0.1f, 0)`の代わりに`Vector3.up`を使用します。`Vector3.up`は定義済みの定数で、これを使う方が`new Vector3(0, 0.1f, 0)`を使うより読みやすく、高速です。
2. 直接の変形修正ではなく、`rigidbody2D.velocity`を使用する。`GameObject`に`Rigidbody2D`コンポーネントがある場合、`rigidbody2D.velocity`を使って動きを制御する方が、`transform.position`を修正するよりも効率的な場合があります。
3. `lerp`使用を検討する：動きが滑らかで緩やかであるべき場合、`Vector3.Lerp`を使用して現在の位置と目標位置の間を補間することができます。

```C#
using UnityEngine;

public sealed class TestLearnClass : MonoBehaviour
{
    [SerializeField] float _speed;

    Rigidbody2D _rigidbody2D;
    Transform _transform;

    void Awake()
    {
        _transform = transform;
        _rigidbody2D = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        if (_rigidbody2D != null)
        {
            _rigidbody2D.velocity = Vector3.up * _speed;
        }
        else
        {
            _transform.position += Vector3.up * _speed * Time.deltaTime;
        }
    }
}
```

# 決着
**Chat GPTのダウン！！！！！質問者の回答に入ります。**

2と3は置いといて、確かに1の`Vector3.up`(定数)にすれば`new`が1つ減りパフォーマンスが上がりますが、更に`_speed`と`Time.deltaTime`で掛けた方が`new`が1つ減って早いんですねぇ！！(大人気ない)

```C#
void Update()
{
    // += (Vector3 * float) * float より
    _transform.position += (Vector3.up * _speed) * Time.deltaTime;
    // ↓ += Vector3 * (float * float) の方がパフォーマンス良い
    // Vector3 * floatは内部的にはnew Vector3(Vector3.x * float, Vector3.y * float, Vector3.z * float)に置き換えられる
    _transform.position += Vector3.up * (_speed * Time.deltaTime);
}
```

もっと言うと、使える場所は限られますが、`transform.localPosition`への代入の方が更に高速ですねぇ(大人気ない)


**カンカンカン 第4ラウンド KO 現役Unityプログラマーの勝利！！！！！！**

# 勝利者インタビュー
勝ちましたが大人気無いなんて言わないでください。これが勝負です。
人格では負けてるって言う人が居ますけど、勝負に人格は関係ないですねぇ！！
(プログラマー)

# あとがき
ChatGPTの実力に正直ビビりました。
開発者の一人としてAIが活躍する日も遠くなさそうですね。
これは負けられない！！いや、擦り寄るべきか？！

以上となります。
最後まで読んでいただきありがとうございました！