Unityプロジェクト「ML-Agents:Penguin」part5
0.はじめに
本記事では、Unityが無料で提供しているプロジェクト「ML-Agents:Penguin」の制作方法を日本語版にして全6回に分けてやっていきます。
第5回は、Scene構成です。
1.赤ちゃんペンギンのPrefabを作成
(1)プロジェクトウィンドウの"Penguin"内にある「Prefabs」フォルダーから『BabyPenguin』をダブルクリックし、編集画面にする。以降、インスペクターウィンドウ内での説明です。
(2)Rigdbodyの設定
①「Add Component → Physics」から『Rigdbody』を選択
②"Rigdbody"内にある『Constraints』を展開して、位置や回転のX、Y、Zを次のように設定して、ロックする。
・"Freeze Position"のX、Zにチェック
・"Freeze Rotation"のX、Y、Zにチェック
(3)Sphere Colliderの設定
①「Add Component → Physics」から『Sphere Collider』を選択
②"Sphere Collider"内を次のように設定する。
・"Center"を(X: 0, Y: 0.24, Z: 0)
・"Radiusを 0.25
(4)タグの作成
①"Tag"を展開して、「Add Tag...」を選択
②"Tags"にある「List is Empty」の枠にある "+"をクリック
③『baby』と入力して、「Save」をする
④ヒエラルキーウィンドウから"BabyPenguin"をクリックして、再度編集画面を出し、"Tag"を『baby』に変える
※このタグの名前が違うと、プログラムが動作しないこともあるので、間違いえないように
2.魚のPrefabを作成
(1)プロジェクトウィンドウの"Penguin"内にある「Prefabs」フォルダーから『Fish』をダブルクリックし、編集画面にする。
(2)Rigdbodyの設定
①「Add Component → Physics」から『Rigdbody』を選択
②"Rigdbody"内にある『Constraints』を展開して、"Freeze Rotation"のX、Zにチェック
(3)Capsule Colliderの設定
①「Add Component → Physics」から『Capsule Collider』を選択
②"Capsule Collider"内を次のように設定する。
・"Center"を(X: 0, Y: 0, Z: -0.08) ←マイナスあることに注意
・"Radiusを 0.15
・"Height"を 0.66
・"Direction"を Z-Axis
(4)タグの作成
①「baby」タグと同じ要領で新規タグ作成まで進む。
③『fish』と入力して、「Save」をする。
④ヒエラルキーウィンドウから"Fish"をクリックして、再度編集画面を出し、"Tag"を『fish』に変える。
(5)スクリプトの追加
スクリプトの追加方法は2通りある。
①"Scripts"フォルダーからドラッグする方法
②「Add Component → Scripts」から選択する方法
どちらでもよいので、『Fish(.cs)』を追加する。
3.ペンギンエージェントを作成
(1)プロジェクトウィンドウの"Penguin"内にある「Prefabs」フォルダーから『Penguin』をダブルクリックし、編集画面にする。
(2)Rigdbodyの設定
①「Add Component → Physics」から『Rigdbody』を選択
②"Rigdbody"内にある『Constraints』を展開して、"Freeze Rotation"のX、Zにチェック
(3)Capsule Colliderの設定
①「Add Component → Physics」から『Capsule Collider』を選択
②"Capsule Collider"内を次のように設定する。
・"Center"を(X: 0, Y: 0.22, Z: 0.13)
・"Radiusを 0.24
・"Height"を 1.41
・"Direction"を Z-Axis
(4)スクリプトの追加
①『PenguinAgent(.cs)』を追加し、次のように設定する。
※追加時に『BehaviorParameters』スクリプトも自動的に追加されていることを確認すること
〇"BehaviorParameters"の設定
・"Behavior Name"を「PenguinLearning」←スペルミスに注意
・"Space Size"を 8
・"Branches Size"を 2
・"Branche0 Size"を2
・"Branche1 Size"を 3
〇"PenguinAgent"の設定
・"Max Step"を 5000
・"Decision Interval"を 4
・"Heart Prefab"に『Heart』プレハブをドラッグ
・"Regurgitated Fish Prefab"に『Regurgitated Fish』プレハブをドラッグ
(4.5)補足
・"Behavior Name(動作名)"は、ドレーニングと推論の構成ファイルと一致する必要があります。一致していない場合、トレーニングが機能しません。
・"Vector Observation Space Size"は、『PenguinAgent.cs』の「CollectObservations( )」で行った「AddVectorObs( )」呼び出しに対応しており、合計値は8つあります。
・"Vector Action Branches Size"は、可能なアクション数を示しています。今回、ペンギンは前進と回転の2つがあります。"Branch0"は「前進」であり、「移動しない」と「前進」の2つのオプションがあります。"Branch1"は「回転」で、「左折」と「曲がらない」と「右折」の3つのオプションがあります。
・"Max Step"は、5000ステップ後にエージェントが自動的にリセットされることを意味しています。"Decision Interval"が4の場合、エージェントは4つのステップごとに何を行うか尋ねられ、各要求間にそのアクションを実行します。
(5)スクリプトの追加
①『RayPerceptionSensorComponent3D』を追加し、次のように設定する。
※「Add Component → Script」内には表示されないので、検索欄に「Ray」と入力することで候補が出る
※2Dと3Dの両方があるので、選択する際は注意(私の場合は下でした)
〇"RayPerceptionSensorComponent3D"の設定
・"Detectable Tags"を展開する
・"Size"を 3
・"Element 0"に baby
・"Element 1"に fish
・"Element 2"に Untagged
・"Rays Per Direction"を 2
・"Max Ray Degrees"を 60
・"Sphere Cast Radius"を 0.5
(5.5)補足
"Detectable Tag(検出可能なタグ)"は、衝突を報告するタグをセンサーに指示します。"Rays Per Direction(方向別光線数)"は、センターに中心の左右に2本の光線を照射するか、直進するかを指定します。"Max Ray Degrees"は、センサーが2つの光線を左右60度に広げるかどうかを指定します。合計で120度、光線間の距離は30度になります。"Sphere Cast Radius"は、各光線に沿って半径0.5の球体を投影し、空間の一点だけでなく、衝突をテストします。
4.ペンギンエリアを作成
(1)プロジェクトウィンドウの"Pengui"内にある「Prefabs」フォルダーから『PenguinArea』をダブルクリックし、編集画面にする。
(2)Mesh Rendererの削除
①ヒエラルキーウィンドウから"Ctrlキー"を押しながら、次の3つを選択する
・InvCylinder_Collider
・RockCollider_01
・RockCollider_02
②インスペクターウィンドウの『Mesh Renderer』の「︙(三点リーダー)」をクリックし、「Remove Componet」で除去します。
③「Add Component → Physics」から『Mesh Collider』を選択
(3)Materialの設定
①プロジェクトウィンドウの「Assets → Penguin → Materials」内に、新規マテリアルを2つ作成
・名前: Snow、Water
②"Snow"マテリアルのインスペクターウィンドウから次のように設定する
・Albedo: R: 255, G: 255, B: 255, A: 255
・Smoothness: 0
③"Water"マテリアルのインスペクターウィンドウから次のように設定する
・Rendering Mode: Transparent
・Albedo: R: 0, G: 200, B: 255, A: 165
・Smoothness: 0
④ ②、③で作ったマテリアルを次の場所にドラッグして適用する
※"Ctrlキー"を押しながら各オブジェクトを選択し、インスペクターウィンドウにドラッグすると一度に複数の適用できる
〇Snow
・Iceberg
・Rock_01 ~ 06
〇Water
・Water
(4)TextMeshProの設定
①ヒエラルキーウィンドウの"PenguinArea" を右クリックし、
「3D Object → Text-TextMeshPro」を選択
②メッセージが表示されたら、「Import TMP Essentials」をクリックする(インポート後は、メッセージを閉じてよい)
③"Text Mesh Pro"を次のように設定する
※ヒエラルキーウィンドウには、「Text(TMP)」と表示されている
〇名前
・Cumulative Reward(TMP)
〇テキストの移動(Rect Transform)
・PosX: 7
・PosY: 2
・PosZ: 11
・Width: 20
・Height: 5
・Rotation: X:0, Y: 30, Z:0
〇テキストの設定(TextMeshPro - Text)
・Text: 0.00
・Font Size: 30
・Vertex Color: R: 0, G:0, B:0, A:255
・Alignment: 左から2つ目を選択(上下、左右を中央にする)
(5)スクリプトの追加と設定
①プロジェクトウィンドウの"Prefabs"フォルダーから、次の2つをヒエラルキーウィンドウ(PenguinArea内)にドラッグする
※オブジェクトの位置は気にしなくてよい
・BabyPenguin
・Penguin
②ヒエラルキーウィンドウの"PenguinArea"を選択し、インスペクターウィンドウより「Add Component → Script」から『PenguinArea(.cs)』を追加する。
③『PenguinArea(.cs)』内のフィールドに、それぞれ次のものをドラッグする
・PenguinAgent: Penguin ←ヒエラルキーウィンドウから
・Penguin Baby: BabyPenguin ←ヒエラルキーウィンドウから
・Cumulative Reward Text: Cumulative Reward(TMP)
↑ヒエラルキーウィンドウから
・Fish Prefab: Fish ←プロジェクトウィンドウの"Prefabs"から
(6)プレハブエディタの終了
図の矢印をクリックして、プレハブエディタを終了します
5.ペンギンアカデミー作成とテスト
(1)PenguinAcademyの作成
①ヒエラルキーウィンドウの"+"マークから、『Create Empty』選択する
②名前を「PenguinAcademy」に変更する
③"PenguinAcademy"に、インスペクターウィンドウより「Add Component → Script」から『PenguinAcademy(.cs)』を追加する
(2)プレイヤー操作によるテスト
①ヒエラルキーウィンドウにある"PenguinArea"を展開し、「Penguin」を選択して、インスペクターウィンドウに設定画面を出す
②インスペクターウィンドウにある"Behavior Parameters"内を次のように設定
・Behavior Type: Heuristic Only
③"Main Camera"の設定を、次のようにする
・Position: X: -8, Y: 9, Z -20
・Rotation: X: 30, Y: 22, Z: 0
④Unityエディターの上部中央にある「再生」ボタンで実行する
以下の動きを確認する
・W、A、Dキーでペンギンを「先進」「左回転」「右回転」できる
・水の中にいる魚を取ると消える(1匹ずつ)
・赤ちゃんペンギンに届けると、赤ちゃんの頭の上に「ハート」、足元に「(平たい)魚」が出る
・届けたと同時に、テキスト(累積報酬)の数字が増加する
・再度、魚を取りに行くことができる
・4匹の魚を全て配達すると、エリアと報酬がリセットされる
この動作が確認できなかった場合、プログラムまたは設定ミスの可能性があります。意外と直近で間違いがあったりするかもしれないので、ここから逆にさかのぼって探してみてください。
⑤動作が確認出来たら、「PenguinArea → Penguin」のインスペクターウィンドウ内にある"Behavior Parameters"内を次のように設定
・Behavior Type: Default
6.PenguinAreaの複製
トレーニングに進む前に、複数のペンギンが同時にトレーニングできるよう、エリアのコピーをいくつか作成します。トレーニングエリアが多いほど、より早く進めることができます。
※ナルト疾風伝を知っている方は、ナルトが影分身で葉っぱを切る修行したのと同じイメージをしてください。多いほど経験値は倍に、多いほど時間は短くなります。
①ヒエラルキーウィンドウにある"PenguinArea"を7回複製し、8つのエリアを作成
②エリアが重ならないように、XとZの位置を40メートル間隔で調整
※具体的な位置は次のようになる
・PenguinArea: X: 0, Z: 0
・PenguinArea(1): X: 40, Z: 0
・PenguinArea(2): X: 80, Z: 0
・PenguinArea(3): X: 120, Z: 0
・PenguinArea(4): X: 0, Z: 40
・PenguinArea(5): X: 40, Z: 40
・PenguinArea(6): X: 80, Z: 40
・PenguinArea(7): X: 120, Z: 40
7.最後に
これで、ペンギン(エージェント)と赤ちゃんペンギン、魚、エリアのプレハブと、Sceneの準備が整いました。
次回(最終回)、トレーニングをやっていきます。