■サンプル(MonoBehaviour側)
public class Hoge : MonoBehaviour,IMeshModifier
{
[SerializeField]
private Vector3[] m_points;
}
■サンプル(Editor側)
[CustomEditor(typeof(Hoge))]
public class HogeEditor : Editor {
private SerializedProperty m_points;
private void OnEnable()
{
m_points = serializedObject.FindProperty("m_points");
}
private void OnSceneGUI()
{
// 内部キャッシュから最新のデータを取得
serializedObject.Update();
// Begin~, End~
// GUI グループ内のGUI要素でなんらかの変更がなされたときにアクションを起こすために使用する
EditorGUI.BeginChangeCheck();
var pointsForDrawLine = new List<Vector3>();
var prevPoint = Vector3.zero;
for(int i=0; i<m_points.arraySize; i++)
{
var prop = m_points.GetArrayElementAtIndex(i);
// TransformPoint : local to world
prop.vector3Value = Handles.DoPositionHandle(
self.transform.TransformPoint(prop.vector3Value),
(target as BSplineRenderer).transform.rotation);
pointsForDrawLine.Add(prop.vector3Value);
// 線引かないとつなぎ順がわかりにくいので線を引く
if (i > 0)
Handles.DrawLine(pointsForDrawLine[i - 1], pointsForDrawLine[i]);
// InverseTransformPoint: world to local
prop.vector3Value = self.transform.InverseTransformPoint(prop.vector3Value);
}
if (EditorGUI.EndChangeCheck())
{
// 内部キャッシュに変更点を適用する
serializedObject.ApplyModifiedProperties();
}
}
}