PlantUMLコードからC#ファイルを自動生成してくれるエディタ拡張


はじめに

unityのエディタ拡張を触ってみたくて練習がてら作ってみました。

僕はunityでプロジェクトを作る前にPlantUMLでクラス図を書くことが多いです。
でもそれをunityに反映させるのってちょっとめんどくさいですよね。
ということでPlantUMlのコードからC#のファイルを生成してくれるエディタ拡張を作ってみました。
対応してない書き方があります。
割とガバが多いですが勘弁してください。
Github

機能説明

Pu2Text
①UnityのAsset直下にあるResourcesフォルダの中からumlファイルを一つ取得し、txtファイルに変換します(拡張子変えるだけ)。

UML2CS
②Assets/Scriptsの中に、namespaceごとにフォルダを作りその中にcsファイルを生成します。
Scriptsフォルダも自動で作ってくれます。

以下の記述に対応しています。

・class ~~
・abstract ~~
・abstract class ~~
・interface ~~
・enum ~~

使い方

準備

Githubからソースコードをクローンします。

①新しいUnityのプロジェクトを立ち上げ、「Editor」というフォルダを作ります。Assets直下じゃなくても大丈夫です。
Editorフォルダの中にクローンした「UML2CS」というフォルダを入れます。

②Assets直下に「Resources」という名前でフォルダを作ります。
Resourcesフォルダの中にクラス図(.puファイル)を入れます。

今回テスト用にpuファイルを用意しました

test.pu
@startuml Test
title Test
    namespace TestNamespace{
        class TestClass
        abstract TestAbstract
        abstract class TestAbstractClass

        namespace Game{
            interface Testinterface
            enum Testenum
        }
    }

    namespace Euglena{
        class Test
        abstract class Ahaha 
    }
@enduml

実行

puファイルをtxtファイルに変換する


「UML」→「Pu2Text」を選択すると拡張子が.txtに変換されたコピーが生成されます。

csファイルを生成する


「UML」→「UML2CS」を選択するとウィンドウが出てきます。

ClassDiagram欄に先ほど生成したtxtファイルをアタッチしてCreateボタンを押せば自動で生成してくれます。

実行結果


「Scripts」フォルダに、namespaceごとにフォルダが作られcsファイルがそれぞれ作られました。

TestNamespace/TestClass.cs
using UnityEngine;

public class TestClass : MonoBehaviour {
    private void Update(){

    }
    private void Start(){

    }

}
TestNamespace/TestAbstract.cs
using UnityEngine;

public abstract class TestAbstract : MonoBehaviour {
    private void Update(){

    }
    private void Start(){

    }

}

普通のクラスとabstractクラスはMonoBehaviourを継承し、UpdateメソッドとStartメソッドが用意されます。

TestNamespace/Game/Testinterface.cs
using UnityEngine;

public interface Testinterface  {

}

interfaceやenumはMonobehaviourは継承せず、UpdateやStartメソッドもありません

このエディタ拡張のガバについて

このエディタ拡張はいろいろガバがあります。

①メンバを宣言できない。

変数やメソッド等を宣言する機能はないので自分でやってください(投げやり)

②クラスのメンバとしてenumを宣言してもファイルを分けられる

Test.pu
class Test{
    enum Type
}

例えばこんな感じでクラスのメンバにenumを宣言しても

わけられてしまいます。
enumではなく、他のやつでも同じです。
個別に宣言してください(投げやり)

③namespaceをドットで繋げる書き方に対応してない

「TestNamespace.Game」みたいなnamespaceの書き方に対応してないのでやめてください(投げやり)

さいごに

いろいろガバがあって使いにくいと思いますが、そのうち機能を追加できたらいいかなと思います。
あと、複雑なクラス図だともしかしたらよくわかんないことになるかもしれません(ガバ)。
報告をいただけたら幸いです。
それと、深夜に思い付きで作ったのでクソコードになってしまいました、御許しを。では~~