public override IEnumerable <RunStatus> Execute(ITreeRoot context) { var root = context as AITreeRoot; var character = root.Perception.GetSingleTargetUseRandom(root.Character); if (character == null) { yield return(RunStatus.Failure); yield break; } var target = character; var per = root.Perception as BattlePerception; var pos = target.View.Transform.position; per.CharacterMoveTo(root.Character, pos); var view = root.Character.View; var last = root.Time; while (root.Perception.Distance(target, root.Character) > 0f) { if ((root.Time - last) > 3 && UVector3.Distance(pos, target.View.Transform.position) > 1f) { per.CharacterMoveTo(root.Character, target.View.Transform.position); pos = target.View.Transform.position; } if (!target.Enable) { per.CharacterStopMove(root.Character); yield return(RunStatus.Failure); yield break; } yield return(RunStatus.Running); } var time = root.Time; if (time + 0.2f < root.Time) { yield return(RunStatus.Running); } per.CharacterStopMove(root.Character); yield return(RunStatus.Success); }
public override GAction GetAction(GTime time, GObject current) { //var per = this.Perception as BattlePerception; var missile = current as BattleMissile; switch (missile.State) { case MissileState.NoStart: { var distance = UVector3.Distance( missile.Releaser.ReleaserTarget.Releaser.View.Transform.position, missile.Releaser.ReleaserTarget.ReleaserTarget.View.Transform.position); missile.TotalTime = distance / missile.Layout.speed; missile.TimeStart = time.Time; missile.State = MissileState.Moving; missile.Releaser.OnEvent(Layout.EventType.EVENT_MISSILE_CREATE); } break; case MissileState.Moving: { if ((time.Time - missile.TimeStart) >= missile.TotalTime) { missile.Releaser.OnEvent(Layout.EventType.EVENT_MISSILE_HIT); missile.State = MissileState.Hit; } } break; case MissileState.Hit: { missile.Releaser.OnEvent(Layout.EventType.EVENT_MISSILE_DEAD); missile.State = MissileState.Death; } break; case MissileState.Death: GObject.Destory(missile); break; } return(GAction.Empty); }
public override IEnumerable <RunStatus> Execute(ITreeRoot context) { var root = context as AITreeRoot; var index = root[AITreeRoot.TRAGET_INDEX]; if (index == null) { yield return(RunStatus.Failure); yield break; } var target = root.Perception.State[(int)index] as BattleCharacter; if (target == null) { yield return(RunStatus.Failure); yield break; } float stopDistance; if (!root.GetDistanceByValueType(Node.valueOf, Node.distance, out stopDistance)) { yield return(RunStatus.Failure); yield break; } var per = root.Perception as BattlePerception; //var offset = new GVector3(r); //float lastTime = root.Time-2; var pos = target.View.Transform.position; per.CharacterMoveTo(root.Character, pos); view = root.Character.View; while (root.Perception.Distance(target, root.Character) > stopDistance) { if (UVector3.Distance(pos, target.View.Transform.position) > stopDistance) { per.CharacterMoveTo(root.Character, target.View.Transform.position); pos = target.View.Transform.position; } if (!target.Enable) { per.CharacterStopMove(root.Character); yield return(RunStatus.Failure); yield break; } yield return(RunStatus.Running); } var time = root.Time; if (time + 0.2f < root.Time) { yield return(RunStatus.Running); } per.CharacterStopMove(root.Character); yield return(RunStatus.Success); }
public override IEnumerable <RunStatus> Execute(ITreeRoot context) { //state =LastStatus.HasValue? LastStatus.Value:RunStatus.Failure; var character = context.UserState as BattleCharacter; var per = character.Controllor.Perception as BattlePerception; var root = context as AITreeRoot; var list = new List <BattleCharacter>(); var distance = node.Distance; if (!root.GetDistanceByValueType(node.valueOf, distance, out distance)) { getDistanceValue = -1; yield return(RunStatus.Failure); yield break; } getDistanceValue = distance; //是否保留之前目标 if (!node.findNew) { var older = root[AITreeRoot.TRAGET_INDEX]; if (older != null) { var targetCharacter = per.State[(int)older] as BattleCharacter; if (targetCharacter != null) { if (per.Distance(targetCharacter, root.Character) <= distance) { yield return(RunStatus.Success); yield break; } } } } //清除 root[AITreeRoot.TRAGET_INDEX] = -1L; var type = node.teamType; //处理使用魔法目标 if (node.useMagicConfig) { var magicID = root[AITreeRoot.SELECT_MAGIC_ID]; if (magicID == null) { yield return(RunStatus.Failure); yield break; } var data = ExcelToJSONConfigManager.Current.GetConfigByID <CharacterMagicData>((int)magicID); if (data == null) { yield return(RunStatus.Failure); yield break; } type = (TargetTeamType)data.ReleaseAITargetType; } per.State.Each <BattleCharacter>(t => { //隐身的不进入目标查找 if (t.Lock.IsLock(ActionLockType.INHIDEN)) { return(false); } switch (type) { case TargetTeamType.Enemy: if (character.TeamIndex == t.TeamIndex) { return(false); } break; case TargetTeamType.OwnTeam: if (character.TeamIndex != t.TeamIndex) { return(false); } break; case TargetTeamType.OwnTeamWithOutSelf: if (character.Index == t.Index) { return(false); } if (character.TeamIndex != t.TeamIndex) { return(false); } break; case TargetTeamType.Own: { if (character.Index != t.Index) { return(false); } } break; case TargetTeamType.ALL: { //all } break; default: return(false); } if (per.Distance(t, root.Character) > distance) { return(false); } switch (node.filter) { case TargetFilterType.Hurt: if (t.HP == t.MaxHP) { return(false); } break; } list.Add(t); return(false); }); //getTargets = list.Count; if (list.Count == 0) { yield return(RunStatus.Failure); yield break; } BattleCharacter target = null; switch (node.selectType) { case TargetSelectType.Nearest: { target = list[0]; var d = UVector3.Distance(target.View.Transform.position, character.View.Transform.position); foreach (var i in list) { var temp = UVector3.Distance(i.View.Transform.position, character.View.Transform.position); if (temp < d) { d = temp; target = i; } } } break; case TargetSelectType.Random: target = GRandomer.RandomList(list); break; case TargetSelectType.HPMax: { target = list[0]; var d = target.HP; foreach (var i in list) { var temp = i.HP; if (temp > d) { d = temp; target = i; } } } break; case TargetSelectType.HPMin: { target = list[0]; var d = target.HP; foreach (var i in list) { var temp = i.HP; if (temp < d) { d = temp; target = i; } } } break; case TargetSelectType.HPRateMax: { target = list[0]; var d = (float)target.HP / (float)target.MaxHP; foreach (var i in list) { var temp = (float)i.HP / (float)i.MaxHP;; if (temp > d) { d = temp; target = i; } } } break; case TargetSelectType.HPRateMin: { target = list[0]; var d = (float)target.HP / (float)target.MaxHP; foreach (var i in list) { var temp = (float)i.HP / (float)i.MaxHP; if (temp < d) { d = temp; target = i; } } } break; } index = target.Index; root[AITreeRoot.TRAGET_INDEX] = target.Index; yield return(RunStatus.Success); }