ShanxiKnowledgeBase/SXElectricalInspection/Assets/Script/MyFrameworkPure/Editor/RandomGeneratorWindow.cs

98 lines
3.7 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using Random = UnityEngine.Random;
namespace MyFrameworkPure
{
/// <summary>
/// 范围内随机实例化预设
/// </summary>
public class RandomGeneratorWindow : EditorWindow
{
private int buildingNum;
private float halfSideLength = 5000;
private float minScale = 0.8f;
private float maxScale = 1.2f;
private Transform buildingRoot;
private Transform roadRoot;
[SerializeField]
private List<GameObject> prefabList;
private SerializedObject serializedObject;
private SerializedProperty serializedProperty;
private Vector2 scrollPos;
[MenuItem("Tools/创建建筑")]
static void Init()
{
RandomGeneratorWindow window = EditorWindow.GetWindow<RandomGeneratorWindow>();
window.Show();
}
void OnEnable()
{
serializedObject = new SerializedObject(this);
serializedProperty = serializedObject.FindProperty("prefabList");
}
// Update is called once per frame
void OnGUI()
{
scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
buildingNum = EditorGUILayout.IntField("建筑数量:", buildingNum);
halfSideLength = EditorGUILayout.FloatField("地形边长(一半):", halfSideLength);
minScale = EditorGUILayout.FloatField("随机缩放(最小):", minScale);
maxScale = EditorGUILayout.FloatField("随机缩放(最大):", maxScale);
buildingRoot = EditorGUILayout.ObjectField("建筑组:", buildingRoot, typeof(Transform), true) as Transform;
serializedObject.Update();
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(serializedProperty, new GUIContent("建筑预设:"), true);
if (EditorGUI.EndChangeCheck())
{
serializedObject.ApplyModifiedProperties();
}
if (GUILayout.Button("生成"))
{
buildingRoot.ClearChild(true);
int i = 0;
while (i++ < buildingNum)
{
float randomX = Random.Range(-halfSideLength, halfSideLength);
float randomZ = Random.Range(-halfSideLength, halfSideLength);
GameObject prefab = prefabList.Random();
GameObject instance = PrefabUtility.InstantiatePrefab(prefab) as GameObject;
instance.transform.SetParent(buildingRoot);
instance.transform.position = new Vector3(randomX, 0, randomZ);
instance.transform.eulerAngles = new Vector3(0, Random.value * 360, 0);
instance.transform.localScale *= Random.Range(minScale, maxScale);
}
}
roadRoot = EditorGUILayout.ObjectField("道路组:", roadRoot, typeof(Transform), true) as Transform;
if (GUILayout.Button("删除道路上建筑"))
{
IEnumerable<Bounds> boundses = roadRoot.GetComponentsInChildren<BoxCollider>().Select(x => x.bounds);
for (int i = buildingRoot.childCount - 1; i >= 0; i--)
{
Transform building = buildingRoot.GetChild(i);
if (boundses.Count(x => Vector3.Distance(x.ClosestPoint(building.position), building.position) < 100) > 0)
{
DestroyImmediate(building.gameObject);
}
}
}
EditorGUILayout.EndScrollView();
}
}
}