敵キャラクターを作って動きをつけよう
敵キャラクターを作って動きをつけよう
table:Window->AI->Navigation
Agent Radius エージェントの半径
Agent Height エージェントの高さ
Max Slope エージェントが登れる坂道の最大角度
Step Height 階段など、エージェントが越えられる段差の最大値
NavMeshに基づいて動くキャラクタとする
table:NavMeshAgent
Steering.Speed 移動速度
Steering.Angular Speed 回転速度
Steering.Acceleration 加速度
Obstacle Avoidance 障害物回避系のパラメタ
Path Finding 経路探索系のパラメタ
PathFinding.AreaMask 移動可能エリアの制限
NavMeshに対する動的な障害物とする
分離したNavMeshどうしを接続する機構(?)
ワープや段差を表現する
NavMeshに対する静的な障害物
インスペクタの右上(Staticチェックボックス)の一部。これにチェックを入れないと障害物扱いしないらしい NavMeshのエリア分け、移動コスト定義
水が苦手なモンスターは浅瀬を通らない。みたいな事が出来る
動的ベイクなんかが出来るらしい
CollisionDetector
code:CollisionDetector.cs
using System;
using UnityEngine;
using UnityEngine.Events;
public class CollisionDetector : Monobehaviour
{
SerializeFirld private TriggerEvent onTriggerStay = new TriggerEvent(); private void OnTriggerStay(Collider other){
onTriggerStay.Invoke(other);
}
public class TriggerEvent : UnityEvent<Collider> {}
}
Javaもそうなんだけど、ラムダ式する際にいちいちクラス作らなきゃいけないのが面倒だったけど、インナークラスで対応しててなるほどと思った。 謎の[Serializable]を外すとインスペクタに表示されなくなる。
Raycast
int Physics.RaycastNonAlloc(Vector3 origin, Vector3 direction, RaycastHit[] dataStore, float distance)
Hitしたオブジェクトが、dataStoreに格納される
Hitした件数が、戻り値に入る
ここでは、モンスターとプレイヤー間でRayを飛ばして、障害物があるか無いかの判定を行っている。
障害物が無ければ(戻り値 == 0)、プレイヤーに近づく
モンスターの機能拡張
モンスターが攻撃出来るようにしたりする
Guard句を利用してるメソッド名に「可能ならする」ニュアンスを持たせてるのマネしたい GoToAttackStateIfPossible()
クラスのメンバに直接ラムダ式を書く「式本体の定義」を初めて見た。言わんとしてる所は分かるけど初見でビビる
public bool isAttackable => StateEnum.Normal == _state;
Colliderの罠
UnityではColliderで衝突判定を行う際、いずれか一方にRigidbodyまたはCharacterControllerがアタッチされていないと衝突判定が実行されません。
プレイヤーが攻撃できるようにする
敵用に作ったMobAttackをPlayerにも使う設計
AnimationControllerからメソッドを呼ぶ際に、同一Objectにアタッチされているコンポーネントしか参照出来ないのを回避するために、AnimationControllerを子Objectから親Objectへ移動する指示がある。
本気か????? バグるに決まってんだろ????
実際、モデルと兄弟関係だったAttackHitDirectorがぐるっぐる回る。
攻撃が当てにくい
プレビューで見るとバグる
これするなら、CollisionDetectorと同じように、Animation用のイベントバブリングを作った方が良い気がする
この回で作成したクラス群の概要
https://gyazo.com/151369dff034b76f7491295168d3c502