コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }