i-school - PlantUML を利用したクラス図の作成例
 Rider において PlantUML を利用したクラス図の作成が可能です。

 以下は作成サンプルです。





クラス図


 ゲーム開発を始める際、プログラムの構造や設計が重要です。
特に、クラス図と設計の理解は、プロジェクトの成功に不可欠です。
 
 クラス図は、ソフトウェアの構造を視覚的に表現するための図で、クラスやその間の関係を示します。
Unityのプロジェクトにおいて、クラス図はゲームオブジェクトやコンポーネント、スクリプトなどのクラスとそれらの関連性を示すのに役立ちます。



 クラス図を作成することにより、プログラムの構造を視覚的に示し、異なるクラス間の関係や依存性を理解しやすくします。
これにより、開発者はプログラムをより柔軟で拡張可能な形で設計できます。

 PlantUML を活用することにより、Rider 上でクラス図を作成することが可能です。


PlantUML 導入方法


 PlantUML の公式サイトはこちらです。
導入方法、FAQ なども用意されています。


PlantUML 公式サイト
https://plantuml.com/ja/



 Rider の公式マーケットプレイスから PlantUML プラグインをダウンロード出来ます。


PlantUML integration
https://plugins.jetbrains.com/plugin/7017-plantuml...


 上記での導入が難しい場合、サイト最下段にリンクを用意してあります。


PlantUML ファイルの作成


 Rider 内に PlantUML ウィンドウを開くことでクラス図が表示されます。
メニューより View → Tool Windows → PlantUML で PlantUML ウィンドウを開くことが出来ます。

 ファイル管理のため、専用のフォルダを作成し、その中に PlantUML ファイルの作成すると管理しやすくなります。
フォルダの上でメニューを開き、Add → PlantUML で PlantUML ファイルを作成できます。
こちらに専用の記法を使ってクラス図を作成していきます。

 なお、ファイル名の名称はプロジェクト名、namespace、役割ごとの名前に Diaglam を合わせておくとわかりやすいです。





 クラス図の制作方法については、公式サイトに記法が記載されています。


PlantUML クラス図
https://plantuml.com/ja/class-diagram


<サンプル>


 Unity の公式プロジェクトである RunnerGame テンプレートのクラス図を PlantUML にて作成し、出力してみました。


https://blog.unity.com/ja/games/rapid-prototyping-...

https://unity.com/ja/features/build-a-runner-game



@startuml
'https://plantuml.com/sequence-diagram


package "HyperCasual.Core" {

    package "Singleton"{
        abstract class AbstractSingleton<T>{
            {static} T s_Instance
            +{static} T Instance
            
            #virtual void Awake()
        }
    }
    
package "StateMachine"{
    
        interface ILink{
            +bool Validate(out IState nextState)
            +void Enable()
            +void Disable()
        }
        
        class Link {
            -readonly IState m_NextState
            +Link(IState nextState)
            +bool Validate(out IState nextState)
        }
        
        class EventLink{
            -IState m_NextState
            -AbstractGameEvent m_GameEvent
            -bool m_EventRaised
            
            +EventLink(AbstractGameEvent gameEvent, IState nextState)
            +bool Validate(out IState nextState)
            +void OnEventRaised()
            +void Enable()
            +void Disable()
        }
    

    interface IState{
       +void Enter()
       +IEnumerator Execute()
       +void Exit()
       +void AddLink(ILink link)
       +void RemoveLink(ILink link)
       +void RemoveAllLinks()
       +bool ValidateLinks(out IState nextState)
       +void EnableLinks()
       +void DisableLinks()
    }

    abstract class AbstractState{
       +virtual string Name
       -readonly List<ILink> m_Links
    }
    
    class State{
        -readonly Action m_OnExecute
        +State(Action onExecute)
        +override IEnumerator Execute()
    }
    
    class DelayState{
        +override string Name
        -readonly float m_DelayInSeconds
        +DelayState(float delayInSeconds)
        +override IEnumerator Execute()
    }
        
    class PauseState{
        -readonly Action m_OnPause
        +override string Name
        +PauseState(Action onPause)
        +override void Enter()
        +override IEnumerator Execute()
        +override void Exit()
    }
  
    class LoadSceneState{
        readonly string m_Scene
        readonly SceneController m_SceneController
        readonly Action m_OnLoadCompleted
            
        +override string Name
        +LoadSceneState(SceneController sceneController, 
            string scene, Action onLoadCompleted = null)
        +override IEnumerator Execute()
    }
      
    class UnloadLastSceneState{
        -readonly SceneController m_SceneController
        +UnloadLastSceneState(SceneController sceneController)
        +override IEnumerator Execute()
    }
    
        class StateMachine{
                +IState CurrentState
                +virtual void SetCurrentState(IState state)    
                -Coroutine m_CurrentPlayCoroutine
                -bool m_PlayLock
                -IEnumerator Play()
                -void Skip()
                +virtual void Run(IState state)       
                -Coroutine m_LoopCoroutine        
                +virtual void Run()       
                +void Stop()
                #virtual IEnumerator Loop()       
                +bool IsRunning
            }

    }
    
    
    package "EventSystem"{
    
    interface IGameEventListener{
        +OnEventRaised()
    }
    
    abstract class AbstractGameEvent{
        -readonly List<IGameEventListener> m_EventListeners
        +void Raise()
        +void AddListener(IGameEventListener listener)
        +void RemoveListener(IGameEventListener listener)
        +{abstract} void Reset()
    }
    
    class AppPauseDetector{
        -[SerializeField] AbstractGameEvent m_PauseEvent
        +bool IsPaused
        -OnApplicationFocus(bool hasFocus)
        -void OnApplicationPause(bool pauseStatus)      
    }
    
    class TriggerEvent{
        -const string k_PlayerTag
        -[SerializeField] AbstractGameEvent m_Event
        -OnTriggerEnter(Collider col)
    }
    
    }
    
    class GenericGameEventListener{
        +AbstractGameEvent m_Event
        +Action EventHandler
        +void Subscribe()
        +void Unsubscribe()
        +void OnEventRaised()
    }
}


package "HyperCasual.Gameplay" {

    class ItemPickedEvent{
        +int Count
        +override void Reset()
    }
    
    class LevelCompletedEvent {
        +override void Reset()
    }
    
    class LevelLostEvent {
        +override void Reset()
    }
}

IState <|.. AbstractState

AbstractState <|-- State
AbstractState <|-- DelayState
AbstractState <|-- LoadSceneState
AbstractState <|-- UnloadLastSceneState
AbstractState <|-- PauseState

ILink <|.. Link
ILink <|.. EventLink
IGameEventListener <|.. EventLink

IGameEventListener <|.. GenericGameEventListener

ScriptableObject <|-- AbstractGameEvent
AbstractGameEvent <|-- ItemPickedEvent
AbstractGameEvent <|-- LevelCompletedEvent
AbstractGameEvent <|-- LevelLostEvent

@enduml


出力


 PlantUMLウィンドウにクラス図が即時に反映されます。

 ここでは最初に提示した全体図を分割して表示しています。











参考サイト