『TopDownEngine』でゲームを作ってみて把握したTips

「TopDownEngine」独自の機能に関するTips。
実際にゲームを作ってみて出て来た問題の解決法を書き足して行きます。

以下、カラー跳弾システムを実装したカスタムゲームの動画。

弾丸のアレンジ

跳弾システムを実装した時に把握した、弾丸周りの仕様。

弾丸の移動の仕様

  • 計算した1フレーム分の移動量を、Rigidbody.MovePositionに渡して移動させている(AddForceでの物理ベースの動きではない)。
  • フラグ「_shouldMove」が有効な場合、常に移動し続ける。
  • TriggerなCollider。

弾丸の停止の仕様

キャラクター等と同じように、Health(HP)で管理されていて、

  1. 相手キャラクターと衝突してHealthが0になる。
  2. OnDeath経由で、StopAtが呼ばれる。
  3. 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での例)。

  1. 近接武器を装備した場合、Koala -> KoalaModel -> WeaponAttachment下に武器のプレハブが設置される。
  2. その武器のプレハブ内に「WeaponName(Clone)DamageArea」という、当たり判定用のプレハブが自動生成される。
  3. それにRigidbody2Dや、Collider2Dがアタッチされていて、かつ、レイヤーがPlayerに設定されている。
  4. AIDecisionDetectTargetRadius2Dでは、Playerのレイヤーに対するPhysics2D.OverlapCircleで範囲内かの判定。Physics2D.BoxCastで射線が通っているかの判定をしている。
  5. 稀に「WeaponName(Clone)DamageArea」がTargetとして紐付けされてしまい、その状態で武器を切り替えるとMissingが発生。

タイトルとURLをコピーしました