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

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

Unityゲーム開発の本のプログラムを動かしてみる

f:id:yasu9780:20150625012848j:plain

kindle本50%オフの時に買った「Unityゲーム開発」の本を読んでいます。www.amazon.co.jp

 なお本持ってなくても、ソフトバンクのサイトからProjectはダウンロードできます。

 いやーさすがプロが作ってるコンテンツは凄いね。
 CharacterControllerはdemoで動かしただけで自分で使ったことは無かったですが、高低差も対応して移動できるみたいだし、面倒なところはすべて隠蔽されていて、とても使いやすそうでした。
 こんなことならゾンビゲーム作ってた時から使えば良かった。

 rigidBodyは内部的に使ってるのか、Componentとしては登録されてないですね。
 Scriptにはなぜか

// 重力.
velocity += Vector3.down * GravityPower * Time.deltaTime;

 重力を自前で足し込む処理がある?
 playerのchildのhipにrigidbodyが仕込んであった。こういうもあるんだ……
 isKinematicがonなので物理エンジンは使わずに、collider用ですね。
 (isKinematicだと自分は物理エンジンの影響を受けないけど、他者には影響を与える)

// 接地していたら思いっきり地面に押し付ける.
// (UnityのCharactorControllerの特性のため)
Vector3 snapGround = Vector3.zero;
if (characterController.isGrounded)
	snapGround = Vector3.down;

 押し付けてないと、ちょっとした起伏でプレイヤーが飛んだりして不自然だかららしい。
 このへんがプロの業って感じですね(ゝω・)


 移動はプレイヤーも敵も目的地を設定して、そこへ向かうやり方。
 マウスで地面をクリックすると、そこへ向かうし、敵をクリックすると2m以上離れてるときは敵に向かう。2m以内なら攻撃する。これは敵も同じ。
 敵の移動も、ターゲットにさっと移動して、休んで、さっと移動して、休むって感じが、いかにも生きてる感じ。
 ゾンビゲームだと、敵が動き続けてたので、このへんは見習いたい
 (ゾンビだから休むのも不自然かもしれないけど)

// 目的地を設定する.引数destinationは目的地.
public void SetDestination(Vector3 destination)
{
	arrived = false;
	this.destination = destination;
}


 移動開始時もいきなり速度を設定するのではなく、徐々に早めることでスムーズに。

// スムーズに補間.
velocity = Vector3.Lerp(currentVelocity, velocity,Mathf.Min (Time.deltaTime * 5.0f ,1.0f));
velocity.y = 0;


 あと、プレイヤーの剣にrigidboyとcolliderとAttackAreaってスクリプトが貼られてる。
 この剣のcolliderは攻撃Animationと連動してon/offされていて、おそらく剣が敵に当たったら発動するんでしょう。
 この辺がまさに業って感じ。本当に剣が敵に当たらないとダメージにならない。

 この仕組を利用すれば、例えば野球ゲームで、バットとボールが当たる時に角度とか速度とかで力積を求めて、打球の方向とか速度をちゃんと計算できそうですね。バットに当たった向きは乱数!みたいないい加減な処理ではなく。

 このやり方なら盾にcollierとScriptを貼って、盾で矢を受ければ本当に弾くみたいな処理も作れますね。
 格ゲー作るときも、拳とかつま先にcolliderを付けて打撃判定すれば、本当に攻撃が成功したかの判定ができますね。なるほどねえ。

 あと、前、ピストルをわざわざモデルに持たすためにmmd使ってやってましたけど、武器はchildとしてSetParentでもしておけばいいんですね。これなら武器も交換できるし。

 すごい勉強になりますね。しかもこの本のサンプルはネットワーク対応まで入ってるんですよ。

 この本を書いてるのは、「ゆめりあ」「アイドルマスター」を作ってたプログラマーみたいです。
 データ製作者はテイルズシリーズのグラフィッカー。