前回記事
の続きになります
目的
サンプルシーンのラケットに横移動,横振りを追加する
言葉の定義
(縦,横,上下) = (Y,Z,X)
追加点
機能
ラケットの横移動
ラケットの横振り
追加する観測値
ラケットのZ軸の位置,速度 + ラケットの傾き(y) = 3
を追加する
→OnActionReceivedから変更
AgentのBehaviorParametersのVectorObservation SpaceSizeを9→12に変更
元の(サンプルシーン)のパラメータは9つ
(ラケット,ボール(2) の 位置,速度(2) が x,y (2) +ラケットの傾き(z) = 9)
追加する行動
ラケットの横振り(Z軸周り)
ラケットの横方向(Z方向)の移動
AgentのBehaviorParametersのVectorAction SpaceSizeを3→5に変更
プログラムはOnActionReceived内で変更
その他
球が側面の外に飛び出ることが予想されるので側面に壁を作成しHitWallが壁に当たったことを感知できるようにwallC,wallDを追加
制限
エリアを超えた球を追わないようにZ方向の制限
ラケットを振りすぎないように角度の制限 球に対して迎え撃つように角度を制限
プログラムの変更点
観測値の設定
横方向の観測値 をエリアの中心からの距離で設定
sensor.AddObservation(m_InvertMult * (transform.position.z - myArea.transform.position.z));
横方向の速度
sensor.AddObservation(m_InvertMult * m_AgentRb.velocity.z);
ラケットのx軸の回転
sensor.AddObservation(m_InvertMult * gameObject.transform.rotation.x);
を CollectObservations()に追加
行動の設定
var moveY = Mathf.Clamp(continuousActions[3], -1f, 1f) * m_InvertMult;
m_AgentRb.velocity = new Vector3(moveY * 30f, m_AgentRb.velocity.y, 0f);
ラケットの回転の設定
var rotate2 = Mathf.Clamp(continuousActions[4], -1f, 1f) * m_InvertMult;
m_AgentRb.transform.rotation = Quaternion.Euler(0f, -180f, 55f * rotate2 + m_InvertMult * 90f);
学習法
追加学習か0から学習するか
実行法