エディター拡張4(Undo機能の実装)
![1b9702c5 26e8 4407 a0b5 ed7940e1f718](https://codegenius.org/uploads/slide/image/3889/1b9702c5-26e8-4407-a0b5-ed7940e1f718.jpeg)
![Aafb0339 f0db 4d0d 8c94 efa50075611d](https://codegenius.org/uploads/slide/image/3890/aafb0339-f0db-4d0d-8c94-efa50075611d.jpeg)
Undo機能の実装
using UnityEngine;
using UnityEditor;
public class SetObject : EditorWindow
{
private Vector3 selectPos;
private Vector3 rot;
private string prefabName;
// ★追加
private int yokoSize;
private int tateSize;
[MenuItem("SetObject/Set")]
static void WindowOpen()
{
GetWindow<SetObject>();
}
private void OnGUI()
{
prefabName = EditorGUILayout.TextField("①オブジェクトの選択", prefabName);
if (GUILayout.Button("②設置場所の選択"))
{
selectPos = Selection.activeTransform.position;
}
// ★追加
yokoSize = EditorGUILayout.IntField("横に何個並べるか?", yokoSize);
tateSize = EditorGUILayout.IntField("縦に何個並べるか?", tateSize);
rot = EditorGUILayout.Vector3Field("③向きの選択", rot);
if (GUILayout.Button("④配置"))
{
// ★追加
for (int i = 0; i < yokoSize; i++)
{
for (int j = 0; j < tateSize; j++)
{
GameObject prefab = (GameObject)Resources.Load(prefabName);
GameObject clone = (GameObject)PrefabUtility.InstantiatePrefab(prefab);
clone.transform.position = new Vector3(selectPos.x + i, selectPos.y, selectPos.z + j); // ★一部追加
clone.transform.localRotation = Quaternion.Euler(rot.x, rot.y, rot.z);
// ★★追加(Undo機能の実装)
Undo.RegisterCreatedObjectUndo(clone, "Create Object");
}
}
}
if (GUILayout.Button("終了"))
{
Close();
}
}
}
![38fa7ab9 45af 47f2 8be8 4a445b73fca9](https://codegenius.org/uploads/slide/image/3891/38fa7ab9-45af-47f2-8be8-4a445b73fca9.jpeg)
![Cc7c2092 671d 4b3b 9f01 8e4a1d2768b3](https://codegenius.org/uploads/slide/image/3892/cc7c2092-671d-4b3b-9f01-8e4a1d2768b3.jpeg)
![9b1c5155 6bf5 45b2 8c1a 363d2bae7247](https://codegenius.org/uploads/slide/image/3893/9b1c5155-6bf5-45b2-8c1a-363d2bae7247.jpeg)
【2019版】TowerD Ⅱ(基礎/全4回)
1 | エディター拡張1(タイルマップ作製支援ツール) |
2 | エディター拡張2(オブジェクト配置支援ツール) |
3 | エディター拡張3(オブジェクト配置支援ツールの改良) |
4 | エディター拡張4(Undo機能の実装) |
![1b9702c5 26e8 4407 a0b5 ed7940e1f718](https://codegenius.org/uploads/slide/image/3889/1b9702c5-26e8-4407-a0b5-ed7940e1f718.jpeg)
![Aafb0339 f0db 4d0d 8c94 efa50075611d](https://codegenius.org/uploads/slide/image/3890/aafb0339-f0db-4d0d-8c94-efa50075611d.jpeg)
Undo機能の実装
using UnityEngine;
using UnityEditor;
public class SetObject : EditorWindow
{
private Vector3 selectPos;
private Vector3 rot;
private string prefabName;
// ★追加
private int yokoSize;
private int tateSize;
[MenuItem("SetObject/Set")]
static void WindowOpen()
{
GetWindow<SetObject>();
}
private void OnGUI()
{
prefabName = EditorGUILayout.TextField("①オブジェクトの選択", prefabName);
if (GUILayout.Button("②設置場所の選択"))
{
selectPos = Selection.activeTransform.position;
}
// ★追加
yokoSize = EditorGUILayout.IntField("横に何個並べるか?", yokoSize);
tateSize = EditorGUILayout.IntField("縦に何個並べるか?", tateSize);
rot = EditorGUILayout.Vector3Field("③向きの選択", rot);
if (GUILayout.Button("④配置"))
{
// ★追加
for (int i = 0; i < yokoSize; i++)
{
for (int j = 0; j < tateSize; j++)
{
GameObject prefab = (GameObject)Resources.Load(prefabName);
GameObject clone = (GameObject)PrefabUtility.InstantiatePrefab(prefab);
clone.transform.position = new Vector3(selectPos.x + i, selectPos.y, selectPos.z + j); // ★一部追加
clone.transform.localRotation = Quaternion.Euler(rot.x, rot.y, rot.z);
// ★★追加(Undo機能の実装)
Undo.RegisterCreatedObjectUndo(clone, "Create Object");
}
}
}
if (GUILayout.Button("終了"))
{
Close();
}
}
}
![38fa7ab9 45af 47f2 8be8 4a445b73fca9](https://codegenius.org/uploads/slide/image/3891/38fa7ab9-45af-47f2-8be8-4a445b73fca9.jpeg)
![Cc7c2092 671d 4b3b 9f01 8e4a1d2768b3](https://codegenius.org/uploads/slide/image/3892/cc7c2092-671d-4b3b-9f01-8e4a1d2768b3.jpeg)
![9b1c5155 6bf5 45b2 8c1a 363d2bae7247](https://codegenius.org/uploads/slide/image/3893/9b1c5155-6bf5-45b2-8c1a-363d2bae7247.jpeg)
エディター拡張4(Undo機能の実装)