public void SetData(EditMode editMode,AIClipGroup clipGroup, AIClip dataToEdit, OnCreateNew createCallBack) { mDataUnit = dataToEdit; mClipGroup = clipGroup; mMode = editMode; onCreateNew = createCallBack; }
public static void DrawAiLinkPopup(AIClipGroup clipGroup, AILink link) { if (clipGroup == null) { GUILayout.Label("Ai组为空"); return; } if (clipGroup.aiClipList.Count == 0) { GUILayout.Label("片断列表为空"); return; } GUILayout.BeginHorizontal(); GUILayout.Label("连接动画名", GUILayout.Width(70)); string[] optionClips = new string[clipGroup.aiClipList.Count]; for (int i = 0; i < optionClips.Length; i++) { optionClips[i] = clipGroup.aiClipList[i].NameOnUI; } int curSelectIndex = clipGroup.aiClipList.FindIndex(delegate(AIClip targetClip) { return(targetClip.clipKey == link.linkToClip); }); if (curSelectIndex < 0) { curSelectIndex = 0; } curSelectIndex = EditorGUILayout.Popup(curSelectIndex, optionClips); //最终的选择 link.linkToClip = clipGroup.aiClipList[curSelectIndex].clipKey; GUILayout.EndHorizontal(); }
/// <summary> /// 设置AI组数据 /// </summary> public virtual void SetAIClipGroup(AIClipGroup groupData) { mAiClipGroup = groupData; mCurAIClip = mAiClipGroup.aiClipList[0]; SwitchAIClip(mCurAIClip, 0); UpdateShape(); }
public void SetData(EditMode editMode, AIClipGroup clipGroup, AIClip dataToEdit, OnCreateNew createCallBack) { mDataUnit = dataToEdit; mClipGroup = clipGroup; mMode = editMode; onCreateNew = createCallBack; }
public static void DrawCommanAnimation(AICommonAnimation comAnim, AIClipGroup clipGroup) { GUILayout.Label("AI通用片断"); comAnim.die = AIFUIUtility.DrawAiLinkPopup(clipGroup, comAnim.die, " 默认连接", 150); comAnim.hit = AIFUIUtility.DrawAiLinkPopup(clipGroup, comAnim.hit, " 受击", 150); comAnim.idle = AIFUIUtility.DrawAiLinkPopup(clipGroup, comAnim.idle, " 默认待机", 150); comAnim.run = AIFUIUtility.DrawAiLinkPopup(clipGroup, comAnim.run, " 跑步", 150); comAnim.walk = AIFUIUtility.DrawAiLinkPopup(clipGroup, comAnim.walk, " 走路", 150); }
public static void SelectAIGroup(AIClipGroup group) { if (selecteClipGroup != group) { selecteClipGroup = group; } selectedAiClip = null; mSelectedLink = null; }
/// <summary> /// 从AI组里面删除一个片断, 并且会删除其他片断对这个片断的连接 /// </summary> /// <param name="clip"></param> /// <param name="clipGroup"></param> void DeleteAiClipFromAiGroup(AIClip clip, AIClipGroup clipGroup) { if (clipGroup.aiClipList.Contains(clip)) { clipGroup.aiClipList.Remove(clip); } else { Debug.LogError("片断" + clip + "不在片断组里面" + clipGroup); } }
public static void SelectAIDataUnit(UIAIDataUnit groupUI) { if (selectedUnit != groupUI) { selectedUnit = groupUI; selectedDataUnit = groupUI.aiData; } selectedAiClip = null; mSelectedLink = null; selecteClipGroup = null; }
public static void SelectAIClip(AIClip aiClip) { if (selectedAiClip != aiClip) { selectedAiClip = aiClip; //要保证选择AI片断后自动选择这个片断所在的AI组 selecteClipGroup = FindOwnerClipGroup(aiClip); mSelectedLink = null; selectedHitData = null; aiEvent = null; } }
/// <summary> /// 绘制所有的AI组 /// </summary> void DrawAIUnits() { if (GUILayout.Button("新建AI组", GUILayout.Width(60))) { AIDataUnitEditWnd wnd = EditorWindow.GetWindow <AIDataUnitEditWnd>(); AIDataUnit unit = new AIDataUnit(); wnd.SetData(AIDataUnitEditWnd.EditMode.Create, unit, delegate(AIDataUnit data) { CreateAIGroup(data); }); } groupScrollPos = GUILayout.BeginScrollView(groupScrollPos, false, true, GUILayout.Width(400), GUILayout.Height(position.height * 0.9f)); for (int i = 0; i < listUIGroups.Count; i++) { UIAIDataUnit uiGroup = listUIGroups[i]; GUILayout.BeginHorizontal(); if (GUILayout.Button(uiGroup.bExpand ? "-" : "+", GUILayout.Width(20))) { uiGroup.bExpand = !uiGroup.bExpand; } Color prevColor = GUI.color; GUI.color = uiGroup == AIDataSelection.selectedUnit ? Color.yellow : prevColor; if (GUILayout.Button(uiGroup.Name, GUILayout.Width(200))) { AIDataSelection.SelectAIDataUnit(uiGroup); } GUI.color = prevColor; if (GUILayout.Button("添加", GUILayout.Width(40))) { AIClipGroup group = new AIClipGroup(); uiGroup.aiData.aiGroups.Add(group); } if (GUILayout.Button("X", GUILayout.Width(20))) { if (EditorUtility.DisplayDialog("提示", "确定要AI组吗?", "确定")) { DeleteAIGroup(uiGroup); return; } } GUILayout.EndHorizontal(); if (uiGroup.bExpand)//没有展开 { DrawAIUnit(uiGroup); } } GUILayout.EndScrollView(); }
public static void DrawAIClip(AIClip clip,AIClipGroup paretGroup) { clip.clipKey = EditorGUILayout.TextField( "动画片断键值",clip.clipKey,GUILayout.Width(300)); clip.name = EditorGUILayout.TextField("片断名称", clip.name, GUILayout.Width(300)); clip.animationName = EditorGUILayout.TextField("动画名称",clip.animationName, GUILayout.Width(300)); if (paretGroup != null) { clip.defaultLinkClip = AIFUIUtility.DrawAiLinkPopup(paretGroup, clip.defaultLinkClip, " 默认连接", 150,150); } clip.animationTime = EditorGUILayout.FloatField("动画时长", clip.animationTime, GUILayout.Width(300)); clip.attackRange = EditorGUILayout.FloatField("攻击范围",clip.attackRange, GUILayout.Width(300)); clip.CheckDirectionInput = GUILayout.Toggle(clip.CheckDirectionInput, "方向输入(检测到方向输入切换到跑步片断)", GUILayout.Width(250)); clip.runToTarget = GUILayout.Toggle(clip.runToTarget, "跑向目标(找到目标的情况向目标移动)", GUILayout.Width(200)); clip.applyRootMotion = GUILayout.Toggle(clip.applyRootMotion, "使用动画运动", GUILayout.Width(90)); }
public static void DrawAIClip(AIClip clip, AIClipGroup paretGroup) { clip.clipKey = EditorGUILayout.TextField("动画片断键值", clip.clipKey, GUILayout.Width(300)); clip.name = EditorGUILayout.TextField("片断名称", clip.name, GUILayout.Width(300)); clip.animationName = EditorGUILayout.TextField("动画名称", clip.animationName, GUILayout.Width(300)); if (paretGroup != null) { clip.defaultLinkClip = AIFUIUtility.DrawAiLinkPopup(paretGroup, clip.defaultLinkClip, " 默认连接", 150, 150); } clip.animationTime = EditorGUILayout.FloatField("动画时长", clip.animationTime, GUILayout.Width(300)); clip.attackRange = EditorGUILayout.FloatField("攻击范围", clip.attackRange, GUILayout.Width(300)); clip.CheckDirectionInput = GUILayout.Toggle(clip.CheckDirectionInput, "方向输入(检测到方向输入切换到跑步片断)", GUILayout.Width(250)); clip.runToTarget = GUILayout.Toggle(clip.runToTarget, "跑向目标(找到目标的情况向目标移动)", GUILayout.Width(200)); clip.applyRootMotion = GUILayout.Toggle(clip.applyRootMotion, "使用动画运动", GUILayout.Width(90)); }
/// <summary> /// 寻找制定AI片断归属的AI组 /// </summary> /// <param name="clip"></param> /// <returns></returns> public static AIClipGroup FindOwnerClipGroup(AIClip clip) { for (int i = 0; i < AIDataEditor.aiDataSet.aiDataList.Count; i++) { AIDataUnit aiUnit = AIDataEditor.aiDataSet.aiDataList[i]; AIClipGroup clipGroup = aiUnit.aiGroups.Find(delegate(AIClipGroup Group) { return(Group.aiClipList.Contains(clip)); }); if (clipGroup != null) { return(clipGroup); } } Debug.LogError(string.Format("片断{0}没有找到归属组", clip)); return(null); }
/// <summary> /// 检查是否可以创建这个新的数据(ID 是否相同等等) /// </summary> /// <param name="dataToCreate"></param> /// <returns></returns> public static bool CheckCreateNew(AIClipGroup clipGroup,AIClip clip) { if (string.IsNullOrEmpty(clip.clipKey)) { EditorUtility.DisplayDialog("提示", "片断名不能为空", "好吧V_V"); return false; } AIClip srcClip= clipGroup.aiClipList.Find(delegate(AIClip targetClip) { return targetClip.clipKey == clip.clipKey; }); if (srcClip != null) { EditorUtility.DisplayDialog("提示", "动画片断键值和已有的重复!", "确定"); return false; } return true; }
/// <summary> /// 检查是否可以创建这个新的数据(ID 是否相同等等) /// </summary> /// <param name="dataToCreate"></param> /// <returns></returns> public static bool CheckCreateNew(AIClipGroup clipGroup, AIClip clip) { if (string.IsNullOrEmpty(clip.clipKey)) { EditorUtility.DisplayDialog("提示", "片断名不能为空", "好吧V_V"); return(false); } AIClip srcClip = clipGroup.aiClipList.Find(delegate(AIClip targetClip) { return(targetClip.clipKey == clip.clipKey); }); if (srcClip != null) { EditorUtility.DisplayDialog("提示", "动画片断键值和已有的重复!", "确定"); return(false); } return(true); }
public static string DrawAiLinkPopup(AIClipGroup clipGroup, string curSelect, string strTip, int popUpWidth, int tipWidth = 70) { if (clipGroup == null) { GUILayout.Label("Ai组为空"); return(""); } if (clipGroup.aiClipList.Count == 0) { GUILayout.Label("片断列表为空"); return(""); } GUILayout.BeginHorizontal(); GUILayout.Label(strTip, GUILayout.Width(tipWidth)); string[] optionClips = new string[clipGroup.aiClipList.Count]; for (int i = 0; i < optionClips.Length; i++) //显示的是全名, 但是我们记录的是键值 { optionClips[i] = clipGroup.aiClipList[i].NameOnUI; } int curSelectIndex = clipGroup.aiClipList.FindIndex(delegate(AIClip targetClip) { return(targetClip.clipKey == curSelect); }); if (curSelectIndex < 0) { curSelectIndex = 0; } curSelectIndex = EditorGUILayout.Popup(curSelectIndex, optionClips, GUILayout.Width(popUpWidth)); curSelect = clipGroup.aiClipList[curSelectIndex].clipKey; GUILayout.EndHorizontal(); return(curSelect); }
/// <summary> /// 从AI组里面删除一个片断, 并且会删除其他片断对这个片断的连接 /// </summary> /// <param name="clip"></param> /// <param name="clipGroup"></param> void DeleteAiClipFromAiGroup(AIClip clip, AIClipGroup clipGroup) { if (clipGroup.aiClipList.Contains(clip)) { clipGroup.aiClipList.Remove(clip); } else { Debug.LogError("片断" + clip + "不在片断组里面"+clipGroup); } }
public static void EditAILink(AIClipGroup clipGroup, AILink link) { AILinkEditWnd wnd = EditorWindow.GetWindow <AILinkEditWnd>(); wnd.SetData(clipGroup, link); }
public void SetData(AIClipGroup clipGroup, AILink link) { srcGroup = clipGroup; aiLink = link; }
public static void DrawCommanAnimation(AICommonAnimation comAnim,AIClipGroup clipGroup) { GUILayout.Label("AI通用片断"); comAnim.die = AIFUIUtility.DrawAiLinkPopup(clipGroup, comAnim.die, " 默认连接", 150); comAnim.hit = AIFUIUtility.DrawAiLinkPopup(clipGroup, comAnim.hit, " 受击", 150); comAnim.idle = AIFUIUtility.DrawAiLinkPopup(clipGroup, comAnim.idle, " 默认待机", 150); comAnim.run = AIFUIUtility.DrawAiLinkPopup(clipGroup, comAnim.run, " 跑步", 150); comAnim.walk = AIFUIUtility.DrawAiLinkPopup(clipGroup, comAnim.walk, " 走路", 150); }
public static string DrawAiLinkPopup(AIClipGroup clipGroup, string curSelect,string strTip,int popUpWidth,int tipWidth=70) { if (clipGroup == null) { GUILayout.Label("Ai组为空"); return""; } if (clipGroup.aiClipList.Count == 0) { GUILayout.Label("片断列表为空"); return ""; } GUILayout.BeginHorizontal(); GUILayout.Label(strTip, GUILayout.Width(tipWidth)); string[] optionClips = new string[clipGroup.aiClipList.Count]; for (int i = 0; i < optionClips.Length; i++) //显示的是全名, 但是我们记录的是键值 { optionClips[i] = clipGroup.aiClipList[i].NameOnUI; } int curSelectIndex = clipGroup.aiClipList.FindIndex(delegate(AIClip targetClip) { return targetClip.clipKey == curSelect; }); if (curSelectIndex < 0) curSelectIndex = 0; curSelectIndex = EditorGUILayout.Popup(curSelectIndex, optionClips, GUILayout.Width(popUpWidth)); curSelect = clipGroup.aiClipList[curSelectIndex].clipKey; GUILayout.EndHorizontal(); return curSelect; }
public static void DrawAiLinkPopup(AIClipGroup clipGroup, AILink link) { if (clipGroup == null) { GUILayout.Label("Ai组为空"); return; } if (clipGroup.aiClipList.Count == 0) { GUILayout.Label("片断列表为空"); return ; } GUILayout.BeginHorizontal(); GUILayout.Label("连接动画名", GUILayout.Width(70)); string[] optionClips =new string[clipGroup.aiClipList.Count]; for (int i = 0; i < optionClips.Length; i++) { optionClips[i] = clipGroup.aiClipList[i].NameOnUI; } int curSelectIndex = clipGroup.aiClipList.FindIndex(delegate(AIClip targetClip) { return targetClip.clipKey == link.linkToClip; }); if (curSelectIndex < 0) curSelectIndex = 0; curSelectIndex = EditorGUILayout.Popup(curSelectIndex, optionClips); //最终的选择 link.linkToClip = clipGroup.aiClipList[curSelectIndex].clipKey; GUILayout.EndHorizontal(); }
void DrawAIUnit(UIAIDataUnit groupUnit) { AIDataUnit aiData = groupUnit.aiData; for (int groupIndex = 0; groupIndex < aiData.aiGroups.Count; groupIndex++) { AIClipGroup clipGroup = aiData.aiGroups[groupIndex]; GUILayout.BeginHorizontal(); GUILayout.Space(20); bool expandGroup = groupUnit.GetChildExpand(groupIndex); if (GUILayout.Button(expandGroup?"-":"+", GUILayout.Width(25))) { groupUnit.SetChildExpand(groupIndex, !expandGroup); } if (AIFUIUtility.LayoutButtonWithColor(clipGroup.GroupName, clipGroup == AIDataSelection.selecteClipGroup?Color.magenta:GUI.color, 170)) { AIDataSelection.SelectAIGroup(clipGroup); } if (GUILayout.Button("Add", GUILayout.Width(45))) { AIClip aiClip = new AIClip(); AIClipEditWnd wnd = EditorWindow.GetWindow <AIClipEditWnd>(); wnd.SetData(AIClipEditWnd.EditMode.Create, clipGroup, aiClip, delegate { clipGroup.aiClipList.Add(aiClip); }); } if (GUILayout.Button("X", GUILayout.Width(45))) { if (EditorUtility.DisplayDialog("警告", "确定删除动作组?", "确定")) { aiData.aiGroups.Remove(clipGroup); Repaint(); return; } } GUILayout.EndHorizontal(); if (expandGroup) { const int indentSpace = 40; #region 绘制展开的AI组片断 if (clipGroup.aiClipList.Count == 0) { GUILayout.BeginHorizontal(); GUILayout.Space(indentSpace); GUILayout.Label("空"); GUILayout.EndHorizontal(); } else { for (int i = 0; i < clipGroup.aiClipList.Count; i++) { AIClip clip = clipGroup.aiClipList[i]; GUILayout.BeginHorizontal(); GUILayout.Space(indentSpace); Color col = AIDataSelection.selectedAiClip == clip ? Color.green : GUI.color; if (AIFUIUtility.LayoutButtonWithColor(clip.NameOnUI, col, AIFGUISKin.GetStyle("button"), GUILayout.Width(150))) { AIDataSelection.SelectAIDataUnit(groupUnit); AIDataSelection.SelectAIClip(clip); } if (clip == AIDataSelection.selectedAiClip) { } if (GUILayout.Button("X", GUILayout.Width(30))) { if (EditorUtility.DisplayDialog("删除AI片断", "确定要删除?", "Yes")) { DeleteAiClipFromAiGroup(clip, clipGroup); clipGroup.aiClipList.Remove(clip); return; } } GUILayout.EndHorizontal(); } } #endregion } } }
/// <summary> /// 绘制所有的AI组 /// </summary> void DrawAIUnits() { if (GUILayout.Button("新建AI组", GUILayout.Width(60))) { AIDataUnitEditWnd wnd = EditorWindow.GetWindow<AIDataUnitEditWnd>(); AIDataUnit unit = new AIDataUnit(); wnd.SetData(AIDataUnitEditWnd.EditMode.Create, unit, delegate(AIDataUnit data) { CreateAIGroup(data); }); } groupScrollPos = GUILayout.BeginScrollView(groupScrollPos, false, true, GUILayout.Width(400), GUILayout.Height(position.height * 0.9f)); for (int i = 0; i < listUIGroups.Count; i++) { UIAIDataUnit uiGroup = listUIGroups[i]; GUILayout.BeginHorizontal(); if (GUILayout.Button(uiGroup.bExpand ? "-" : "+",GUILayout.Width(20))) { uiGroup.bExpand =! uiGroup.bExpand; } Color prevColor = GUI.color; GUI.color = uiGroup == AIDataSelection.selectedUnit ? Color.yellow : prevColor; if(GUILayout.Button(uiGroup.Name,GUILayout.Width(200))) { AIDataSelection.SelectAIDataUnit(uiGroup); } GUI.color = prevColor; if (GUILayout.Button("添加", GUILayout.Width(40))) { AIClipGroup group = new AIClipGroup(); uiGroup.aiData.aiGroups.Add(group); } if (GUILayout.Button("X", GUILayout.Width(20))) { if (EditorUtility.DisplayDialog("提示", "确定要AI组吗?", "确定")) { DeleteAIGroup(uiGroup); return; } } GUILayout.EndHorizontal(); if (uiGroup.bExpand)//没有展开 { DrawAIUnit(uiGroup); } } GUILayout.EndScrollView(); }
void DrawSelectedAiClipOrGroup() { GUILayout.BeginArea(new Rect(410, 0, position.width * 0.6f, position.height * 0.9f)); //selectionScrollPos = GUILayout.BeginScrollView(selectionScrollPos, true, true, GUILayout.Width(400), GUILayout.Height(position.height * 0.9f)); GUILayout.Label("当前选中"); AIClip selectedClip = AIDataSelection.selectedAiClip; AIClipGroup selectedGroup = AIDataSelection.selecteClipGroup; if (selectedClip != null) { AIFUIUtility.DrawAIClip(selectedClip, selectedGroup); GUILayout.BeginHorizontal(); GUILayout.Label("连接片断列表:", GUILayout.Width(100)); if (GUILayout.Button("添加连接", GUILayout.Width(100))) { AILink link = new AILink(); selectedClip.linkAIClipList.Add(link); AILinkEditWnd wnd = EditorWindow.GetWindow <AILinkEditWnd>(); wnd.SetData(AIDataSelection.selecteClipGroup, link); } GUILayout.EndHorizontal(); GUILayout.BeginArea(new Rect(250, 150, 500, 700)); AIFUIUtility.DrawAiEvetList(selectedClip); GUILayout.EndArea(); GUILayout.BeginArea(new Rect(450, 150, 500, 700)); AIFUIUtility.DrawHitDefinitionList(selectedClip); GUILayout.EndArea(); #region Links if (selectedClip.linkAIClipList.Count == 0) { GUILayout.Label("空列表", GUILayout.Width(300)); } else { for (int i = 0; i < selectedClip.linkAIClipList.Count; i++) { AILink ai = selectedClip.linkAIClipList[i]; GUILayout.BeginHorizontal(); //string fullClipName= if (AIFUIUtility.LayoutButtonWithColor(ai.linkToClip, AIDataSelection.IsSelectedLinkClip(ai) ? Color.cyan : Color.magenta, 150)) { AIDataSelection.SelectLinkClip(ai); AILinkEditWnd.EditAILink(selectedGroup, ai); } if (GUILayout.Button("X", GUILayout.Width(20))) { if (EditorUtility.DisplayDialog("提示", "确定要删除连接吗", "确定")) { selectedClip.linkAIClipList.Remove(ai); return; } } GUILayout.EndHorizontal(); } #region 绘制选择连接 //AILink link = curSelection.SelectedLink; //if (link != null) //{ // GUILayout.BeginArea(new Rect(300, 50, 500, 700)); // link.linkToClip = AIFUIUtility.DrawTextField(link.linkToClip, "连接目标"); // conditionListPos = GUILayout.BeginScrollView(conditionListPos, true, true, GUILayout.Width(300), GUILayout.Height(position.height * 0.6f)); // AIFUIUtility.DrawAiLinkConditions(link); // GUILayout.EndScrollView(); // GUILayout.EndArea(); //} #endregion } #endregion } else //没选中AI片断就检测时候在编辑AI组 { if (AIDataSelection.selecteClipGroup != null) { AIClipGroup clipGroup = AIDataSelection.selecteClipGroup; clipGroup.name = EditorGUILayout.TextField("Ai组名称", clipGroup.name, GUILayout.Width(300)); clipGroup.moveSpeed = EditorGUILayout.FloatField("移动速度", clipGroup.moveSpeed, GUILayout.Width(300)); clipGroup.targetType = (ETargetType)EditorGUILayout.EnumPopup("目标类型", clipGroup.targetType, GUILayout.Width(300)); AIFUIUtility.DrawAIShape(AIDataSelection.selecteClipGroup.shape); AIFUIUtility.DrawCommanAnimation(AIDataSelection.selecteClipGroup.commonAnimation, AIDataSelection.selecteClipGroup); } else if (AIDataSelection.selectedUnit != null) { AIDataSelection.selectedUnit.aiData.AiName = EditorGUILayout.TextField("AI单位名称", AIDataSelection.selectedUnit.aiData.AiName, GUILayout.Width(400)); // } } //GUILayout.EndScrollView(); GUILayout.EndArea(); }
/// <summary> /// 设置AI组数据 /// </summary> public virtual void SetAIClipGroup(AIClipGroup groupData) { mAiClipGroup = groupData; mCurAIClip = mAiClipGroup.aiClipList[0]; SwitchAIClip(mCurAIClip,0); UpdateShape(); }