using System.Collections.Generic; using UnityEditor; using UnityEngine; using System.IO; [CustomEditor(typeof(CarWalkPath))] public class CarWalkPathEditor : Editor { private CarWalkPath walkPathTarget; private SerializedProperty _ignorePeopleProperty; public static List FindAssetsByType() where T : UnityEngine.Object { List assets = new List(); string[] guids = AssetDatabase.FindAssets(string.Format("t:{0}", typeof(T))); for (int i = 0; i < guids.Length; i++) { string assetPath = AssetDatabase.GUIDToAssetPath(guids[i]); T asset = AssetDatabase.LoadAssetAtPath(assetPath); if (asset != null) { assets.Add(asset); } } return assets; } public void OnEnable() { walkPathTarget = target as CarWalkPath; _ignorePeopleProperty = serializedObject.FindProperty("_ignorePeople"); } public List FindAllDirs(string path) { List ret = new List(); DirectoryInfo f = new DirectoryInfo(path); if (f.GetDirectories().Length > 0) { foreach (var item in f.GetDirectories()) { ret.Add(item); if (item.GetDirectories().Length > 0) { ret.AddRange(FindAllDirs(item.FullName)); } } } return ret; } public void OnSceneGUI() { if (walkPathTarget.newPointCreation || walkPathTarget.oldPointDeleting) { if (Event.current.type == EventType.MouseMove) SceneView.RepaintAll(); RaycastHit hit; Vector2 mPos = Event.current.mousePosition; mPos.y = Screen.height - mPos.y - 40; Ray ray = Camera.current.ScreenPointToRay(mPos); if (Physics.Raycast(ray, out hit, 3000)) { walkPathTarget.mousePosition = hit.point; if ((Event.current.type == EventType.MouseDown && Event.current.button == 0)) { // создаём новую точку if (walkPathTarget.newPointCreation) { walkPathTarget.AddPoint(); } // удаляем старую точку if (walkPathTarget.oldPointDeleting) { walkPathTarget.DeletePoint(); } } } } } public override void OnInspectorGUI() { serializedObject.Update(); CarWalkPath walkPath = target as CarWalkPath; EditorGUILayout.Space(); GUIStyle boxStyle = new GUIStyle("Box"); EditorGUILayout.LabelField("Vehicle Path", boxStyle, GUILayout.ExpandWidth(true)); EditorGUILayout.Space(); DrawDefaultInspector(); EditorGUILayout.Space(); EditorGUILayout.Space(); EditorGUILayout.PropertyField(_ignorePeopleProperty, new GUIContent("Ignore Passersby")); GUI.backgroundColor = Color.green; if (GUILayout.Button("Populate!")) { if (walkPath.par != null) { foreach (Transform item in walkPath.par.transform) { if (item.GetComponent()) { item.GetComponent().OnDestroy(); } } DestroyImmediate(walkPath.par); } if (walkPath.walkingPrefabs != null && walkPath.walkingPrefabs.Length > 0 && walkPath.walkingPrefabs[0] != null) { walkPath.SpawnPeople(); } } GUI.backgroundColor = Color.white; if (GUILayout.Button("Remove prefabs")) { if (walkPath.par != null) { if (walkPath.par.transform.childCount > 0) { foreach (Transform item in walkPath.par.transform) { AddTrailer t = null; if (t = item.GetComponent()) { t.OnDestroy(); } } } DestroyImmediate(walkPath.par); } } EditorGUILayout.Space(); EditorGUILayout.Space(); EditorGUILayout.Space(); if (walkPath.walkingPrefabs == null || walkPath.walkingPrefabs.Length == 0 || walkPath.walkingPrefabs[0] == null) EditorGUILayout.HelpBox("To create a path must be at least 1 walking object prefab", MessageType.Warning); if ((walkPathTarget.oldPointDeleting || walkPathTarget.newPointCreation) && GUILayout.Button("Edit Points Finish")) { walkPathTarget.newPointCreation = false; walkPathTarget.oldPointDeleting = false; walkPathTarget.EditorLock(false); } if (!walkPathTarget.newPointCreation && !walkPathTarget.oldPointDeleting) { if (GUILayout.Button("Add Points")) { walkPathTarget.newPointCreation = true; walkPathTarget.EditorLock(true); } if (GUILayout.Button("Delete Points")) { walkPathTarget.oldPointDeleting = true; walkPathTarget.EditorLock(true); } if (!walkPath.disableLineDraw) { if (GUILayout.Button("HIDE GRAPHICS")) { walkPath.disableLineDraw = true; walkPath.HideExistingIcons(); return; } } if (walkPath.disableLineDraw) { if (GUILayout.Button("SHOW GRAPHICS")) { walkPath.disableLineDraw = false; walkPath.ShowExistingIcons(); } } } if (GUILayout.Button("Re-Build Points")) { Transform parentOfPoints = walkPath.transform.Find("points"); Transform[] pointsTransform = parentOfPoints.GetComponentsInChildren(); walkPath.pathPoint.Clear(); walkPath.pathPointTransform.Clear(); for (int i = 1; i < pointsTransform.Length; i++) { walkPath.pathPoint.Add(pointsTransform[i].position); walkPath.pathPointTransform.Add(pointsTransform[i].gameObject); } } serializedObject.ApplyModifiedProperties(); } }