ChatGPTにUnityのコードレビュー、リファクタリングをしてもらったら驚いた
ChatGPTでコードレビューができるという事を聞いて
Unityで過去に自作したイケてないコードをレビューしてもらいました。
想像していたよりもレビューしてくれて驚きました。
(回答は間違っている可能性もあるので自分の目で再度確認&動作チェック等する必要があります)
機能単位でコードレビュー、簡単なサンプルコードの作成、Unityの使い方等、参考になるところをいただいたり、使い道がいろいろあって自分のような初心者にとってとてもイイです!
以下はChatGPTのやりとりです。
CharGPTでの会話
自分:
下記のUnityのコードをレビューしてください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class chgobj : MonoBehaviour
{
GameObject child_1;
GameObject child_2;
GameObject child_3;
void Start()
{
child_1 = this.transform.Find("FrostFlame").gameObject;//子オブジェクトの名前から子オブジェクトを取得
child_2 = this.transform.Find("ArcaneOrbitSphere").gameObject;
child_3 = this.transform.Find("ShadowSpray").gameObject;
}
public void obj_chg1()
{
child_1.SetActive(false);//子オブジェクトをすべて非アクティブにする
child_2.SetActive(false);
child_3.SetActive(false);
child_1.SetActive(true);//所望のオブジェクトをアクティブにする
}
public void obj_chg2()
{
child_1.SetActive(false);
child_2.SetActive(false);
child_3.SetActive(false);
child_2.SetActive(true);
}
public void obj_chg3()
{
child_1.SetActive(false);
child_2.SetActive(false);
child_3.SetActive(false);
child_3.SetActive(true);
}
}
ChatGPT:
このUnityコードは、スクリプトを使用して子オブジェクトのアクティブ状態を制御することができるコンポーネントです。コードの理解とレビューを以下に示します。
まず、3つのGameObject変数が宣言されています。これらの変数は、Start()メソッドでそれぞれの子オブジェクトに対して参照を設定します。Start()メソッドは、スクリプトが最初に有効になったときに実行されるので、これによりオブジェクトの参照がキャッシュされ、実行時のパフォーマンスが向上します。
その後、3つの公開メソッドがあります。それぞれのメソッドは、SetActive()メソッドを使用して、子オブジェクトを切り替えるためのコードを含みます。SetActive()メソッドは、指定したオブジェクトをアクティブまたは非アクティブに切り替えるために使用されます。
各メソッドでは、すべての子オブジェクトを非アクティブにし、所望の子オブジェクトをアクティブにします。これにより、指定された子オブジェクトが表示され、他の子オブジェクトが非表示になります。
総じて、このコードは、子オブジェクトの表示を制御するための簡単でわかりやすい方法を提供します。しかし、一部の改善点があります。
例えば、スクリプトが複数のオブジェクトにアタッチされている場合に対処するために、各子オブジェクトの名前に一意の識別子を含める必要があります。
また、スクリプトを効率的に実行するために、SetActive()メソッドの呼び出しを可能な限り少なくすることが望ましいです。
自分:
そのレビュー内容をもとにコードをリファクタリングしてください。
ChatGPT:
リファクタリングを行い、コードをより効率的に、そして機能的にしましょう。以下は、リファクタリングされたコードです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectSwitcher : MonoBehaviour
{
[SerializeField] private GameObject[] childObjects;
private int activeIndex = -1;
private void Start()
{
for (int i = 0; i < childObjects.Length; i++)
{
childObjects[i].SetActive(false);
}
}
public void SwitchTo(int index)
{
if (index < 0 || index >= childObjects.Length)
{
return;
}
if (activeIndex != -1)
{
childObjects[activeIndex].SetActive(false);
}
childObjects[index].SetActive(true);
activeIndex = index;
}
}
まず、chgobjクラスからObjectSwitcherクラスに変更します。次に、3つのGameObject変数を配列childObjectsに置き換えます。これにより、メソッド内で長いリストを操作する必要がなくなり、コードが簡潔になります。
次に、アクティブな子オブジェクトのインデックスを示すactiveIndexを追加し、デフォルト値を-1に設定します。activeIndexは、選択した子オブジェクトがすでにアクティブな場合に、
前のオブジェクトを非アクティブにするために使用されます。
Start()メソッドでは、すべての子オブジェクトを非アクティブにするように変更します。これにより、すべてのオブジェクトが表示されていない状態でスクリプトが開始されます。
最後に、SwitchTo()メソッドを追加します。このメソッドでは、引数に指定されたインデックスの子オブジェクトをアクティブにし、前のアクティブなオブジェクトを非アクティブにします。
indexが無効な場合は、メソッドを終了します。
このように、コードをリファクタリングすることで、より効率的で柔軟性のあるコードが実現されます。
ChatGPTとは?
折角なのでChatGPTで聞いてみました。