「TopDownEngine」独自の機能に関するTips。
実際にゲームを作ってみて出て来た問題の解決法を書き足して行きます。
以下、カラー跳弾システムを実装したカスタムゲームの動画。
弾丸のアレンジ
跳弾システムを実装した時に把握した、弾丸周りの仕様。
弾丸の移動の仕様
- 計算した1フレーム分の移動量を、Rigidbody.MovePositionに渡して移動させている(AddForceでの物理ベースの動きではない)。
- フラグ「_shouldMove」が有効な場合、常に移動し続ける。
- TriggerなCollider。
弾丸の停止の仕様
キャラクター等と同じように、Health(HP)で管理されていて、
- 相手キャラクターと衝突してHealthが0になる。
- OnDeath経由で、StopAtが呼ばれる。
- StopAtでColliderと、_shouldMoveの無効化。
という流れになる。
壁、障害物への衝突では、Healthは減らないので、移動処理自体は停止していない。
壁で止まっているのは、物理シミュレーションに頼った物。
弾丸の消滅の仕様
MMPoolableObjectによって管理される。
出現してからn秒経過で非アクティブ化。
MMPoolableObject.LifeTimeで設定出来る。
- Healthが0になっても消滅しない。
- 衝突して停止してからn秒経過で非アクティブ化、ではない。
弾丸の衝突の仕様
通常Collider (壁、障害物以外)
壁、障害物以外のColliderとの衝突では、OnTriggerEnter等がきちんと呼ばれる。
壁、障害物
Tilemapの仕様故か、壁や障害物との衝突時にOnTriggerEnter等が呼ばれない。
色々試した結果、Rigidbody2D.OverlapColliderでの判定のみ可能だった(ContactFilterにObstaclesのレイヤーを指定)。
弾丸のダメージ判定の仕様
DamageOnTouchで管理されている。
以下の通り、二重に衝突対象が設定されているので注意。
- DamageOnTouch.TargetLayerMaskに衝突対象のレイヤーが設定されている。
- DamageOnTouch.IgnoreGameObjectで、Projectile._ownerも除外される。
Tilemapを改造してステージを広くしたが、カメラがプレイヤーを追従しない
デフォルトでは、ルーム外やステージ外にはカメラが追従しない設定になっている。
解決法は、以下の3パターン。
- 【ステージ外の場合】LevelManagerにアタッチされた、BoxColliderでステージ全体のサイズの変更。
- 【ルーム外の場合】LevelManager下の各ルームの設定でルームサイズの指定。
- 【そもそもの設定を変更】LevelManagerのコンポーネント、Bounds -> Use Level Boundsをfalseに変更。
近接武器を装備している時、敵が射撃して来なくなるバグの対策
【結論】一部コードを修正
「…\Project Name\Assets\TopDownEngine\Common\Scripts\Characters\AI\Advanced」にある、「AIDecisionDetectTargetRadius2D」の一部コードを書き換える。
AIDecisionDetectTargetRadius2D.DetectTargetの
_brain.Target = _detectionCollider.gameObject.transform;
という箇所を、
if (_detectionCollider.gameObject.CompareTag("Player")) {
_brain.Target = _detectionCollider.gameObject.transform;
} else {
_brain.Target = _detectionCollider.gameObject.transform.root;
}
という風に書き換える。
タグを見て、プレイヤー本体か判定している。
後述の、「プレイヤーの近接武器」のCollider2Dが取得されている場合は、最上位の親のTransformに差し替えている。
【理由】近接武器と索敵の仕様
(デモシーンKoalaDungeonでの例)。
- 近接武器を装備した場合、Koala -> KoalaModel -> WeaponAttachment下に武器のプレハブが設置される。
- その武器のプレハブ内に「WeaponName(Clone)DamageArea」という、当たり判定用のプレハブが自動生成される。
- それにRigidbody2Dや、Collider2Dがアタッチされていて、かつ、レイヤーがPlayerに設定されている。
- AIDecisionDetectTargetRadius2Dでは、Playerのレイヤーに対するPhysics2D.OverlapCircleで範囲内かの判定。Physics2D.BoxCastで射線が通っているかの判定をしている。
- 稀に「WeaponName(Clone)DamageArea」がTargetとして紐付けされてしまい、その状態で武器を切り替えるとMissingが発生。