目的
テキストエディタで頑張るの辛いので、簡単にマークアップが作れる仕組みを、とりあえずな感じで作る。
コード
Unity Editorを優秀な?3Dコンポーザーとして使ってしまおうという話。
こんなヒエラルキーを作っておいて、
適当にこんな風になっているとする。
コードを書く。基底クラスとして以下のクラスを作る。
Node.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Node : MonoBehaviour
{
public virtual string toML()
{
string mlResult = "";
for(int i = 0; i < gameObject.transform.childCount; i++)
{
mlResult += gameObject.transform.GetChild(i).gameObject.GetComponent<Node>().toML();
}
return mlResult;
}
protected string toColorString(Color color)
{
return ((byte)(color.r * 255)).ToString("X2") + ((byte)(color.g * 255)).ToString("X2") + ((byte)(color.b * 255)).ToString("X2");
}
}
各プリミティブの種類ごとに、以下のようなクラスをそれぞれ作る。
Cube.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Cube : Node
{
public override string toML()
{
string ret = "";
ret += "<a-box x=" + gameObject.transform.position.x +
" y=" + gameObject.transform.position.y +
" z=" + gameObject.transform.position.z +
" size=" + gameObject.transform.localScale.x +
" color=#" + toColorString(gameObject.GetComponent<MeshRenderer>().material.color) +
">";
ret += base.toML();
ret += "</a-box>";
return ret;
}
}
省略するが他のも。
そして、Rootにバインドした以下のコンポーネントでDebug.Logに吐く。
Kick.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Kick : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Debug.Log(gameObject.GetComponent<Node>().toML());
}
}
結果
Debug.Logで吐いてるので、コンソールからコピペ。
<a-box x=0 y=0 z=0 size=1 color=#FA0303><a-sphere x=0 y=0.79 z=0.71 r=0.5 color=#000000><a-text x=0.77 y=0.79 z=-1.24 size=1 color=#FFFFFF>Hello World</a-text></a-sphere><a-cylinder x=-0.96 y=0.64 z=-1.18 height=2 r=0.5 color=#FFFFFF></a-cylinder></a-box>
できた。
取り急ぎの超簡易版なので、そのうちもっといい形を考える。