2024-12-14 18:27:59 +08:00

165 lines
6.1 KiB
C#

using QFramework;
using QFramework.Example;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XMLTool;
public class ActionHelper
{
public static readonly Dictionary<string, Type> typeDict = new Dictionary<string, Type>()
{
{ "UIRightTop", typeof(UIRightTop) },
{ "UIOperationList", typeof(UIOperationList) },
{ "UIBtns", typeof(QFramework.Example.UIBtns) },
{ "UITools", typeof(QFramework.Example.UITools) },
};
/// <summary>
/// 递归生成所有的Action
/// </summary>
/// <param name="action"></param>
/// <param name="parentAct"></param>
/// <returns></returns>
public static IAction GetActionAndSub(XMLTool.ActionItem action, IAction parentAct = null)
{
IAction sub = null;
if (action != null)
{
if (parentAct == null)
{
parentAct = ActionHelper.GetAction(action);
}
else
{
sub = ActionHelper.GetAction(action);
switch (parentAct)
{
case QFramework.IParallel act:
act.Append(sub);
break;
case QFramework.ISequence seq:
seq.Append(sub);
break;
}
}
if (action.SubActions != null && action.SubActions.Count > 0)
{
if (sub != null)
{
parentAct = sub;
}
foreach (var item in action.SubActions)
{
GetActionAndSub(item, parentAct);
}
}
}
return parentAct;
}
/// <summary>
/// 只生成一个
/// </summary>
/// <param name="action"></param>
/// <returns></returns>
public static IAction GetAction(XMLTool.ActionItem action)
{
switch (action)
{
case XMLTool.Action act:
switch (act.Type)
{
case "Sequence":
return ActionKit.Sequence();
case "Parallel":
return ActionKit.Parallel();
case "Any":
return AnyAction.Allocate();
case "Log":
return LogAction.Allocate(action.Value);
case "Delay":
return ActionKit.Delay(float.Parse(action.Value), null);
case "UIShow":
var strAct = (XMLTool.StringListAction)act;
return UIShowAction.Allocate(strAct.Value, strAct.args[0]);
case "NextOperation":
return NextOperationAction.Allocate();
case "Move":
var move = (XMLTool.MoveOrAction)act;
return MoveAction.Allocate(act.Value, move.to, move.time);
case "Rotate":
var rotate = (XMLTool.MoveOrAction)act;
return RotateAction.Allocate(act.Value, rotate.to, rotate.time);
case "Btns":
return BtnsAction.Allocate(act.Value);
case "Anim":
var anim = (XMLTool.AnimationAction)act;
return QFramework.AnimationAction.Allocate(anim.Value, anim.animName);
case "UITools":
var strAction = (XMLTool.StringListAction)act;
return UIToolsAction.Allocate(strAction.args[0], strAction.args[1], strAction.args[2], strAction.args[3],
strAction.args[4], strAction.args[5], strAction.args[6], strAction.args[7],
strAction.args[8], strAction.args[9]);
case "PointQuestion":
return PointQuestionAction.Allocate(act.Value);
case "TextQuestion":
var textQuestion = (XMLTool.StringListAction)act;
return TextQuestionAction.Allocate(textQuestion.args[0], textQuestion.args[1], textQuestion.args[2], textQuestion.args[3], textQuestion.args[4], textQuestion.args[5]);
case "Hint":
var hint = (XMLTool.StringListAction)act;
return HintAction.Allocate(hint.Value, hint.args[0], hint.args[1], hint.args[2]);
case "Var":
return SetVarAction.Allocate(act.Name, act.Value);
case "Show":
var show = (XMLTool.StringListAction)act;
return ShowAction.Allocate(act.Value, show.args[0]);
case "SetScore":
return SetScoreAction.Allocate(act.Name, act.Value);
}
break;
case XMLTool.Condition condition:
return GetCondition(condition);
}
return null;
}
/// <summary>
/// 生成条件组
/// </summary>
/// <param name="condition"></param>
/// <returns></returns>
public static ICondition GetCondition(XMLTool.ActionItem condition)
{
switch (condition.Type)
{
case "And":
case "Or":
var group = ConditionGroup.Allocate(condition.Type);
foreach (var item in condition.SubActions)
{
group.AddCondition(GetCondition(item));
}
return group;
case "UIClick":
return UIClickCondition.Allocate(condition.Value);
case "ObjClick":
return ObjClickCondition.Allocate(condition.Value);
case "Input":
return InputCondition.Allocate(condition.Value);
case "Var":
return VarCondition.Allocate(condition.Name, condition.Value);
case "StrEvent":
return StrEventCondition.Allocate(condition.Value);
}
return null;
}
}