見出し画像

AIはリフティングで協力できる?

前回、AIにリフティングをさせてみました。
今回は、2体のAIにリフティングをさせてみます。

今日のハイライト
最初は仲が悪くても、プログラム一つで仲良く協力!

最初のAIたちはボールを奪い合う
成長した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で実行すると、ボールを奪い合って大変です。

サッカーマンガの最初のようにチームメイトでも仲がわるいですねw

担当範囲を決める

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: # 担当範囲ならボールを追跡

リフティング・デュオの実演!

なんかスゲー!

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

誰かのお役に立てれば最高です!


使用ツール

アドバイザー

いいなと思ったら応援しよう!