Unityに関連する記事です

 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ウィンドウにクラス図が即時に反映されます。

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











コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます