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_RefreshMonster : Bhv_Evt
|
{
|
[HideInInspector]
|
public Evt_RefreshMonster.E_OverCondition overCondition = Evt_RefreshMonster.E_OverCondition.DeadCount;
|
[HideInInspector]
|
public Evt_RefreshMonster.E_RefreshType refreshType = Evt_RefreshMonster.E_RefreshType.All;
|
[HideInInspector]
|
public List<Bhv_MonsterData> monsterList = new List<Bhv_MonsterData>();
|
[HideInInspector]
|
public int conditionParam;
|
[HideInInspector]
|
public int overParam;
|
[HideInInspector]
|
public int nextEventID = -1;
|
|
#if UNITY_EDITOR
|
|
[HideInInspector]
|
private bool showMonsterList = false;
|
private int npcID = -1;
|
private string resName;
|
|
public override void Save(BinaryWriter bw)
|
{
|
base.Save(bw);
|
bw.Write((byte)overCondition);
|
bw.Write((byte)refreshType);
|
bw.Write(conditionParam);
|
bw.Write(overParam);
|
bw.Write(nextEventID);
|
bw.Write(monsterList.Count);
|
foreach (var _monster in monsterList)
|
{
|
_monster.Save(bw);
|
}
|
}
|
|
public override void SaveJson(StringBuilder stringBuilder)
|
{
|
stringBuilder.Append("{");
|
stringBuilder.Append("\"type\":").Append((byte)type).Append(",");
|
stringBuilder.Append("\"id\":").Append(id).Append(",");
|
stringBuilder.Append("\"px\":").Append((float)System.Math.Round(transform.position.x, 2)).Append(",");
|
stringBuilder.Append("\"py\":").Append((float)System.Math.Round(transform.position.y, 2)).Append(",");
|
stringBuilder.Append("\"pz\":").Append((float)System.Math.Round(transform.position.z, 2)).Append(",");
|
stringBuilder.Append("\"overCondition\":").Append((byte)overCondition).Append(",");
|
stringBuilder.Append("\"refreshType\":").Append((byte)refreshType).Append(",");
|
stringBuilder.Append("\"conditionParam\":").Append(conditionParam).Append(",");
|
stringBuilder.Append("\"overParam\":").Append(overParam).Append(",");
|
stringBuilder.Append("\"nextEventID\":").Append(nextEventID).Append(",");
|
stringBuilder.Append("\"monsterList\":[");
|
if (monsterList.Count > 0)
|
{
|
monsterList[0].SaveJson(stringBuilder);
|
for (int i = 1; i < monsterList.Count; ++i)
|
{
|
stringBuilder.Append(",");
|
monsterList[i].SaveJson(stringBuilder);
|
}
|
}
|
stringBuilder.Append("]");
|
stringBuilder.Append("}");
|
}
|
|
public override void LoadJson(JsonData json)
|
{
|
type = (Evt.E_EventType)(byte)json["type"];
|
id = (int)json["id"];
|
float _pX = Bhv_MapData.GetJsonFloat(json["px"]);
|
float _pY = Bhv_MapData.GetJsonFloat(json["py"]);
|
float _pZ = Bhv_MapData.GetJsonFloat(json["pz"]);
|
transform.position = new Vector3(_pX, _pY, _pZ);
|
overCondition = (Evt_RefreshMonster.E_OverCondition)(byte)json["overCondition"];
|
refreshType = (Evt_RefreshMonster.E_RefreshType)(byte)json["refreshType"];
|
conditionParam = (int)json["conditionParam"];
|
overParam = (int)json["overParam"];
|
nextEventID = (int)json["nextEventID"];
|
var _monsterList = json["monsterList"];
|
for (int i = 0; i < _monsterList.Count; ++i)
|
{
|
var _resName = _monsterList[i]["resName"].ToString();
|
GameObject _go = null;
|
|
if (!string.IsNullOrEmpty(_resName.Trim()))
|
{
|
string _path = "Assets/ResourcesOut/Gmodels/Prefab_Race_" + _resName + ".prefab";
|
_go = AssetDatabase.LoadAssetAtPath<GameObject>(_path);
|
if (_go)
|
{
|
_go = Instantiate(_go);
|
}
|
}
|
else
|
{
|
_go = GameObject.CreatePrimitive(PrimitiveType.Capsule);
|
}
|
|
_go.transform.SetParent(transform);
|
_go.transform.localPosition = Vector3.zero;
|
_go.transform.eulerAngles = Vector3.zero;
|
_go.transform.localScale = Vector3.one;
|
|
var _monsterData = _go.AddComponent<Bhv_MonsterData>();
|
_monsterData.resName = _resName;
|
monsterList.Add(_monsterData);
|
|
_monsterData.LoadJson(_monsterList[i]);
|
}
|
}
|
|
public override void Load(BinaryReader br)
|
{
|
base.Load(br);
|
overCondition = (Evt_RefreshMonster.E_OverCondition)br.ReadByte();
|
refreshType = (Evt_RefreshMonster.E_RefreshType)br.ReadByte();
|
conditionParam = br.ReadInt32();
|
overParam = br.ReadInt32();
|
nextEventID = br.ReadInt32();
|
int _count = br.ReadInt32();
|
for (int i = 0; i < _count; ++i)
|
{
|
var _resName = br.ReadString();
|
GameObject _go = null;
|
|
if (!string.IsNullOrEmpty(_resName.Trim()))
|
{
|
string _path = "Assets/ResourcesOut/Gmodels/Prefab_Race_" + _resName + ".prefab";
|
_go = AssetDatabase.LoadAssetAtPath<GameObject>(_path);
|
if (_go)
|
{
|
_go = Instantiate(_go);
|
}
|
else
|
{
|
_go = GameObject.CreatePrimitive(PrimitiveType.Capsule);
|
}
|
}
|
else
|
{
|
_go = GameObject.CreatePrimitive(PrimitiveType.Capsule);
|
}
|
|
_go.transform.SetParent(transform);
|
_go.transform.localPosition = Vector3.zero;
|
_go.transform.eulerAngles = Vector3.zero;
|
_go.transform.localScale = Vector3.one;
|
|
var _monsterData = _go.AddComponent<Bhv_MonsterData>();
|
_monsterData.resName = _resName;
|
monsterList.Add(_monsterData);
|
|
_monsterData.Load(br);
|
}
|
}
|
|
public override void Export(BinaryWriter bw)
|
{
|
base.Export(bw);
|
bw.Write((byte)overCondition);
|
bw.Write((byte)refreshType);
|
bw.Write(conditionParam);
|
bw.Write(overParam);
|
bw.Write(nextEventID);
|
bw.Write(monsterList.Count);
|
foreach (var _monster in monsterList)
|
{
|
_monster.Export(bw);
|
}
|
}
|
|
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, "", true, guiSkin.customStyles[3]);
|
EditorGUILayout.LabelField("ID", guiSkin.label, GUILayout.Height(22), GUILayout.Width(20));
|
id = EditorGUILayout.IntField(id, guiSkin.textField, GUILayout.Height(22), GUILayout.Width(70));
|
EditorGUILayout.LabelField("Type:" + type.ToString(), guiSkin.label, GUILayout.Height(22));
|
GUILayout.FlexibleSpace();
|
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.BeginHorizontal(GUILayout.Height(22));
|
EditorGUILayout.LabelField("刷怪方式", guiSkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(60));
|
refreshType = (Evt_RefreshMonster.E_RefreshType)EditorGUILayout.EnumPopup(refreshType, guiSkin.box, GUILayout.Height(20));
|
EditorGUILayout.EndHorizontal();
|
|
EditorGUILayout.BeginHorizontal(GUILayout.Height(22));
|
if (refreshType == Evt_RefreshMonster.E_RefreshType.OneByOneTime)
|
{
|
EditorGUILayout.LabelField("等待时间", guiSkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(60));
|
conditionParam = EditorGUILayout.IntField(conditionParam, guiSkin.textField, GUILayout.Height(20));
|
}
|
EditorGUILayout.EndHorizontal();
|
|
EditorGUILayout.BeginHorizontal(GUILayout.Height(22));
|
EditorGUILayout.LabelField("完成方式", guiSkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(60));
|
overCondition = (Evt_RefreshMonster.E_OverCondition)EditorGUILayout.EnumPopup(overCondition, guiSkin.box, GUILayout.Height(20));
|
EditorGUILayout.EndHorizontal();
|
|
EditorGUILayout.BeginHorizontal(GUILayout.Height(22));
|
if (overCondition == Evt_RefreshMonster.E_OverCondition.DeadCount)
|
{
|
EditorGUILayout.LabelField("死亡数量", guiSkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(60));
|
overParam = EditorGUILayout.IntField(overParam, guiSkin.textField, GUILayout.Height(20));
|
}
|
else if (overCondition == Evt_RefreshMonster.E_OverCondition.Time)
|
{
|
EditorGUILayout.LabelField("结束时间", guiSkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(60));
|
overParam = EditorGUILayout.IntField(overParam, guiSkin.textField, GUILayout.Height(20));
|
}
|
EditorGUILayout.EndHorizontal();
|
|
EditorGUILayout.BeginHorizontal(guiSkin.customStyles[1], GUILayout.Height(22));
|
EditorGUILayout.LabelField("下一事件", guiSkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(60));
|
nextEventID = EditorGUILayout.IntField(nextEventID, guiSkin.textField, GUILayout.Height(22));
|
EditorGUILayout.EndHorizontal();
|
|
EditorGUILayout.BeginVertical(guiSkin.customStyles[1]);
|
|
EditorGUILayout.BeginHorizontal(GUILayout.Height(22));
|
showMonsterList = EditorGUILayout.Foldout(showMonsterList, " 刷怪列表", true, guiSkin.customStyles[3]);
|
EditorGUILayout.LabelField("NPCID", guiSkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(50));
|
npcID = EditorGUILayout.IntField(npcID, guiSkin.textField, GUILayout.Height(22), GUILayout.Width(70));
|
EditorGUILayout.LabelField("模型名", guiSkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(50));
|
resName = EditorGUILayout.TextField(resName, guiSkin.textField, GUILayout.Height(22), GUILayout.Width(70));
|
if (GUILayout.Button("添加", guiSkin.button, GUILayout.Width(60), GUILayout.Height(22)))
|
{
|
var _monsterData = CreateNPC(npcID, resName);
|
if (_monsterData)
|
{
|
monsterList.Add(_monsterData);
|
showMonsterList = true;
|
|
Selection.activeGameObject = _monsterData.gameObject;
|
if (Selection.activeGameObject)
|
{
|
SceneView.lastActiveSceneView.LookAt(Selection.activeGameObject.transform.position);
|
}
|
}
|
}
|
EditorGUILayout.EndHorizontal();
|
if (showMonsterList)
|
{
|
for (int i = monsterList.Count - 1; i >= 0; --i)
|
{
|
EditorGUILayout.BeginHorizontal(GUILayout.Height(22));
|
EditorGUILayout.LabelField("NPCID", guiSkin.customStyles[0], GUILayout.Height(20), GUILayout.Width(50));
|
monsterList[i].npcID = (uint)EditorGUILayout.IntField((int)monsterList[i].npcID, guiSkin.textField, GUILayout.Height(20), GUILayout.Width(70));
|
EditorGUILayout.LabelField("模型名", guiSkin.customStyles[0], GUILayout.Height(20), GUILayout.Width(50));
|
monsterList[i].resName = EditorGUILayout.TextField(monsterList[i].resName, guiSkin.textField, GUILayout.Height(20), GUILayout.Width(70));
|
EditorGUILayout.LabelField("朝向", guiSkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(30));
|
monsterList[i].faceDir = EditorGUILayout.IntField(monsterList[i].faceDir, guiSkin.textField, GUILayout.Height(22), GUILayout.Width(70));
|
if (GUILayout.Button("定高", guiSkin.button, GUILayout.Width(60), GUILayout.Height(20)))
|
{
|
Vector3 _pos = monsterList[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))
|
{
|
monsterList[i].transform.position = _hit.point;
|
}
|
}
|
if (GUILayout.Button("查找", guiSkin.button, GUILayout.Width(60), GUILayout.Height(20)))
|
{
|
Selection.activeGameObject = monsterList[i].gameObject;
|
if (Selection.activeGameObject)
|
{
|
SceneView.lastActiveSceneView.LookAt(Selection.activeGameObject.transform.position);
|
}
|
}
|
if (GUILayout.Button("删除", guiSkin.button, GUILayout.Width(60), GUILayout.Height(20)))
|
{
|
DestroyImmediate(monsterList[i].gameObject);
|
monsterList.RemoveAt(i);
|
}
|
EditorGUILayout.EndHorizontal();
|
}
|
}
|
EditorGUILayout.EndVertical();
|
}
|
|
EditorGUI.indentLevel -= 1;
|
EditorGUILayout.EndVertical();
|
return _result;
|
}
|
|
private Bhv_MonsterData CreateNPC(int id, string name)
|
{
|
if (id <= 0)
|
{
|
Debug.Log("NPCID非法");
|
return null;
|
}
|
|
if (string.IsNullOrEmpty(name.Trim()))
|
{
|
Debug.Log("模型名不应该为空");
|
return null;
|
}
|
|
string _path = "Assets/ResourcesOut/Gmodels/Prefab_Race_" + name + ".prefab";
|
var _obj = AssetDatabase.LoadAssetAtPath<GameObject>(_path);
|
if (!_obj)
|
{
|
Debug.LogError("所要创建的资源不存在: " + _path);
|
return null;
|
}
|
|
_obj = Instantiate(_obj);
|
|
RaycastHit _hit;
|
Ray _ray = SceneView.lastActiveSceneView.camera.ViewportPointToRay(new Vector3(.5f, .5f, 0));
|
if (Physics.Raycast(_ray, out _hit, 1000f, LayerUtility.WalkbleMask))
|
{
|
_obj.transform.position = _hit.point;
|
}
|
_obj.transform.SetParent(transform);
|
_obj.transform.eulerAngles = Vector3.zero;
|
_obj.transform.localScale = Vector3.one;
|
|
var _monsterData = _obj.AddComponent<Bhv_MonsterData>();
|
_monsterData.npcID = (uint)id;
|
_monsterData.resName = name;
|
|
return _monsterData;
|
}
|
#endif
|
}
|
}
|