예제 #1
0
    public override void Execute()
    {
        Actor pTarget = Owner.GetTarget();

        switch (Owner.ActorType)
        {
        case EActorType.MONSTER:
        {
            if (pTarget != null)
            {
                //float dist = GTTools.GetHorizontalDistance(Owner.Pos, pTarget.Pos);
                if (Owner.AiConeDetection.IsEnter)
                {
                    AI.ChangeAIState(EAIState.AI_CHASE);
                }
            }
            Patrol();
        }
        break;

        case EActorType.PLAYER:
        {
            if (pTarget != null)
            {
                float dist = GTTools.GetHorizontalDistance(Owner.Pos, pTarget.Pos);
                if (dist < AI.WARDIST)
                {
                    AI.ChangeAIState(EAIState.AI_CHASE);
                }
            }
            Patrol();
        }
        break;
        }
    }
예제 #2
0
    private void Fight()
    {
        float dist = GTTools.GetHorizontalDistance(Owner.Pos, Owner.GetTarget().Pos);

        if (dist > AI.ATKDIST)
        {
            AI.ChangeAIState(EAIState.AI_CHASE);
            return;
        }
        if (Owner.FSM == FSMState.FSM_SKILL)
        {
            return;
        }
        Owner.SendStateMessage(FSMState.FSM_Attack);
        Timerr += Time.deltaTime;
        if (Timerr >= SkillCD)
        {
            GameObject   Bullet       = ZTPool.Instance.GetGo("Model/Weapons/bullet");
            BulletScript bulletScript = Bullet.GET <BulletScript>();
            AudioClip    clip         = LoadResource.Instance.Load <AudioClip>("Sounds/AK47A");
            ZTAudio.Instance.PlaySound(clip);
            bulletScript.damage      = Owner.GetAttr(EAttr.Atk);
            bulletScript.AttackActor = this.Owner;
            if (Owner.mActorPart.AttackTransform != null)
            {
                Bullet.transform.position    = Owner.mActorPart.AttackTransform.position;
                Bullet.transform.eulerAngles = Owner.mActorPart.AttackTransform.eulerAngles;
            }
            Timerr = 0;
        }
    }
예제 #3
0
        public MoverFixPosition(ActMissile obj, Character target, HitCallbackFly onTriggerEnter) :
            base(obj, target, onTriggerEnter)
        {
            this.m_HAngle       = obj.MoveHAngle;
            this.m_VAngle       = obj.MoveVAngle;
            this.m_DestPosition = target != null?target.Avatar.GetBindPosition(EBind.Body) : CacheTransform.position + CacheTransform.forward * 10;

            this.m_DistanceToTarget = GTTools.GetHorizontalDistance(CacheTransform.position, m_DestPosition);
        }
예제 #4
0
 protected override void Trigger()
 {
     base.Trigger();
     for (int i = 0; i < GTWorld.Characters.Count; i++)
     {
         Character defender = GTWorld.Characters[i];
         if (Carryer.Match(Affect, defender) && GTTools.GetHorizontalDistance(Carryer.Pos, defender.Pos) <= Radius)
         {
             CharacterHelper.CalcDamage(Carryer, defender, null, Type, Percent, FixValue, IgnoreDefense);
         }
     }
 }
예제 #5
0
 protected override void Trigger()
 {
     base.Trigger();
     for (int i = 0; i < GTWorld.Characters.Count; i++)
     {
         Character defender = GTWorld.Characters[i];
         if (Carryer.Match(Affect, defender) && GTTools.GetHorizontalDistance(Carryer.Pos, defender.Pos) <= Radius)
         {
             CharacterHelper.CalcHeal(Type, Carryer, defender, string.Empty, Percent, FixValue);
         }
     }
 }
예제 #6
0
 protected override void Trigger()
 {
     base.Trigger();
     for (int i = 0; i < CharacterManager.Characters.Count; i++)
     {
         Character defender = CharacterManager.Characters[i];
         if (Carryer.Match(Affect, defender) && GTTools.GetHorizontalDistance(Carryer.Pos, defender.Pos) <= Radius)
         {
             CharacterHelper.CalcAddBuff(Carryer, defender, BuffID);
         }
     }
 }
예제 #7
0
        public override void Execute()
        {
            base.Execute();
            CacheTransform.LookAt(m_DestPosition);
            float distance = GTTools.GetHorizontalDistance(CacheTransform.position, m_DestPosition);

            if (m_VAngle != 0 || m_HAngle != 0)
            {
                float percent = Mathf.Min(1, distance / m_DistanceToTarget);
                float v       = percent * m_VAngle;
                float h       = percent * m_HAngle;
                CacheTransform.rotation *= Quaternion.Euler(Mathf.Clamp(v, -60, 60), Mathf.Clamp(h, -60, 60), 0);
            }
            CacheTransform.position += CacheTransform.forward * mMoveSpeed * Time.deltaTime;
        }
예제 #8
0
 protected override bool IsTouch(Character cc, Vector3 hitPoint, Vector3 dir)
 {
     if (cc == null || cc.CacheTransform == null)
     {
         return(false);
     }
     if (Radius <= 0)
     {
         return(false);
     }
     if (GTTools.GetHorizontalDistance(hitPoint, cc.Pos) < cc.Radius)
     {
         return(true);
     }
     return(false);
 }
예제 #9
0
 public override bool IsTouch(Actor actor)
 {
     if (actor == null || actor.CacheTransform == null)
     {
         return(false);
     }
     if (Radius <= 0)
     {
         return(false);
     }
     if (GTTools.GetHorizontalDistance(Center.position, actor.Pos) < actor.Radius)
     {
         return(true);
     }
     return(false);
 }
예제 #10
0
        public float Height = 2;    //圆柱有效高度

        public override bool IsTouch(Actor actor)
        {
            if (actor == null || actor.CacheTransform == null)
            {
                return(false);
            }
            if (HAngle <= 0 || Height <= 0)
            {
                return(false);
            }


            float y    = Center.position.y;
            float yMax = y + Height / 2;
            float yMin = y - Height / 2;

            if (actor.Pos.y + actor.Height <= yMin)
            {
                return(false);
            }
            if (actor.Pos.y >= yMax)
            {
                return(false);
            }

            Vector3 dirPos = Euler + Center.forward;

            dirPos.y = 0;
            float radius = MaxDis + actor.Radius;

            if (GTTools.GetHorizontalDistance(Center.position, actor.Pos) > radius)
            {
                return(false);
            }

            Vector3 targetPos = actor.Pos;

            targetPos.y = 0;
            Vector3 centerPos = Center.position;

            centerPos.y = 0;
            if (Vector3.Angle(targetPos - centerPos, dirPos) > HAngle / 2)
            {
                return(false);
            }
            return(true);
        }
예제 #11
0
    public override void Execute()
    {
        if (Owner.GetTarget() != null)
        {
            Owner.Command(new RTCommand(Owner.GetTarget()));
            Owner.mActorPathFinding.SetStopDis(2);
        }
        switch (Owner.ActorType)
        {
        case EActorType.MONSTER:
        {
            if (Owner.GetTarget() == null)
            {
                return;
            }
            float dist = GTTools.GetHorizontalDistance(Owner.Pos, Owner.GetTarget().Pos);
            if (dist > AI.WARDIST)
            {
                AI.ChangeAIState(EAIState.AI_BACK);
            }
            else if (dist < AI.ATKDIST && Owner.AiConeDetection.IsEnter)
            {
                AI.ChangeAIState(EAIState.AI_FIGHT);
                return;
            }
        }
        break;

        case EActorType.PLAYER:
        {
            if (Owner.GetTarget() == null)
            {
                AI.ChangeAIState(EAIState.AI_IDLE);
                return;
            }
            float dist = GTTools.GetHorizontalDistance(Owner.Pos, Owner.GetTarget().Pos);

            if (dist < AI.ATKDIST)
            {
                AI.ChangeAIState(EAIState.AI_FIGHT);
                return;
            }
        }
        break;
        }
    }
예제 #12
0
파일: Actor.cs 프로젝트: mengtest/skilldemo
    public Actor GetNearestEnemy(float radius = 10000)
    {
        List <Actor> actors = GetAllEnemy();
        //Debug.LogError("敌人列表"+actors.Count);
        Actor nearest = null;
        float min     = radius;

        for (int i = 0; i < actors.Count; i++)
        {
            float dist = GTTools.GetHorizontalDistance(actors[i].CacheTransform.position, this.CacheTransform.position);
            if (dist < min)
            {
                min     = dist;
                nearest = actors[i];
            }
        }
        return(nearest);
    }
예제 #13
0
        public float Height;    //圆柱有效高度

        protected override bool IsTouch(Character cc, Vector3 hitPoint, Vector3 hitDir)
        {
            if (cc == null || cc.CacheTransform == null)
            {
                return(false);
            }
            if (HAngle <= 0 || Height <= 0)
            {
                return(false);
            }
            float y    = hitPoint.y;
            float yMax = y + Height / 2;
            float yMin = y - Height / 2;

            if (cc.Pos.y + cc.Height <= yMin)
            {
                return(false);
            }
            if (cc.Pos.y >= yMax)
            {
                return(false);
            }
            Vector3 dirPos = Euler + hitDir;

            dirPos.y = 0;
            float radius = MaxDis + cc.Radius;

            if (GTTools.GetHorizontalDistance(hitPoint, cc.Pos) > radius)
            {
                return(false);
            }
            Vector3 targetPos = cc.Pos;

            targetPos.y = 0;
            Vector3 centerPos = hitPoint;

            centerPos.y = 0;
            if (Vector3.Angle(targetPos - centerPos, dirPos) > HAngle / 2)
            {
                return(false);
            }
            return(true);
        }
예제 #14
0
파일: Actor.cs 프로젝트: 977567460/Escapes
    public Actor GetNearestEnemy(float radius = 10000)
    {
        if (AiConeDetection.TargetPlayer != null)
        {
            return(AiConeDetection.TargetPlayer);
        }
        List <Actor> actors  = GetAllEnemy();
        Actor        nearest = null;
        float        min     = radius;

        for (int i = 0; i < actors.Count; i++)
        {
            float dist = GTTools.GetHorizontalDistance(actors[i].CacheTransform.position, this.CacheTransform.position);
            if (dist < min)
            {
                min     = dist;
                nearest = actors[i];
            }
        }
        return(nearest);
    }
예제 #15
0
 public ActSkill SelectSkillByEnemy(Character enemy)
 {
     foreach (var current in mSkillAttacks)
     {
         ActSkill s = current.Value;
         if (s.CastDist > 0 && s.IsCD() == false)
         {
             if (enemy != null)
             {
                 if (GTTools.GetHorizontalDistance(mCharacter.Pos, enemy.Pos) < s.CastDist)
                 {
                     return(s);
                 }
             }
             else
             {
                 return(s);
             }
         }
     }
     return(GetSkill(ESkillPos.Skill_0));
 }
예제 #16
0
        protected void HitCallback(MoverBeam mover)
        {
            if (mover.DstCharacter == null)
            {
                return;
            }
            ActHelper.RunChildrenInNewTree(this, (tree) =>
            {
                for (int i = 0; i < tree.Children.Count; i++)
                {
                    tree.Children[i].ApplyHitPoint = mover.DstCharacter.Avatar.GetBindPosition(TargetBind);
                    tree.Children[i].ApplyHitDir   = mover.CacheTransform.forward;
                    tree.Children[i].AddInAttackList(mover.DstCharacter);
                }
            });

            if (mCurrAttackList.Count >= MaxCount)
            {
                return;
            }

            List <Character> list = Skill.Caster.GetAffectCharacters(Affect, false);

            for (int i = 0; i < list.Count; i++)
            {
                Character cc = list[i];
                if (mCurrAttackList.Contains(cc))
                {
                    continue;
                }
                mCurrAttackList.Add(cc);
                if (GTTools.GetHorizontalDistance(cc.Pos, mover.DstCharacter.Pos) < MaxBounceDis)
                {
                    GTWorld.Instance.Act.MakeMove(this, mover.DstCharacter, cc, HitCallback);
                }
            }
        }
예제 #17
0
    private void Fight()
    {
        float dist = GTTools.GetHorizontalDistance(Owner.Pos, Owner.GetTarget().Pos);

        if (dist > AI.ATKDIST)
        {
            AI.ChangeAIState(EAIState.AI_CHASE);
            return;
        }
        if (Owner.FSM == FSMState.FSM_SKILL)
        {
            return;
        }
        SkillTree skill = Owner.GetActorSkill().FindNextSkillByDist(dist);

        if (skill != null)
        {
            Owner.Command(new USCommand(skill.Pos));
        }
        else
        {
            Owner.Command(new IDCommand());
        }
    }
예제 #18
0
    public override void Execute()
    {
        switch (Owner.ActorType)
        {
        case EActorType.MONSTER:
        {
            if (Owner.GetTarget() == null)
            {
                return;
            }
            float dist = GTTools.GetHorizontalDistance(Owner.Pos, Owner.GetTarget().Pos);
            if (dist > AI.WARDIST)
            {
                AI.ChangeAIState(EAIState.AI_BACK);
            }
            else if (dist < AI.ATKDIST)
            {
                AI.ChangeAIState(EAIState.AI_FIGHT);
                return;
            }
        }
        break;

        case EActorType.PARTNER:
        {
            if (Owner.GetTarget() == null)
            {
                AI.ChangeAIState(EAIState.AI_IDLE);
                return;
            }
            float dist = GTTools.GetHorizontalDistance(Owner.Pos, Owner.GetTarget().Pos);
            if (dist > AI.WARDIST)
            {
                AI.ChangeAIState(EAIState.AI_IDLE);
                return;
            }
            else if (dist < AI.ATKDIST)
            {
                AI.ChangeAIState(EAIState.AI_FIGHT);
                return;
            }
        }
        break;

        case EActorType.PLAYER:
        {
            if (Owner.GetTarget() == null)
            {
                AI.ChangeAIState(EAIState.AI_IDLE);
                return;
            }
            float dist = GTTools.GetHorizontalDistance(Owner.Pos, Owner.GetTarget().Pos);

            if (dist < AI.ATKDIST)
            {
                AI.ChangeAIState(EAIState.AI_FIGHT);
                return;
            }
        }
        break;
        }
        if (Owner.GetTarget() != null)
        {
            Owner.Command(new RTCommand(Owner.GetTarget()));
        }
    }
예제 #19
0
    public override void Execute()
    {
        Actor pTarget = Owner.GetTarget();

        if (pTarget != null)
        {
            Debug.LogError("找到的目標" + pTarget.Id);
        }

        switch (Owner.ActorType)
        {
        case EActorType.MONSTER:
        {
            if (pTarget != null)
            {
                float dist = GTTools.GetHorizontalDistance(Owner.Pos, pTarget.Pos);
                if (dist < AI.WARDIST)
                {
                    AI.ChangeAIState(EAIState.AI_CHASE);
                }
            }
        }
        break;

        case EActorType.PARTNER:
        {
            //if (pTarget!=null)
            //{
            //    float dist = GTTools.GetHorizontalDistance(Owner.Pos, pTarget.Pos);
            //    if (dist < AI.WARDIST)
            //    {
            //        AI.ChangeAIState(EAIState.AI_CHASE);
            //    }
            //}
            //Actor pHost = Owner.GetHost();
            //if (pHost != null)
            //{
            //    float dist = GTTools.GetHorizontalDistance(Owner.Pos, Owner.GetHost().Pos);
            //    if (dist > AI.FOLLOWDIST)
            //    {
            //        AI.ChangeAIState(EAIState.AI_FOLLOW);
            //        return;
            //    }
            //}
        }
        break;

        case EActorType.PLAYER:
        {
            if (pTarget != null)
            {
                float dist = GTTools.GetHorizontalDistance(Owner.Pos, pTarget.Pos);
                if (dist < AI.WARDIST)
                {
                    AI.ChangeAIState(EAIState.AI_CHASE);
                }
            }
        }
        break;
        }
    }