今日は昨日かいたコードについて学習していきましょう。 とりあえず、それぞれ関数ごとに見ていきましょう。 この動画で書いたコードですね {@youtube:https://www.youtube.com/watch?v=zsOcALVNl0s} ### Start ``` private void Start() { agent.updateRotation = false; inputHoldWait = new WaitForSeconds(inputHoldDelay); destinationPosition = transform.position; } ``` 開始時にこちらを実行すると。 一文ずつ取り出していきます。 ``` agent.updateRotation = false; ``` いきなり…agent.updateRotationってなんだ? 調べていくと、ナビゲーションっていう機能で使われるものらしいです。 https://unity3d.com/jp/learn/tutorials/topics/navigation Unity公式のナビゲーションについてのチュートリアルです。 要は、プレイヤーの移動できるところをNavMeshっていうので指定してあげて プレイヤーが移動するときのこまごましたことを指定してやるスクリプトの一つにupdaterotationってのがあるみたい。 ナビゲーション、便利そうですね。 MOBA系のゲームとか、PoEみたいなゲームのキャラ移動が簡単に作れそう。 updaterotationってのは回転を更新すべきかどうかっていうbool型の変数らしいです。 今の時点だと何をしたいのかはわかりませんが、次第に分かっていくでしょう。 2行目。 ``` inputHoldWait = new WaitForSeconds(inputHoldDelay); ``` 前に処理を待ってくれっていうのに使いましたね、WaitForSeconds。 3行目。 ``` destinationPosition = transform.position; ``` destinationPositionっていうのが、NavMeshで制御する移動したいポイントみたいです。 んで、行きたいポジションは最初は開始位置ですよ、という代入。 ### OnAnimatorMove ``` private void OnAnimatorMove() { agent.velocity = animator.deltaPosition / Time.deltaTime; } ``` OnAnimatorMove。 名前からして動いてる間に呼び出されるっぽい感じですけども http://d.hatena.ne.jp/shinriyo/20130726/p2 こちらのサイトによるとAnimatorコンポーネントを追加した時にUpdateと同じように使える関数らしい。 うーん、Updateと差別化されている所はコンポーネントがある時かない時かしかないのか? いつ使うんだろう、まだ想像が付かない。 んで、中身は NavMeshを使った移動をする時の速度の指定。 animator.deltaPositionってのが前フレームと比較した時の移動距離で、Time.deltaTimeで割ることで速度計算しています。 Time.deltaTimeっていうのは、フレーム毎に処理が繰り返されている関数の中で1秒をどんな環境でもカウントできるものです。 アニメーションに応じて速度を決定出来るんですね、これで。 ### Update ``` private void Update() { if (agent.pathPending) { return; } float speed = agent.desiredVelocity.magnitude; if (agent.remainingDistance <= agent.stoppingDistance * stopDistanceProportion) { Stopping(out speed); } else if (agent.remainingDistance <= agent.stoppingDistance) { Slowing(out speed, agent.remainingDistance); } else if (speed > turnSpeedThreshold) { Moving(); } animator.SetFloat(hashSpeedPara, speed, speedDampTime,Time.deltaTime); } ``` Updateはよく使っていますね。 ``` if (agent.pathPending) { return; } ``` pathPendingってのは、経路探索の準備ができているかどうかの判定。 つまりは移動先が決まってたらこの先は処理しないでね~って感じですね。 ``` float speed = agent.desiredVelocity.magnitude; ``` スピードを判定するためにspeedという変数に数値を代入。 んで多分desiredVelocityっていうので速度を出して、magnitudeでベクトルの大きさを出してるんだろうけど… desiredVelocityのUnity公式の説明がこれ > 回避行動による潜在的な移動も含むエージェントの期待速度(読み取り専用) は?って感じですね。 つまりはモーションによる移動も含めた全体の移動速度ってことかな そうじゃないと速度の判定がガバガバになりますもんね。 ``` if (agent.remainingDistance <= agent.stoppingDistance * stopDistanceProportion) { Stopping(out speed); } else if (agent.remainingDistance <= agent.stoppingDistance) { Slowing(out speed, agent.remainingDistance); } else if (speed > turnSpeedThreshold) { Moving(); } ``` これはそれぞれ上から 「残りの移動距離がほぼ0になったらStoppingという関数を実行」 「残りの移動距離が少なくなってきたらSlowingという関数を実行」 「速度がturnSpeedThresholdという指定した数値よりも高ければMovingという関数を実行」 というものになっています。 確かに、移動モーションが0か1かしか無くて目的地についた瞬間停止したらなんか違和感が出ますよね。 それをなくすためにある程度移動が終わりに近づいたら速度を落として…という処理をまた次の関数で書きます。 が、理解するのに時間がかかってしまって今日のコード解読はここで終わりました。 土日使ってまとめたいと思います。なので、今日はここまで。