Open5

生成AIにGDScriptを書かせてみる

ピン留めされたアイテム
SLMNLLSLMNLL

これは何?

フリーのゲーム開発エンジンである GodotEngine のスクリプト言語であるGDScriptChatGPT 生成AIに出力させてみる実験の記録です。

SLMNLLSLMNLL

(ChatGPT) プレイヤーと床との衝突判定を書かせてみる

こちらからは以下の通り、質問しました。

大変お忙しいところ恐縮ですが、差し支えなければ、プレイヤーと床の衝突を判定するコードをご提案いただけますか?プレイヤーはWASDで動かせるものとし、言語はGDScriptとします[1]

返答は以下の通りでした:

もちろんです。こちらがプレイヤーと床の衝突を判定するための基本的なGDScriptコードです。

extends KinematicBody

# プレイヤーの名前を「Player」から変更してください
var player = Player.new()

# 床の名前を「Floor」から変更してください
var floor = Floor.new()

# この関数は毎フレーム呼び出されます
func _physics_process(delta):
  # プレイヤーと床の衝突を判定します
  if player.is_colliding(floor):
    # 衝突が検知された場合、プレイヤーを床の上に保つようにします
    player.position.y = floor.position.y

このコードでは、プレイヤーが KinematicBody であると、床が StaticBody であるという前提があります。プレイヤーや床が異なるタイプの場合は、必要に応じてコードを調整してください。

さらに、このコードでは、プレイヤーが床をすり抜けるのを防ぐだけです。他の種類の衝突を処理するための追加ロジックを追加する必要があります(例えば、プレイヤーが水平に移動した場合や、プレイヤーがジャンプして天井にぶつかった場合)。また、より複雑な衝突を処理するための追加コードを追加する必要があります(例えば、プレイヤーが傾斜地上に立っている場合や、プレイヤーがゲーム内のその他のオブジェクトと衝突した場合)。

このような内容でよろしければお手伝いいたします。ご質問がある場合は、お気軽にお申し付けください。

WASDのくだりは無視されていますが[2]、ひとまずプレイヤーと床の衝突判定らしきものは出力してくれますし、コードの中のコメントも良い感じです。

また、コード中では言及されていませんが、補足説明部分に、PlayerFloorのクラスが、それぞれKinematicBodyStaticBodyであるという点も言及されています。他にも傾斜がある際や、床以外のオブジェクトとの衝突に関して、注意が必要なこともアドバイスしてくれています。

すごい。

脚注
  1. AI相手でも言葉遣いひとつでパフォーマンスが変わる…とはいえ、慇懃ですね。 ↩︎

  2. 質問の仕方が悪かったのだと思われます。 ↩︎

SLMNLLSLMNLL

(ChatGPT) GDScriptじゃない言語を出力してしまうことがある

例えば、以下のような質問をした際に、少なくともGDScriptじゃないコード[1]を返してきました。


Q. GDScriptでの三項演算子の書き方を教えてください。

脚注
  1. Javaっぽいですが、セミコロンがないのでちょっと違う。 ↩︎

SLMNLLSLMNLL

間違いを指摘してあげることもできます。

Q. 提案してくれたコードはGDScriptのものではありません。GDScriptでは以下のように書きます。

result = "positive" if x >= 0 else "negative"

A. ありがとうございます。ご指摘いただいたコードでは、三項演算子を使用して、条件が真の場合に「"positive"」、偽の場合に「"negative"」を返すように記述されています。

三項演算子は、GDScriptでもPythonでも同じように書くことができます。次のようなコードも同じ結果を返します。

# 三項演算子を使用しない場合
if x >= 0:
  result = "positive"
else:
  result = "negative"

# 三項演算子を使用する場合
result = "positive" if x >= 0 else "negative"

三項演算子を使用することで、条件分岐を行う if 文よりも短く、簡潔で読みやすいコードを書くことができます。そのため、三項演算子は、条件式が真の場合に一つの値を返し、偽の場合に別の値を返す処理を行う場合によく使用されます。

SLMNLLSLMNLL

(Phind) 数値のパディングをやらせてみる

今度は、コーディングの性能がchatGPT4より高いということで、最近少し話題になっているPhindを試してみます。

GDScriptで数値のパディングをやってもらいました。

Godot Engineで使われているGDScriptについての質問です。

2桁の0埋め数値を返すようなコードを書きたいです。
return "FILE_NAME_TEMPLATE" + var_to_str(index) + ".tres"
以上のようにファイル名を自動的に設定するようなコードを書きました。indexには0~99の整数が入るのですが、現状では0埋めではありません。このindexを0埋め2桁の文字列にしたいです。

例えば01, 02, 03, 10, 17, 20…のような感じです。

どのように書き換えるべきでしょうか?

pad_zero()関数を用いた方法を提示してくれました[1]。ちゃんと動くコードです。

脚注
  1. ちなみにGodot Japan User Communityを参考ページとして提示してくれましたが、そのページで扱われているのは、右記のようなフォーマット文字列を使った方法です。print("%05d" % 555) # 00555 ↩︎