using UnityEngine; using System.Collections.Generic; using System.IO; #if UNITY_EDITOR using UnityEditor; #endif namespace H2Engine { public class Bhv_Trasfer : MonoBehaviour { [HideInInspector] public int id; [HideInInspector] public MapTrasfer.E_TransferType transferType = MapTrasfer.E_TransferType.None; [HideInInspector] public int param; [HideInInspector] public List pointList = new List(); #if UNITY_EDITOR private bool showDetail; public void Save(BinaryWriter bw) { bw.Write((byte)transferType); bw.Write(param); bw.Write(pointList.Count); foreach (var _point in pointList) { _point.Save(bw); } } public void SaveJson(System.Text.StringBuilder stringBuilder) { stringBuilder.Append("{"); stringBuilder.Append("\"transferType\":").Append((byte)transferType).Append(","); stringBuilder.Append("\"param\":").Append(param).Append(","); stringBuilder.Append("\"pointList\":["); if (pointList.Count > 0) { pointList[0].SaveJson(stringBuilder); for (int i = 1; i < pointList.Count; ++i) { stringBuilder.Append(","); pointList[i].SaveJson(stringBuilder); } } stringBuilder.Append("]"); stringBuilder.Append("}"); } public void LoadJson(LitJson.JsonData json) { transferType = (MapTrasfer.E_TransferType)(byte)json["transferType"]; param = (int)json["param"]; var _pointList = json["pointList"]; for (int i = 0; i < _pointList.Count; ++i) { var _go = new GameObject(pointList.Count + "_TransferPoint"); _go.transform.SetParent(transform); _go.transform.localPosition = Vector3.zero; _go.transform.eulerAngles = Vector3.zero; _go.transform.localScale = Vector3.one; var _transferPoint = _go.AddComponent(); _transferPoint.capsuleCollider = _go.AddComponent(); pointList.Add(_transferPoint); _transferPoint.LoadJson(_pointList[i]); } } public void Export(BinaryWriter bw) { bw.Write((byte)transferType); bw.Write(param); bw.Write(pointList.Count); foreach (var _point in pointList) { _point.Export(bw); } } public void Load(BinaryReader br) { transferType = (MapTrasfer.E_TransferType)br.ReadByte(); param = br.ReadInt32(); int _count = br.ReadInt32(); for (int i = 0; i < _count; ++i) { var _go = new GameObject(pointList.Count + "_TransferPoint"); _go.transform.SetParent(transform); _go.transform.localPosition = Vector3.zero; _go.transform.eulerAngles = Vector3.zero; _go.transform.localScale = Vector3.one; var _transferPoint = _go.AddComponent(); _transferPoint.capsuleCollider = _go.AddComponent(); pointList.Add(_transferPoint); _transferPoint.Load(br); } } public bool DrawUI(Bhv_MapData mapData, GUISkin guiSkin) { bool _result = false; EditorGUILayout.BeginVertical(guiSkin.box); EditorGUILayout.BeginHorizontal(GUILayout.Height(20)); EditorGUI.indentLevel += 1; showDetail = EditorGUILayout.Foldout(showDetail, " No." + mapData.transferList.IndexOf(this), true, guiSkin.customStyles[3]); if (GUILayout.Button("删除", guiSkin.button, GUILayout.Width(60), GUILayout.Height(20))) { _result = true; } EditorGUILayout.EndHorizontal(); if (showDetail) { EditorGUILayout.BeginHorizontal(GUILayout.Height(22)); EditorGUILayout.LabelField("类型", guiSkin.customStyles[0], GUILayout.Height(20), GUILayout.Width(40)); transferType = (MapTrasfer.E_TransferType)EditorGUILayout.EnumPopup(transferType, guiSkin.box, GUILayout.Height(20)); EditorGUILayout.EndHorizontal(); if (transferType == MapTrasfer.E_TransferType.Other) { EditorGUILayout.BeginHorizontal(GUILayout.Height(22)); EditorGUILayout.LabelField("MapID", guiSkin.customStyles[0], GUILayout.Height(20), GUILayout.Width(40)); param = EditorGUILayout.IntField(param, guiSkin.textField, GUILayout.Height(20)); EditorGUILayout.EndHorizontal(); } EditorGUILayout.BeginVertical(guiSkin.customStyles[1]); EditorGUILayout.BeginHorizontal(GUILayout.Height(22)); EditorGUILayout.LabelField("传送点列表", guiSkin.customStyles[0], GUILayout.Height(20)); if (GUILayout.Button("添加", guiSkin.button, GUILayout.Width(60), GUILayout.Height(20))) { var _go = new GameObject(pointList.Count + "_TransferPoint"); _go.transform.SetParent(transform); _go.transform.localPosition = Vector3.zero; _go.transform.eulerAngles = Vector3.zero; _go.transform.localScale = Vector3.one; var _transferPoint = _go.AddComponent(); _transferPoint.capsuleCollider = _go.AddComponent(); pointList.Add(_transferPoint); } EditorGUILayout.EndHorizontal(); if (pointList.Count > 0) { for (int i = pointList.Count - 1; i >= 0; --i) { if (pointList[i] == null) { pointList.RemoveAt(i); continue; } EditorGUILayout.BeginVertical(guiSkin.box); EditorGUILayout.BeginHorizontal(GUILayout.Height(22)); EditorGUILayout.LabelField("[" + (i + 1) + "]", guiSkin.customStyles[0], GUILayout.Height(20), GUILayout.Width(25)); EditorGUILayout.LabelField("特效", guiSkin.customStyles[0], GUILayout.Height(20), GUILayout.Width(25)); var _effectID = pointList[i].effectID; _effectID = EditorGUILayout.IntField(_effectID, guiSkin.textField, GUILayout.Height(20)); if (_effectID != pointList[i].effectID) { if (EffectConfig.Has(_effectID)) { var _prefab = InstanceResourcesLoader.LoadEffect(_effectID); if (_prefab) { if (pointList[i].Effect) { DestroyImmediate(pointList[i].Effect); pointList[i].Effect = null; } pointList[i].Effect = Instantiate(_prefab); pointList[i].Effect.transform.SetParent(pointList[i].transform); pointList[i].Effect.transform.localPosition = Vector3.zero; pointList[i].Effect.transform.localScale = Vector3.one; pointList[i].Effect.transform.rotation = Quaternion.identity; pointList[i].effectID = _effectID; } } } EditorGUILayout.EndHorizontal(); if (i - 1 >= 0) { EditorGUILayout.BeginHorizontal(GUILayout.Height(22)); EditorGUILayout.LabelField("到上一个节点的动作", guiSkin.customStyles[0], GUILayout.Height(20), GUILayout.Width(120)); pointList[i].stateNameBack = EditorGUILayout.TextField(pointList[i].stateNameBack, guiSkin.textField, GUILayout.Height(20)); EditorGUILayout.LabelField("时间", guiSkin.customStyles[0], GUILayout.Height(20), GUILayout.Width(25)); pointList[i].flyTimeBack = EditorGUILayout.FloatField(pointList[i].flyTimeBack, guiSkin.textField, GUILayout.Height(20)); EditorGUILayout.EndHorizontal(); } if (i + 1 < pointList.Count) { EditorGUILayout.BeginHorizontal(GUILayout.Height(22)); EditorGUILayout.LabelField("到下一个节点的动作", guiSkin.customStyles[0], GUILayout.Height(20), GUILayout.Width(120)); pointList[i].stateNameFront = EditorGUILayout.TextField(pointList[i].stateNameFront, guiSkin.textField, GUILayout.Height(20)); EditorGUILayout.LabelField("时间", guiSkin.customStyles[0], GUILayout.Height(20), GUILayout.Width(25)); pointList[i].flyTimeFront = EditorGUILayout.FloatField(pointList[i].flyTimeFront, guiSkin.textField, GUILayout.Height(20)); EditorGUILayout.EndHorizontal(); } EditorGUILayout.BeginHorizontal(GUILayout.Height(22)); if (GUILayout.Button("定高", guiSkin.button, GUILayout.Height(20))) { Vector3 _pos = pointList[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, 1 << LayerMask.NameToLayer("WalkbleLayer"))) { pointList[i].transform.position = _hit.point; } } if (GUILayout.Button("查找", guiSkin.button, GUILayout.Height(20))) { Selection.activeGameObject = pointList[i].gameObject; if (Selection.activeGameObject) { SceneView.lastActiveSceneView.LookAt(Selection.activeGameObject.transform.position); } } if (GUILayout.Button("删除", guiSkin.button, GUILayout.Height(20))) { DestroyImmediate(pointList[i].gameObject); pointList.RemoveAt(i); } EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); } } EditorGUILayout.EndVertical(); } EditorGUI.indentLevel -= 1; EditorGUILayout.EndVertical(); return _result; } #endif } }