
AIはリフティングで協力できる?
前回、AIにリフティングをさせてみました。
今回は、2体のAIにリフティングをさせてみます。
今日のハイライト
最初は仲が悪くても、プログラム一つで仲良く協力!


ステージにキャラを追加
AI_Toss_LとRを追加
AI_Tossを複製して新しいキャラを作りました。
・前回作ったAI_Tossをファイルシステム内でCTR+Dで複製
・複製した方の名前をAI_Toss_Rに変更
・AI_Tossの名前をStage_Toss_Lに変更
・AI_Toss_RをStage_Tossにドラッグ&ドロップ
・AI_Toss_Lを左、AI_Toss_Rを右に配置

ボールを奪い合う
F5で実行すると、ボールを奪い合って大変です。

担当範囲を決める
AI_Toss_Lを左、AI_Toss_Rを右に配置し、それぞれの担当範囲を決めます。
そのためには、スクリプトをLとRで分けます。
スクリプトをLRで分ける
・ファイルシステムでAI_Toss.gdを二つ複製
・名前をAI_Toss_L.gdとAI_Toss_R.gdに変更
・AI_Toss_Lを選択し、スクリプトアイコンをクリックしてスクリプト削除
・スクリプトアイコンを再びクリック
・「スクリプトをアタッチする」のフォルダマークを押す
・「スクリプトを開く」のAI_Toss_L.gdを選択し開く
・AI_Toss_Rも同じようにしてスクリプトをAI_Toss_R.gdに変更する


担当範囲の設定をスクリプトに設定
・担当範囲を中央で分け、Lは0-320、Rは320-640に設定
・ボールが相手の担当に移ったら待機ポジションに移動
LとRのスクリプトを追加・修正
初期設定
・待機ポジションを設定(Lは160、Rは480)
L用の初期設定の追加分
var m_position = 160 # Lの待機ポジション
R用の初期設定の追加分
var m_position = 480 # Rの待機ポジション
ボールを追跡
・もともとの「ボールを追跡」を削除
・ボールが担当範囲(320以内)ならボールを追跡
・担当範囲外なら、待機ポジションへ移動
・待機ポジションについたら待機
「ボールを追跡」L用の追加・修正分
# ボールを追跡(L)
elif ball_position.x < 320: # 担当範囲ならボールを追跡
velocity.x = direction.x * speed
if not kick_in and is_on_floor():
$AnimatedSprite2D.play("move")
$AnimatedSprite2D.flip_h = velocity.x < 0
elif abs(global_position.x - m_position) > 10: # 待機場所へ移動
var m_direction = global_position.direction_to(Vector2(m_position,0))
velocity.x = m_direction.x * speed
$AnimatedSprite2D.play("move")
$AnimatedSprite2D.flip_h = false
else:
velocity.x = 0 # 待機
「ボールを追跡」R用の変更箇所のみ
# ボールを追跡(R)
elif ball_position.x > 320: # 担当範囲ならボールを追跡
リフティング・デュオの実演!

なんかスゲー!
最初はボールを奪い合ってましたが、少しプログラムをいじってあげれば、仲良くリフティングできました。
彼らが成長したわけではないけど感動です。
誰かのお役に立てれば最高です!