using System.Collections.Generic; using UnityEngine; using System.IO; using LitJson; using System.Text; #if UNITY_EDITOR using UnityEditor; #endif namespace H2Engine { public class Bhv_Evt_RefreshSceneObject : Bhv_Evt { [HideInInspector] public List sceneObjList = new List(); #if UNITY_EDITOR [HideInInspector] private bool showSceneObjList = false; [HideInInspector] private string newSceneObjResName = ""; public override void Save(BinaryWriter bw) { base.Save(bw); bw.Write(sceneObjList.Count); foreach (var _sceneObject in sceneObjList) { _sceneObject.Save(bw); } } public override void Export(BinaryWriter bw) { base.Export(bw); bw.Write(sceneObjList.Count); Debug.LogFormat("sceneObjList.Count: {0}", sceneObjList.Count); foreach (var _sceneObject in sceneObjList) { _sceneObject.Export(bw); } } public override void Load(BinaryReader br) { base.Load(br); int _count = br.ReadInt32(); for (int i = 0; i < _count; ++i) { string _resName = br.ReadString(); var _sceneData = CreateSceneObject(_resName); _sceneData.Load(br); _sceneData.transform.SetParent(transform); sceneObjList.Add(_sceneData); } } public override bool DrawUI(GUISkin guiSkin) { bool _result = false; EditorGUILayout.BeginVertical(guiSkin.box); EditorGUILayout.BeginHorizontal(GUILayout.Height(22)); EditorGUI.indentLevel += 1; showDetail = EditorGUILayout.Foldout(showDetail, " ID:" + id + " | Type: " + type, true, guiSkin.customStyles[3]); if (GUILayout.Button("定位", guiSkin.button, GUILayout.Width(60), GUILayout.Height(22))) { Selection.activeGameObject = gameObject; if (Selection.activeGameObject) { SceneView.lastActiveSceneView.LookAt(Selection.activeGameObject.transform.position); } } if (GUILayout.Button("删除", guiSkin.button, GUILayout.Width(60), GUILayout.Height(22))) { _result = true; } EditorGUILayout.EndHorizontal(); if (showDetail) { EditorGUILayout.BeginVertical(guiSkin.customStyles[1]); EditorGUILayout.BeginHorizontal(GUILayout.Height(22)); if (sceneObjList.Count > 0) { showSceneObjList = EditorGUILayout.Foldout(showSceneObjList, " 场景物件列表", true, guiSkin.customStyles[3]); } else { EditorGUILayout.LabelField(" 场景物件列表:", guiSkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(100)); GUILayout.FlexibleSpace(); } EditorGUILayout.LabelField("ResName:", guiSkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(60)); newSceneObjResName = EditorGUILayout.TextField(newSceneObjResName, guiSkin.textField, GUILayout.Width(100), GUILayout.Height(20)); if (GUILayout.Button("添加", guiSkin.button, GUILayout.Width(60), GUILayout.Height(22))) { var _sceneObject = CreateSceneObject(newSceneObjResName); if (_sceneObject) { sceneObjList.Add(_sceneObject); showSceneObjList = true; } } EditorGUILayout.EndHorizontal(); if (showSceneObjList) { for (int i = sceneObjList.Count - 1; i >= 0; --i) { EditorGUILayout.BeginHorizontal(GUILayout.Height(22)); EditorGUILayout.LabelField(string.Format("{0}. ResName", (i + 1)), guiSkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(80)); var _npcID = sceneObjList[i].resName; EditorGUILayout.TextField(sceneObjList[i].resName, guiSkin.textField, GUILayout.Height(20)); sceneObjList[i].isObstacle = GUILayout.Toggle(sceneObjList[i].isObstacle, "障碍", guiSkin.button, GUILayout.Width(50), GUILayout.Height(20)); if (GUILayout.Button("定高", guiSkin.button, GUILayout.Width(60), GUILayout.Height(20))) { Vector3 _pos = sceneObjList[i].transform.position; _pos.y = 0; RaycastHit _hit; Ray _ray = new Ray(_pos + Vector3.up * 100, Vector3.down); if (Physics.Raycast(_ray, out _hit, 200, LayerUtility.WalkbleMask)) { sceneObjList[i].transform.position = _hit.point; } } if (GUILayout.Button("查找", guiSkin.button, GUILayout.Width(60), GUILayout.Height(20))) { Selection.activeGameObject = sceneObjList[i].gameObject; if (Selection.activeGameObject) { SceneView.lastActiveSceneView.LookAt(Selection.activeGameObject.transform.position); } } if (GUILayout.Button("删除", guiSkin.button, GUILayout.Width(60), GUILayout.Height(20))) { DestroyImmediate(sceneObjList[i].gameObject); sceneObjList.RemoveAt(i); } EditorGUILayout.EndHorizontal(); } } EditorGUILayout.EndVertical(); } EditorGUI.indentLevel -= 1; EditorGUILayout.EndVertical(); return _result; } private Bhv_SceneObjectData CreateSceneObject(string sceneName = null) { if (!string.IsNullOrEmpty(sceneName)) { string _path = "Assets/ResourcesOut/Gmodels/Prefab_Race_" + sceneName + ".prefab"; var _obj = AssetDatabase.LoadAssetAtPath(_path); if (!_obj) { Debug.LogError("所要创建的资源不存在: " + _path); return null; } _obj = Instantiate(_obj); var _sceneObjData = _obj.AddComponent(); _sceneObjData.resName = sceneName; RaycastHit _hit; Ray _ray = SceneView.lastActiveSceneView.camera.ViewportPointToRay(new Vector3(.5f, .5f, 0)); if (Physics.Raycast(_ray, out _hit, 10000f, LayerUtility.WalkbleMask)) { _sceneObjData.transform.position = _hit.point; } _sceneObjData.transform.SetParent(transform); _sceneObjData.transform.eulerAngles = Vector3.zero; _sceneObjData.transform.localScale = Vector3.one; Selection.activeGameObject = _sceneObjData.gameObject; if (Selection.activeGameObject) { SceneView.lastActiveSceneView.LookAt(Selection.activeGameObject.transform.position); } return _sceneObjData; } return null; } public override void SaveJson(StringBuilder stringBuilder) { throw new System.NotImplementedException(); } public override void LoadJson(JsonData json) { throw new System.NotImplementedException(); } #endif } }