【Unity】アクションRPGクラス図

2023年10月7日

UnityでアクションRPGを作成した時のおおまかなクラス図になります

UMLクラス図

集約:has-aの関係(弱い結びつきで、なくても成り立ちます)
コンポジション:has-aの関係(強い結びつきでないと成り立ちません)

クラス説明

Mob (Moving Objectの略):移動するオブジェクトでプレイヤーや敵がそれにあたります

クラス名説明
CollisionDetector汎用性のある当たり判定
PlayerControllerプレイヤーの移動
前方後方、左右の動きとジャンプの動きを記述
EnemyMoveエネミーの移動
NavMeshでプレイヤーを追いかけてくる
自分のエリアに入ってきて、かつ見えている時だけ
MobStatusMobの状態管理の基底クラス
プレイヤーと敵で共用されます
状態としては、(通常、攻撃中、死亡)があり、列挙型で管理しています
また、移動可能か、攻撃可能かの管理や残りのライブの管理が含まれています
また、ダメージを受けた時の処理も記述されています
EnemyStatus敵の状態管理
敵の動きによるアニメーションの繊維や、やられた時の処理を記述
PlayerStatusプレイヤーの状態管理
MobAttackプレイヤーと敵の攻撃管理
OnAttackStart()とOnAttackFinished()はアニメーションから呼ばれるイベント
OnAttackRangeEnter()は敵が攻撃エリア内の入ってきたら呼ばれるイベントで、CollisionDetectorで登録する
OnHitAttack()は、攻撃した時に当たった場合に呼ばれるイベントで、同じくCollisionDetctorで登録する
Spawner敵をスポーン(発生)させる

シーケンス図

PlantUMLコード

クラス図

@startuml

!define Arrow1 solid
!define Arrow2 open
!define AbstractClass abstract

class CollisionDetector {
  + OnTriggerEnter(Collider other)
  + OnTriggerStay(Collider other)
}

class TriggerEvent {
  + UnityEvent<Collider>
}

CollisionDetector *-- TriggerEvent : コンポジション

class EnemyMove {
  - NavMeshAgent _agent
  - RaycastHit[] _raycastHits
  - EnemyStatus _status
  + Start()
  + OnDetectObject(Collider collider)
}

EnemyMove *-- NavMeshAgent : 集約
EnemyMove *-- RaycastHit : 集約
EnemyMove *-- EnemyStatus : 集約

class EnemyStatus {
  - NavMeshAgent _agent
  + Start()
  + Update()
  + OnDie()
  - IEnumerator DestroyCoroutine()
}

EnemyStatus --|> MobStatus : 継承

class MobStatus {
  + Start()
  + OnDie()
  + Damage(int damage)
  + GoToAttackStateIfPossible()
  + GoToNormalStateIfPossible()
}

class PlayerController {
  - CharacterController _characterController
  - Transform _transform
  - Vector3 _moveVelocity
  - PlayerStatus _status
  - MobAttack _attack
  + Start()
  + Update()
}

PlayerController *-- CharacterController : 集約
PlayerController *-- Transform : 集約
PlayerController *-- Vector3 : 集約
PlayerController *-- PlayerStatus : 集約
PlayerController *-- MobAttack : 集約

class MobAttack {
  - MobStatus _status
  + Start()
  + AttackIfPossible()
  + OnAttackRangeEnter(Collider collider)
  + OnAttackStart()
  + OnHitAttack(Collider collider)
  + OnAttackFinished()
  - IEnumerator CooldownCoroutine()
}

MobAttack *-- MobStatus : 集約

class PlayerStatus {
}

PlayerStatus --|> MobStatus : 継承

class Spawner {
  - PlayerStatus playerStatus
  - GameObject enemyPrefab
  + Start()
  - IEnumerator SpawnLoop()
}

Spawner *-- PlayerStatus : 集約
Spawner *-- GameObject : 集約

@enduml

シーケンス図

@startuml

actor Player
actor Collider
participant CollisionDetector
participant EnemyMove
participant EnemyStatus
participant MobStatus
participant PlayerController
participant MobAttack
participant Spawner

Player -> CollisionDetector: OnTriggerEnter(Collider)
Player -> CollisionDetector: OnTriggerStay(Collider)
CollisionDetector -> EnemyMove: OnDetectObject(Collider)
EnemyMove -> EnemyStatus: Update()
EnemyStatus --> MobStatus: OnDie()
MobStatus --> MobStatus: Damage(int damage)
MobStatus --> MobStatus: GoToAttackStateIfPossible()
MobStatus --> MobStatus: GoToNormalStateIfPossible()
Player -> PlayerController: Update()
PlayerController -> MobAttack: AttackIfPossible()
MobAttack -> MobStatus: AttackIfPossible()
MobAttack -> MobAttack: OnAttackRangeEnter(Collider collider)
MobAttack -> MobAttack: OnAttackStart()
MobAttack --> MobStatus: OnAttackFinished()
Player -> Spawner: Start()
Spawner --> PlayerStatus: SpawnLoop()
PlayerStatus --> MobStatus: Inherits
Spawner --> GameObject: SpawnLoop()

@enduml

Unity

Posted by hidepon