見出し画像

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』に変える
※このタグの名前が違うと、プログラムが動作しないこともあるので、間違いえないように

画像1


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)』を追加する。

画像2


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

画像3

(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』プレハブをドラッグ

penguinスクリプト

(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

penguinスクリプト2

(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』を選択

画像6

(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」をクリックする(インポート後は、メッセージを閉じてよい)

画像7

③"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つ目を選択(上下、左右を中央にする)

画像8

(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"から

画像9

(6)プレハブエディタの終了
図の矢印をクリックして、プレハブエディタを終了します

画像10


5.ペンギンアカデミー作成とテスト

(1)PenguinAcademyの作成
①ヒエラルキーウィンドウの"+"マークから、『Create Empty』選択する
②名前を「PenguinAcademy」に変更する
③"PenguinAcademy"に、インスペクターウィンドウより「Add Component → Script」から『PenguinAcademy(.cs)』を追加する

アカデミー1

(2)プレイヤー操作によるテスト
①ヒエラルキーウィンドウにある"PenguinArea"を展開し、「Penguin」を選択して、インスペクターウィンドウに設定画面を出す
②インスペクターウィンドウにある"Behavior Parameters"内を次のように設定
・Behavior Type: Heuristic Only

アカデミー2

③"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

画像14


7.最後に

これで、ペンギン(エージェント)と赤ちゃんペンギン、魚、エリアのプレハブと、Sceneの準備が整いました。
次回(最終回)、トレーニングをやっていきます。


この記事が気に入ったらサポートをしてみませんか?