コード例 #1
0
ファイル: BattlePerception.cs プロジェクト: xuebai5/ARPG-Game
        public BattleCharacter CreateCharacter(
            int level,
            CharacterData data,
            List <CharacterMagicData> magics,
            int teamIndex,
            UVector3 position,
            UVector3 forward, long userID)
        {
            var res             = data.ResourcesPath;
            var view            = View.CreateBattleCharacterView(res, position, forward);
            var battleCharacter = new BattleCharacter(data.ID, magics, this.BattleCharacterControllor, view, userID);

            battleCharacter[HeroPropertyType.MaxHP].SetBaseValue(data.HPMax);
            battleCharacter[HeroPropertyType.MaxMP].SetBaseValue(data.MPMax);
            battleCharacter[HeroPropertyType.Defance].SetBaseValue(data.Defance);
            battleCharacter[HeroPropertyType.DamageMin].SetBaseValue(data.DamageMin);
            battleCharacter[HeroPropertyType.DamageMax].SetBaseValue(data.DamageMax);
            battleCharacter[HeroPropertyType.Agility].SetBaseValue(data.Agility + (int)(level * data.AgilityGrowth));
            battleCharacter[HeroPropertyType.Force].SetBaseValue(data.Force + (int)(level * data.ForceGrowth));
            battleCharacter[HeroPropertyType.Knowledge].SetBaseValue(data.Knowledge + (int)(level * data.KnowledgeGrowth));
            battleCharacter[HeroPropertyType.MagicWaitTime].SetBaseValue((int)(data.AttackSpeed * 1000));
            battleCharacter[HeroPropertyType.ViewDistance].SetBaseValue((int)(data.ViewDistance * 100));
            battleCharacter.Level     = level;
            battleCharacter.TDamage   = (Proto.DamageType)data.DamageType;
            battleCharacter.TDefance  = (DefanceType)data.DefanceType;
            battleCharacter.Category  = (HeroCategory)data.Category;
            battleCharacter.Name      = data.Name;
            battleCharacter.TeamIndex = teamIndex;
            battleCharacter.Speed     = data.MoveSpeed;
            view.SetPriorityMove(data.PriorityMove);
            battleCharacter.Init();
            this.JoinElement(battleCharacter);
            return(battleCharacter);
        }
コード例 #2
0
        public override IEnumerable <RunStatus> Execute(ITreeRoot context)
        {
            var root    = context as AITreeRoot;
            var message = root[AITreeRoot.ACTION_MESSAGE] as Proto.Action_ClickMapGround;

            if (message == null)
            {
                yield return(RunStatus.Failure);

                yield break;
            }

            root[AITreeRoot.ACTION_MESSAGE] = null;
            var target = new UVector3(message.TargetPosition.x,
                                      message.TargetPosition.y,
                                      message.TargetPosition.z);

            root.Character.View.MoveTo(target);

            while (root.Character.View.IsMoving)
            {
                yield return(RunStatus.Running);
            }
            var time = root.Time;

            if (time + 0.2f < root.Time)
            {
                yield return(RunStatus.Running);
            }
            root.Character.View.StopMove();
            yield return(RunStatus.Success);
        }
コード例 #3
0
ファイル: UCharacterView.cs プロジェクト: useada/ARPG-Game
    void IBattleCharacter.MoveTo(UVector3 position)
    {
        if (!Agent || !Agent.enabled)
        {
            return;
        }
        IsStop = false;
        this.Agent.Resume();
        var pos = position.ToUVer3();

        UnityEngine.AI.NavMeshHit hit;
        if (UnityEngine.AI.NavMesh.SamplePosition(pos, out hit, 10000, this.Agent.areaMask))
        {
            targetPos = hit.position;
        }
        else
        {
            return;
        }

        if (Vector3.Distance(targetPos.Value, this.transform.position) < 0.2f)
        {
            stopMove();
            return;
        }
        this.Agent.SetDestination(targetPos.Value);
    }
コード例 #4
0
 public static Vector3ShortIndex ToSV3(this UVector3 v3)
 {
     return(new Vector3ShortIndex()
     {
         x = (byte)v3.x, y = (byte)v3.y, z = (byte)v3.z
     });
 }
コード例 #5
0
        void IBattleCharacter.SetForward(UVector3 forward)
        {
            var v = forward;

            v.Normalized();
            transform.forward = v;
        }
コード例 #6
0
 public void SetWorldSize(Vector3 center, Vector3 extents, UVector3 div)
 {
     world_center      = center;
     world_extents     = extents;
     div.x             = MSB(div.x);
     div.y             = MSB(div.y);
     div.z             = MSB(div.z);
     world_div_bits.x  = (int)div.x;
     world_div_bits.y  = (int)div.y;
     world_div_bits.z  = (int)div.z;
     world_div.x       = (int)(1U << (int)div.x);
     world_div.y       = (int)(1U << (int)div.y);
     world_div.z       = (int)(1U << (int)div.z);
     world_div_shift.x = 1U;
     world_div_shift.y = 1U << (int)(div.x);
     world_div_shift.z = 1U << (int)(div.x + div.y);
     world_cellsize    = new Vector3(
         world_extents.x * 2.0f / world_div.x,
         world_extents.y * 2.0f / world_div.y,
         world_extents.z * 2.0f / world_div.z);
     rcp_world_cellsize = new Vector3(
         1.0f / world_cellsize.x,
         1.0f / world_cellsize.y,
         1.0f / world_cellsize.z);
 }
コード例 #7
0
ファイル: BattlePerception.cs プロジェクト: xuebai5/ARPG-Game
 internal void CharacterMoveTo(BattleCharacter character, UVector3 pos)
 {
     if (character.Lock.IsLock(ActionLockType.NOMOVE))
     {
         return;
     }
     character.View.MoveTo(pos);
 }
コード例 #8
0
 public BattleCharactorView(UVector3 pos,
                            UVector3 forword, BattlePerceptionView view,
                            Pathfinder pathfiner) : base(view)
 {
     transform          = new  UTransform();
     transform.position = pos;
     transform.forward  = forword;
     Finder             = pathfiner;
     //lastPost = pos.ToVector3();
 }
コード例 #9
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);
        }
コード例 #10
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);
        }
コード例 #11
0
ファイル: UPerceptionView.cs プロジェクト: useada/ARPG-Game
    IBattleCharacter IBattlePerception.CreateBattleCharacterView(string resources, UVector3 pos, UVector3 forward)
    {
        var character = ResourcesManager.Singleton.LoadResourcesWithExName <GameObject> (resources);
        var tPos      = new Vector3(pos.x, pos.y, pos.z);
        var qu        = Quaternion.Euler(forward.x, forward.y, forward.z);
        var ins       = GameObject.Instantiate(character) as GameObject;
        var root      = new GameObject(resources);

        root.transform.SetParent(this.transform, false);
        root.transform.position     = tPos;
        root.transform.rotation     = Quaternion.identity;
        ins.transform.parent        = root.transform;
        ins.transform.localPosition = Vector3.zero;
        ins.transform.localRotation = Quaternion.identity;
        ins.name = "Character";
        var view = root.AddComponent <UCharacterView> ();

        view.targetLookQuaternion = qu;
        view.SetCharacter(ins);

        return(view);
    }
コード例 #12
0
        void IBattleCharacter.MoveTo(UVector3 position)
        {
            //_findStarted = DateTime.Now;

            isMoving      = true;
            nextWaypoint  = 0;
            lastWaypoint  = 0;
            finalWaypoint = 0;
            syncIndex     = 0;
            CurrentPath   = null;
            var pos       = this.transform.position;
            var nodeStart = Finder.WorldPosToNode(pos.x, 0, pos.z);
            var nodeEnd   = Finder.WorldPosToNode(position.x, 0, position.z);
            var path      = Finder.FindPathActual(nodeStart, nodeEnd);

            if (path != null && path.Count > 0)
            {
                CurrentPath = path.Select(t => GetNodeVer(t)).ToList();
                if (CurrentPath.Count > 0)
                {
                    CurrentPath.RemoveAt(0);
                    CurrentPath.Insert(0, this.transform.position);
                }
                finalWaypoint            = CurrentPath.Count - 1;
                nextWaypoint             = 1;
                lastWaypoint             = 0;
                faction_of_path_traveled = 0;
                isMoving = true;
            }
            else
            {
                CurrentPath = null;
                isMoving    = false;
                //this.SetPosition(position);
            }
        }
コード例 #13
0
        private static UnityEngine.AnimationClip Convert(Clip animation, FrameContainer frames,
                                                         out UVector3 rootStart, out UVector3 rootEnd)
        {
            var clip = new UnityEngine.AnimationClip();

            clip.legacy = true;

            var rotateAxes = new[] {
                new { Name = "x", Mask = new UVector4(1f, 0f, 0f, 0f) },
                new { Name = "y", Mask = new UVector4(0f, 1f, 0f, 0f) },
                new { Name = "z", Mask = new UVector4(0f, 0f, 1f, 0f) },
                new { Name = "w", Mask = new UVector4(0f, 0f, 0f, 1f) }
            };

            var translateAxes = new[] {
                new { Name = "x", Mask = new UVector3(1f, 0f, 0f) },
                new { Name = "y", Mask = new UVector3(0f, 1f, 0f) },
                new { Name = "z", Mask = new UVector3(0f, 0f, 1f) },
            };

            var root = animation.Bones.FirstOrDefault(x => x.BoneId == 0);

            if (root != null && root.FrameCount > 0)
            {
                rootStart = Types.Convert(root.Frames.First().Translation);
                rootEnd   = Types.Convert(root.Frames.Last().Translation);
            }
            else
            {
                rootStart = rootEnd = UVector3.zero;
            }

            foreach (var bone in animation.Bones)
            {
                var bFrames = bone.Frames;
                var frame   = frames.GetByBoneId(bone.BoneId);

                string bonePath = frame.Path;

                var axisAngle = bFrames.ToDictionary(x => x, x =>
                {
                    var q = Types.Convert(x.Rotation);
                    float ang; UnityEngine.Vector3 axis;
                    q.ToAngleAxis(out ang, out axis);
                    return(new UVector4(q.x, q.y, q.z, q.w));
                });

                foreach (var axis in rotateAxes)
                {
                    var keys = bFrames
                               .Select(x => new Keyframe(x.Time * TimeScale,
                                                         UVector4.Dot(axisAngle[x], axis.Mask)))
                               .ToArray();

                    clip.SetCurve(bonePath, typeof(Transform), "localRotation." + axis.Name,
                                  new UnityEngine.AnimationCurve(keys));
                }

                var converted = bFrames.Select(x => Types.Convert(x.Translation)).ToArray();

                if (!converted.Any(x => !x.Equals(UVector3.zero)))
                {
                    continue;
                }

                var anyVelocities = false;
                var deltaVals     = converted.Select((x, i) =>
                {
                    var prev = Math.Max(0, i - 1);
                    var next = Math.Min(i + 1, converted.Length - 1);

                    var prevTime = bFrames[prev].Time * TimeScale;
                    var nextTime = bFrames[next].Time * TimeScale;

                    return(prevTime == nextTime || !(anyVelocities = true) ? UVector3.zero
                        : (converted[next] - converted[prev]) / (nextTime - prevTime));
                }).ToArray();

                foreach (var translateAxis in translateAxes)
                {
                    var positions = bFrames
                                    .Select((x, i) => new Keyframe(x.Time * TimeScale,
                                                                   UVector3.Dot(frame.transform.localPosition + converted[i], translateAxis.Mask)))
                                    .ToArray();

                    var deltas = bFrames.Select((x, i) => new Keyframe(x.Time * TimeScale,
                                                                       UVector3.Dot(deltaVals[i], translateAxis.Mask))).ToArray();

                    clip.SetCurve(bonePath, typeof(Transform), "localPosition." + translateAxis.Name,
                                  new UnityEngine.AnimationCurve(positions));

                    if (!anyVelocities)
                    {
                        continue;
                    }

                    clip.SetCurve(bonePath, typeof(BFrame), "LocalVelocity." + translateAxis.Name,
                                  new UnityEngine.AnimationCurve(deltas));
                }
            }

            clip.wrapMode = WrapMode.Loop;
            clip.EnsureQuaternionContinuity();

            return(clip);
        }
コード例 #14
0
 public static Vector3 ToV3(this UVector3 v3)
 {
     return(new Vector3 {
         x = v3.x, y = v3.y, z = v3.z
     });
 }
コード例 #15
0
 void IBattleCharacter.SetPosition(UVector3 pos)
 {
     transform.position = pos;
 }
コード例 #16
0
 IBattleCharacter IBattlePerception.CreateBattleCharacterView(string res, UVector3 pos, UVector3 forword)
 {
     return(new BattleCharactorView(pos, forword, this, Finder));
 }
コード例 #17
0
ファイル: LayoutBaseLogic.cs プロジェクト: xuebai5/ARPG-Game
        public static void DamageActive(TimeLinePlayer linePlayer, LayoutBase layoutBase)
        {
            var releaser = linePlayer.Releaser;
            var layout   = layoutBase as DamageLayout;

            BattleCharacter orginTarget = null;

            if (layout.target == Layout.TargetType.Releaser)
            {
                orginTarget = releaser.ReleaserTarget.Releaser;
            }
            else if (layout.target == Layout.TargetType.Target)
            {
                //release At Position?
                if (releaser.ReleaserTarget.ReleaserTarget == null)
                {
                    return;
                }
                orginTarget = releaser.ReleaserTarget.ReleaserTarget;
            }
            if (orginTarget == null)
            {
                throw new Exception("Do not have target of orgin. type:" + layout.target.ToString());
            }
            var offsetPos = new UVector3(layout.offsetPosition.x,
                                         layout.offsetPosition.y, layout.offsetPosition.z);
            var per     = releaser.Controllor.Perception  as BattlePerception;
            var targets = per.FindTarget(orginTarget,
                                         layout.fiterType,
                                         layout.damageType,
                                         layout.radius,
                                         layout.angle,
                                         layout.offsetAngle,
                                         offsetPos, releaser.ReleaserTarget.Releaser.TeamIndex);

            if (string.IsNullOrEmpty(layout.effectKey))
            {
                return;
                //throw new Exception ("No Found effect key!");
            }

            //完成一次目标判定
            if (targets.Count > 0)
            {
                if (layout.effectType == EffectType.EffectGroup)
                {
                    var group = linePlayer.TypeEvent.FindGroupByKey(layout.effectKey);
                    if (group == null)
                    {
                        return;
                    }
                    //相应效果处理
                    foreach (var i in group.effects)
                    {
                        foreach (var t in targets)
                        {
                            EffectBaseLogic.EffectActive(t, i, releaser);
                        }
                    }
                }
            }
        }
コード例 #18
0
ファイル: UCharacterView.cs プロジェクト: useada/ARPG-Game
 void IBattleCharacter.SetPosition(UVector3 pos)
 {
     this.transform.localPosition = pos.ToUVer3();
 }
コード例 #19
0
 public void SetPosition(UVector3 pos)
 {
     transform.position = pos;
 }
コード例 #20
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);
        }
コード例 #21
0
ファイル: GExtends.cs プロジェクト: useada/ARPG-Game
 public static UnityEngine.Vector3 ToUVer3(this UVector3 v3)
 {
     return(new Vector3(v3.x, v3.y, v3.z));
 }
コード例 #22
0
ファイル: BattlePerception.cs プロジェクト: xuebai5/ARPG-Game
        /// <summary>
        /// Finds the target.
        /// </summary>
        /// <returns>The target.</returns>
        /// <param name="character">Character.</param>
        /// <param name="fitler">Fitler.</param>
        /// <param name="damageType">Damage type.</param>
        /// <param name="radius">Radius.</param>
        /// <param name="angle">Angle.</param>
        /// <param name="offsetAngle">Offset angle.</param>
        /// <param name="offset">Offset.</param>
        /// <param name="teamIndex">team</param>
        public List <BattleCharacter> FindTarget(
            BattleCharacter character,
            FilterType fitler,
            Layout.LayoutElements.DamageType damageType,
            float radius, float angle, float offsetAngle,
            UVector3 offset, int teamIndex)
        {
            var sqrRadius = radius * radius;

            switch (damageType)
            {
            case Layout.LayoutElements.DamageType.Single:                    //单体直接对目标
                return(new List <BattleCharacter> {
                    character
                });

            case Layout.LayoutElements.DamageType.Rangle:
            {
                var orgin   = character.View.Transform.position + offset;
                var forward = character.View.Transform.forward;

                var q = UQuaternion.Euler(0, angle, 0);

                forward = q * forward;

                var list = new List <BattleCharacter>();
                State.Each <BattleCharacter>((t) =>
                    {
                        //过滤
                        switch (fitler)
                        {
                        case FilterType.Alliance:
                        case FilterType.OwnerTeam:
                            if (teamIndex != t.TeamIndex)
                            {
                                return(false);
                            }
                            break;

                        case FilterType.EmenyTeam:
                            if (teamIndex == t.TeamIndex)
                            {
                                return(false);
                            }
                            break;
                        }
                        //不在目标区域内
                        if ((orgin - t.View.Transform.position).sqrMagnitude > sqrRadius)
                        {
                            return(false);
                        }
                        if (angle < 360)
                        {
                            if (UVector3.Angle(forward, t.View.Transform.forward) > (angle / 2))
                            {
                                return(false);
                            }
                        }
                        list.Add(t);
                        return(false);
                    });
                return(list);
            }
            }

            return(new List <BattleCharacter>());
        }
コード例 #23
0
ファイル: UTest.cs プロジェクト: mengtest/UMath
    // Update is called once per frame
    void Update()
    {
        //return;
        if (rotangle > 360)
        {
            rotangle = 0;
        }
        rotangle += Time.deltaTime * 5f;

        this.mtransfrom.setParent(mparent);
        this.transform.localRotation = Quaternion.Euler(0, rotangle, 0);

        id   = Quaternion.identity;
        idm  = UQuaternion.identity;
        midM = UMatrix4x4.identity;
        mid  = Matrix4x4.identity;

        cForward = this.transform.forward;
        uForward = new UQuaternion(this.transform.rotation.x,
                                   this.transform.rotation.y,
                                   this.transform.rotation.z,
                                   this.transform.rotation.w)
                   * UVector3.forward;

        var inputUv = new UVector3(inputVer.x, inputVer.y, inputVer.z);
        var s       = new UVector3(scale.x, scale.y, scale.z);
        var t       = new UVector3(trans.x, trans.y, trans.z);

        q  = Quaternion.AngleAxis(angle, inputVer);
        mq = UQuaternion.AngleAxis(angle, inputUv);

        qEuler    = Quaternion.Euler(inputVer);
        qToEuler  = qEuler.eulerAngles;
        mqEuler   = UQuaternion.Euler(inputUv);
        mqToEuler = mqEuler.eulerAngles;

        m  = Matrix4x4.TRS(trans, q, scale);
        mm = UMatrix4x4.TRS(t, mq, s);

        Determinant  = m.determinant;
        mDeterminant = mm.Determinant;

        exScale    = mm.Scale;
        exTrans    = mm.Translate;
        exRotation = mm.Rotation;

        lookat  = Quaternion.LookRotation(inputVer);
        mlookat = UQuaternion.LookRotation(inputUv);

        mforwardLookat = mlookat * UVector3.forward;
        forwardLookat  = lookat * Vector3.forward;

        mangle = UQuaternion.LookRotation(inputUv).eulerAngles;
        rangle = Quaternion.LookRotation(inputVer).eulerAngles;


        mlookatMat = UMatrix4x4.LookAt(UVector3.zero, inputUv, UVector3.up);
        lookatMat  = Matrix4x4.TRS(
            Vector3.zero,
            Quaternion.LookRotation(inputVer, Vector3.up),
            Vector3.one);

        var v = this.transform.forward;

        angleY      = MathHelper.CalAngleWithAxisY(new UVector3(v.x, v.y, v.z));
        adm         = MathHelper.DeltaAngle(angleY, angle);
        ad          = Mathf.DeltaAngle(angleY, angle);
        angleDeltaM = MathHelper.MoveTowardsAngle(angleY, angle, adm * Time.deltaTime);
        angleDelta  = Mathf.MoveTowardsAngle(angleY, angle, ad * Time.deltaTime);


        this.mparent.localPosition = this.transform.parent.localPosition.ToUV3();
        this.mparent.localRotation = this.transform.parent.localRotation.ToUQ();
        this.mparent.localScale    = this.transform.parent.localScale.ToUV3();

        this.mtransfrom.localPosition = this.transform.localPosition.ToUV3();
        this.mtransfrom.localRotation = this.transform.localRotation.ToUQ();
        this.mtransfrom.localScale    = this.transform.localScale.ToUV3();

        dir  = this.transform.TransformDirection(Vector3.forward);
        dirU = mtransfrom.TransformDirection(UVector3.forward);

        point  = transform.TransformPoint(Vector3.forward);
        pointU = mtransfrom.TransformPoint(UVector3.forward);
    }
コード例 #24
0
 public static Vector3 ToV3(this UVector3 v)
 {
     return(new Vector3(v.x, v.y, v.z));
 }
コード例 #25
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);
        }
コード例 #26
0
ファイル: UCharacterView.cs プロジェクト: useada/ARPG-Game
 void IBattleCharacter.SetForward(UVector3 forward)
 {
     this.transform.forward = forward.ToUVer3();
 }
コード例 #27
0
 public static Vector3 ToNetVer3(this UVector3 ver)
 {
     return(new Vector3 {
         x = ver.x, y = ver.y, z = ver.z
     });
 }