public void OnGUI() { if (mHitData != null) { mHitData.name = AIFUIUtility.DrawTextField(mHitData.name, "名称", 100); mHitData.startTime = EditorGUILayout.FloatField("开始触发时间", mHitData.startTime); mHitData.lastTime = EditorGUILayout.FloatField("持续时间", mHitData.lastTime); mHitData.hitInterval = EditorGUILayout.FloatField("攻击间隔", mHitData.hitInterval); mHitData.entityResName = EditorGUILayout.TextField("显示实体资源", mHitData.entityResName); mHitData.startPosition = EditorGUILayout.Vector3Field("初始位置", mHitData.startPosition); mHitData.startDirection = EditorGUILayout.Vector3Field("初始角度", mHitData.startDirection); mHitData.moveSpeed = EditorGUILayout.FloatField("移动速度", mHitData.moveSpeed); mHitData.autoFaceTarget = EditorGUILayout.Toggle("自动朝向攻击目标", mHitData.autoFaceTarget); EditorGUILayout.Separator(); GUILayout.Label("击中判定:"); HitCheckBase hitCheck = mHitData.hitCheckData; hitCheck.shapeType = (EHitCheckShape)AIFUIUtility.DrawCustomEnum("击中框类型", hitCheck.shapeType, 100); hitCheck.posOffset = EditorGUILayout.Vector3Field("位置偏移", hitCheck.posOffset); hitCheck.radius = EditorGUILayout.FloatField("半径", hitCheck.radius); if (hitCheck.shapeType == EHitCheckShape.LaserBeam) { hitCheck.height = EditorGUILayout.FloatField("激光束长度", hitCheck.height); } else { hitCheck.height = EditorGUILayout.FloatField("高度", hitCheck.height); } hitCheck.angle = EditorGUILayout.FloatField("攻击角度", hitCheck.angle); } }
/// <summary> /// 绘制攻击定义列表 /// </summary> /// <param name="clip"></param> public static void DrawHitDefinitionList(AIClip clip) { GUILayout.BeginHorizontal(); GUILayout.Label("攻击定义列表:", GUILayout.Width(80)); #region copy and paste icons if (GUILayout.Button(AIFGUISKin.IconCopy, GUILayout.Width(30), GUILayout.Height(30))) { if (AIDataSelection.selectedHitData != null) { CustomClipBoard.CopyData(AIDataSelection.selectedHitData); } } if (GUILayout.Button(AIFGUISKin.IconPaste, GUILayout.Width(30), GUILayout.Height(30))) { object clipBoardObj; CustomClipBoard.GetCopyObject(out clipBoardObj); if (clipBoardObj == null) { Debug.LogError("剪切板没有内容可以粘贴"); } else { clipBoardObj = Utility.XmlDeepCloneObject(clipBoardObj); if (clipBoardObj is AiClipHitData) { clip.hitCheckList.Add(clipBoardObj as AiClipHitData); } } } #endregion if (GUILayout.Button(AIFGUISKin.IconNewItem, GUILayout.Width(30), GUILayout.Height(30))) { clip.hitCheckList.Add(new AiClipHitData()); } GUILayout.EndHorizontal(); for (int i = 0; i < clip.hitCheckList.Count; i++) { AiClipHitData hitCheck = clip.hitCheckList[i]; GUILayout.BeginHorizontal(); Color col = hitCheck == AIDataSelection.selectedHitData?Color.green:GUI.color; if (AIFUIUtility.LayoutButtonWithColor(hitCheck.name, col, 150)) { AIDataSelection.SelectedHitData(hitCheck); HitDataEditWnd.Open(hitCheck); } if (GUILayout.Button("X", GUILayout.Width(40))) { if (EditorUtility.DisplayDialog("tips", "确定删除攻击定义?", "OK")) { clip.hitCheckList.Remove(hitCheck); break; } } GUILayout.EndHorizontal(); } }
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 DrawAIShape(AIShape shape) { GUILayout.Label("AI形态定义"); shape.scaleRatio = EditorGUILayout.FloatField("缩放比例:", shape.scaleRatio, GUILayout.Width(300)); shape.colliderHeight = EditorGUILayout.FloatField("碰撞高度:", shape.colliderHeight, GUILayout.Width(300)); shape.colliderRadius = EditorGUILayout.FloatField("碰撞半径:", shape.colliderRadius, GUILayout.Width(300)); AIFUIUtility.DrawVector3("碰撞偏移", ref shape.colliderOffset); EditorGUILayout.Separator(); shape.hitDetectScale = EditorGUILayout.FloatField("攻击框比例:", shape.scaleRatio, GUILayout.Width(300)); shape.hitDetectHeight = EditorGUILayout.FloatField("攻击框高度:", shape.colliderHeight, GUILayout.Width(300)); shape.hitRadius = EditorGUILayout.FloatField("攻击框半径:", shape.colliderRadius, GUILayout.Width(300)); }
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)); }
void OnGUI() { if (aiLink != null) { aiLink.linkToClip = AIFUIUtility.DrawAiLinkPopup(srcGroup, aiLink.linkToClip, "目标片断", 150); aiLink.checkAllCondition = GUILayout.Toggle(aiLink.checkAllCondition, "检查所有条件"); aiLink.crossFadeTime = EditorGUILayout.FloatField("动画过度时间", aiLink.crossFadeTime); GUILayout.BeginHorizontal(); GUILayout.Label("连接条件:", GUILayout.Width(150)); if (GUILayout.Button("添加条件", GUILayout.Width(100))) { AILinkCondictionSelectWnd.SelectNewCondition(delegate(AILinkCondiction con) { aiLink.linkConditionList.Add(con); }); } GUILayout.EndHorizontal(); for (int i = 0; i < aiLink.linkConditionList.Count; i++) { AILinkCondiction con = aiLink.linkConditionList[i]; EditorGUILayout.Separator(); GUILayout.BeginHorizontal(); if (GUILayout.Button("X", GUILayout.Width(30))) { if (EditorUtility.DisplayDialog("提示", "删除条件?", "OK")) { aiLink.linkConditionList.Remove(con); } } GUILayout.Label(con.ToString()); GUILayout.EndHorizontal(); GUILayout.BeginVertical(); con.OnEditorUI(); GUILayout.EndVertical(); } } //GUILayout.Button("确定"); }
void OnGUI() { if (mDataUnit != null) { if (mMode == EditMode.Create) { if (GUILayout.Button("Save", GUILayout.Width(80))) { if (AIDataEditor.CheckCreateNew(mClipGroup, mDataUnit)) { if (onCreateNew != null) { onCreateNew(mDataUnit); Close(); } } } } AIFUIUtility.DrawAIClip(mDataUnit, mClipGroup); } }
void OnGUI() { if (mDataUnit != null) { if (mMode == EditMode.Create) { if (GUILayout.Button("Save", GUILayout.Width(80))) { if (AIDataEditor.CheckCreateNew(mDataUnit)) { if (onCreateNew != null) { onCreateNew(mDataUnit); Close(); } } } } mDataUnit.Id = EditorGUILayout.IntField("Id", mDataUnit.Id); mDataUnit.AiName = AIFUIUtility.DrawTextField(mDataUnit.AiName, "AiName", 100); } }
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(); }
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 } } }
void OnGUI() { GUILayout.BeginHorizontal(); if (GUILayout.Button("Load File New")) { AIDataMgr.instance.LoadNewData(); } if (GUILayout.Button("重新加载AI配置表")) { LoadAiTable(); } if (GUILayout.Button("ClearAllAI", GUILayout.Width(100))) { AIMgr.instance.DestroyAllAIs(); } if (GUILayout.Button("DebugWindow", GUILayout.Width(100))) { AIDebugWindow.Open(); } GUILayout.EndHorizontal(); AIMgr.DisableAiAttack = EditorGUILayout.Toggle("关闭AI攻击", AIMgr.DisableAiAttack); createCamp = (EAiCamp)EditorGUILayout.EnumPopup("创建阵营", createCamp); createAsAI = EditorGUILayout.Toggle("asAi", createAsAI); GUILayout.BeginHorizontal(); aiModelName = AIFUIUtility.DrawTextField(aiModelName, "AI资源名"); aiDataId = EditorGUILayout.IntField("AI数据ID", aiDataId); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("Create")) { CreateAI(aiModelName, aiDataId, createCamp, createAsAI); } if (GUILayout.Button("CreateEnemy")) { CreateAI(aiModelName, aiDataId, EAiCamp.Enemy, true); } GUILayout.EndHorizontal(); GUILayout.Label("创建列表"); GUILayout.BeginScrollView(scrollPos); for (int i = 0; i < roleInfoTableManager.instance.Size(); i++) { roleInfo info = roleInfoTableManager.instance.GetByIndex(i); GUILayout.BeginHorizontal(); GUILayout.Label(info.ID + "/" + info.AiDataId + "/" + info.name, GUILayout.Width(200)); if (GUILayout.Button("创建为主角")) { CreateAI(info.resModel, info.AiDataId, EAiCamp.MainPlayer, false); } if (GUILayout.Button("创建为友方")) { CreateAI(info.resModel, info.AiDataId, EAiCamp.Friend, true); } if (GUILayout.Button("创建为敌方")) { CreateAI(info.resModel, info.AiDataId, EAiCamp.Enemy, true); } GUILayout.EndHorizontal(); } GUILayout.EndScrollView(); }
/// <summary> /// 绘制片断时间列表 /// </summary> /// <param name="clip"></param> public static void DrawAiEvetList(AIClip clip) { GUILayout.BeginHorizontal(); GUILayout.Label("事件列表", GUILayout.Width(60)); #region copy and paste icons if (GUILayout.Button(AIFGUISKin.IconCopy, GUILayout.Width(30), GUILayout.Height(30))) { if (AIDataSelection.aiEvent != null) { CustomClipBoard.CopyData(AIDataSelection.aiEvent); } } if (GUILayout.Button(AIFGUISKin.IconPaste, GUILayout.Width(30), GUILayout.Height(30))) { object clipBoardObj; CustomClipBoard.GetCopyObject(out clipBoardObj); if (clipBoardObj == null) { Debug.LogError("剪切板没有内容可以粘贴"); } else { clipBoardObj = Utility.XmlDeepCloneObject(clipBoardObj); if (clipBoardObj is AIClipEvent) { clip.AiClipEvents.Add(clipBoardObj as AIClipEvent); } } } #endregion if (GUILayout.Button(AIFGUISKin.IconNewItem, GUILayout.Width(30), GUILayout.Height(30))) { AIEventEditWnd.OpenCreateEditor(delegate(AIClipEvent e) { clip.AiClipEvents.Add(e); }); } GUILayout.EndHorizontal(); if (clip.AiClipEvents.Count == 0) { GUILayout.Label("事件列表为空"); } else { for (int i = 0; i < clip.AiClipEvents.Count; i++) { AIClipEvent evet = clip.AiClipEvents[i]; GUILayout.BeginHorizontal(); Color col = AIDataSelection.aiEvent == evet ? Color.green : GUI.color; if (AIFUIUtility.LayoutButtonWithColor(evet.eventName, col, 150)) { AIDataSelection.SelectedAIEvent(evet); AIEventEditWnd.OpenAsEditMode(evet); } if (GUILayout.Button("X", GUILayout.Width(30))) { if (EditorUtility.DisplayDialog("警告", "确定删除事件吗", "确定", "取消")) { clip.AiClipEvents.Remove(evet); return; } } GUILayout.EndHorizontal(); } } }