AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

ThirdPersonShooterを作る(7)

 ThirdPersonShooter 第7回です。
 今回はXBOX360コントローラーでキャラクターを動かしてみました。
 PCやSteamではXBOXコントローラーが標準ですね。(PS4コントローラーもSteamで標準対応)
 PS3のコントローラーをSteamで使うには変換ソフトが必要なので面倒です。

f:id:yasu9780:20161103022141g:plain

float ax = Input.GetAxisRaw("Horizontal");
float ay = Input.GetAxisRaw("Vertical");

通常、これでPCのカーソルキーが取得できますが、そのままでXBOX360の左アナログスティックの値も取れました。
カーソルキーは1か0と思いますが、アナログジョイスティックはアナログ値ですから、
斜め移動は45度だけでなく、任意の向きが(ax,0,ay)ベクトルで取得できます。

この移動方向の向きベクトルを回転角に変更して、rigidbodyに対して、MoveRotate()をかければキャラが回転します。
transform.LookAt()で、自分から向きベクトルの先にキャラを向かせればいいのですが、rigidbodyでは使えないので、Quaternion.LookRotation()を使います。

Vector3 velocity;
Quaternion newQua;
void Update()
{
  velocity *= 0.7f;
  float ax = Input.GetAxisRaw("Horizontal");
  float ay = Input.GetAxisRaw("Vertical");
  HumanMove = false;
  if (ax != 0 || ay != 0)
  {
    HumanMove = true;
    Vector3 input = new Vector3(ax, 0, ay);//移動方向の向きベクトル
    newQua = Quaternion.LookRotation(input);//向きベクトルの方向への回転Quaternion
    if (ax > 0f)
      velocity += transform.forward * ax * 2f;
    if (ax < -0f)
      velocity -= transform.forward * ax * 2f;
    if (ay > 0f)
      velocity += transform.forward * ay * 2f;
    if (ay < -0f)
      velocity -= transform.forward * ay * 2f;
  }
}
void FixedUpdate()
{
  if (isGround) //接地
  {
    rb.AddForce(velocity * 20f * speed, ForceMode.Force);
    if (HumanMove)
      rb.MoveRotation(newQua);
  }
}

f:id:yasu9780:20161103021920g:plain
押しっぱなしで加速するようにvelocityを前回の値に足して使ってるので、キーを離した後、慣性でちょっと動くんですよね。
摩擦力をmaterialで設定すればいいですかね。
滑りはこれはこれで、むしろ誇張したら違う楽しさは出せるかもしれません。


動き方を変えたのと、コントローラー対応にしたんで、自分で言うのもなんですが、かなり面白くなったw
AIが死なないように、爆弾で擁護するゲーム性w
これ死んだAIを復活させたり、HPが増えるようなポーションを出したり、AIにヒーリングかけたりして、
いかにAIと連携してチームで頑張るかって方向性で行ってみようかと思います。

f:id:yasu9780:20161103034628p:plain