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でもしておけばいいんですね。これなら武器も交換できるし。
すごい勉強になりますね。しかもこの本のサンプルはネットワーク対応まで入ってるんですよ。
この本を書いてるのは、「ゆめりあ」「アイドルマスター」を作ってたプログラマーみたいです。
データ製作者はテイルズシリーズのグラフィッカー。