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<Bhv_SceneObjectData> sceneObjList = new List<Bhv_SceneObjectData>();
|
|
#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<GameObject>(_path);
|
if (!_obj)
|
{
|
Debug.LogError("所要创建的资源不存在: " + _path);
|
return null;
|
}
|
_obj = Instantiate(_obj);
|
var _sceneObjData = _obj.AddComponent<Bhv_SceneObjectData>();
|
_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
|
|
}
|
}
|