// 리미트 거리가 없는 것.
    public bool canPlayerHeroTargetingType2WithOutDistCheck(Monster p, bool checkTargetOnly, TargetingDecal decal)
    {
        _target = TargetingData.getAutomaticTarget(p, targetType, targetAttr, canUseThisSkillOnThisType);
        if (_target == null)
        {
            return(false);
        }


        if (checkTargetOnly == false)
        {
            p.setSkillTarget(_target);
            p.targetHeight   = _target.hitObject.height;
            p.targetPosition = _target.cTransformPosition;
            p.targetUniqueId = _target.stat.uniqueId;
        }

        //if(p.isPlayer)
        {
            _v   = _target.cTransformPosition;
            _v.y = 1.0f;

            decal.setPosition(_v);
        }

        _target = null;
        return(true);
    }
    // 리미트 거리가 있는 것.
    public bool canPlayerHeroTargetingType2(Monster p, bool checkTargetOnly, TargetingDecal decal)
    {
        //데미지 범위. exeData.attr[1];
        _target = TargetingData.getAutomaticTarget(p, targetType, targetAttr, canUseThisSkillOnThisType);

        if (_target == null)
        {
            return(false);
        }
        //단순히 현재 상태에서 검사!
        if (VectorUtil.DistanceXZ(_target.cTransformPosition, p.cTransformPosition) < _targetDistanceLimit)
        {
            if (checkTargetOnly == false)
            {
                p.setSkillTarget(_target);
                p.targetHeight   = _target.hitObject.height;
                p.targetPosition = _target.cTransformPosition;
                p.targetUniqueId = _target.stat.uniqueId;
            }

            _v   = _target.cTransformPosition;
            _v.y = 1.0f;

            decal.setPosition(_v);

            _target = null;
            return(true);
        }

        _target = null;
        return(false);
    }
    // 리미트 거리가 있는 것.
    public bool canMonsterHeroTargetingType2(Monster attacker, int targetIndex = -1)
    {
        //데미지 범위. exeData.attr[1];
        _target = TargetingData.getAutomaticTarget(attacker, targetType, targetAttr, canUseThisSkillOnThisType);
        if (_target == null)
        {
            return(false);
        }

        // 타겟이 같은 편일때는 그냥 움직여서 쏘면 되니까 상관 없음.
        // 근데 타겟이 다른 편일때는 전방 거리까지 움직여서 쏠 수 있는지 확인을 해야할 것.
        if (_target.isPlayerSide)        // 적히어로몬스터가 우리편에게 쏘는거면...
        {
            if (GameManager.me.characterManager.targetZonePlayerLine - _target.cTransformPosition.x > _targetDistanceLimit)
            {
                _target = null;
                return(false);
            }
        }

        attacker.setSkillTarget(_target);
        attacker.skillTargetChecker = ctAutoByTargetDistance;
        attacker.skillMove          = ctMoveAuto;
        _target = null;
        return(true);
    }
 // 리미트 거리가 없는 것.
 public bool canMonsterHeroTargetingType2WithOutDistCheck(Monster attacker, int targetIndex = -1)
 {
     _target = TargetingData.getAutomaticTarget(attacker, targetType, targetAttr, canUseThisSkillOnThisType);
     if (_target == null)
     {
         return(false);
     }
     attacker.setSkillTarget(_target);
     attacker.skillTargetChecker = ctReturnTrue;
     _target = null;
     return(true);
 }
    //  - '1' 세팅시, 히어로와 가장 가까운 적(아군)
    //   - '2' 세팅시, HP가 가장 낮은 적(아군)

    // 리미트 거리가 있는 것.



    public bool canPlayerHeroTargetingType2PVP(Player checkTarget, Vector3 targetPosition)
    {
        //데미지 범위. exeData.attr[1];
        // 타겟이 적이면 공격자를 나로 해야한다.
        // 대상이 우리편인데 적에게 쏘는거다. 그럼 시전자는 적이다.
        if (targetType == Skill.TargetType.ENEMY)
        {
            _attacker = (checkTarget.isPlayerSide)?enemyHero:GameManager.me.player;
        }
        else
        {
            _attacker = (checkTarget.isPlayerSide)?GameManager.me.player:enemyHero;
        }

        // 일단 현재 위치들을 기준으로 자동타겟을 가져옴.
        _target = TargetingData.getAutomaticTarget(_attacker, targetType, targetAttr, canUseThisSkillOnThisType);

        // 자동타겟을 가져왔는데 타겟이 아무도 없어 그럼 체크고 나발이고 그냥 아웃.
        if (_target == null)
        {
            _attacker = null;
            return(false);
        }

        // 가장 가까이에 위치한 적.
        if (targetAttr[0].Get() == TargetingData.AUTOMATIC_CLOSE_TARGET_1)
        {
            // 히어로 미포함시.
            if (targetAttr[1].Get() == 1)
            {
                _attacker = null;
                _target   = null;
                return(false);
            }
            // 공격자에게 가까운 녀석을 가져왔는데 내가 선택한 녀석이 아니네?
            // 그럼 다시 체크해본다.
            // 자동선택해준녀석과 위험도에 있을 적의 위치
            IFloat distBetweenTargetPositionAndAttacker = VectorUtil.DistanceXZ(targetPosition, _attacker.cTransformPosition);

            if (_target != checkTarget)
            {
                // 이동 위치(특정 위치라거나 혹은 이동할 위치)가 현재 타겟된 녀석보다 공격자보다 가까우면 위험도 위치에 타게팅이 됨.
                // 아니라면 끝.
                if (VectorUtil.DistanceXZ(_target.cTransformPosition, _attacker.cTransformPosition) < distBetweenTargetPositionAndAttacker)
                {
                    _attacker = null;
                    _target   = null;
                    return(false);
                }
            }

            _attacker = null;
            _target   = null;

            // 타겟 포지션이 타게팅 위치가 된다는 것을 확인했다. 하지만 타게팅 제한거리보다 거리가 멀면 아웃.
            if (distBetweenTargetPositionAndAttacker < _targetDistanceLimit)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
        // 에너지가 낮은 적이니까 이건 획득한 캐릭터가 내가 아니면 무조건 아니다. 거리랑은 상관이 없는 녀석이다.
        else if (_target != checkTarget)
        {
            _attacker = null;
            _target   = null;
            return(false);
        }

        _attacker = null;
        _target   = null;
        return(true);
    }
    public bool canPlayerHeroTargetingType2PVP2(Player checkTarget, Vector3 targetPosition)
    {
        // 타겟이 적이면 공격자를 나로 해야한다.
        // 대상이 우리편인데 적에게 쏘는거다. 그럼 시전자는 적이다.
        if (targetType == Skill.TargetType.ENEMY)
        {
            _attacker = (checkTarget.isPlayerSide)?enemyHero:GameManager.me.player;
        }
        else
        {
            _attacker = (checkTarget.isPlayerSide)?GameManager.me.player:enemyHero;
        }

        // 가장 가까이에 위치한 적.
        if (targetAttr[0] == TargetingData.AUTOMATIC_CLOSE_TARGET_1)
        {
            // 히어로 미포함시.
            if (targetAttr[1] == 1)
            {
                _attacker = null;
                return(false);
            }

            if (targetType == Skill.TargetType.ENEMY)
            {
                // 적에게 쏘는 것은 타겟 포지션에 있는 녀석이 최전방에 있으면 됨.
                // 왜냐하면 가장 가까운 녀석에게 쏘는 거니까. 우리한테 가장 가까운 녀석은 최전방에 있는 녀석이라고 보면 됨.
                // 엄밀히 말하면 상하 위치도 봐야겠지만 전진까지 계산해서는 답이 안나온다.
                if (_attacker.isPlayerSide)
                {
                    if (GameManager.me.characterManager.monsters[0] != checkTarget && targetPosition.x + checkTarget.hitObject.lineLeft > GameManager.me.characterManager.monsterLeftLine)
                    {
                        _attacker = null;
                        return(false);
                    }
                }
                else
                {
                    if (GameManager.me.characterManager.playerMonster[0] != checkTarget && targetPosition.x + checkTarget.hitObject.lineRight < GameManager.me.characterManager.playerMonsterRightLine)
                    {
                        _attacker = null;
                        return(false);
                    }
                }
            }
            else
            {
                // 같은 편에게 쏠때는 전방 이동이 가능하므로. 주인공보다 전방에 있으면 무조건 사용 가능이다.
                if (_attacker.isPlayerSide)
                {
                    if (_attacker.cTransformPosition.x > targetPosition.x)
                    {
                        _attacker = null;
                        return(false);
                    }
                }
                else
                {
                    if (_attacker.cTransformPosition.x < targetPosition.x)
                    {
                        _attacker = null;
                        return(false);
                    }
                }
            }

            // 타겟 포지션이 타게팅 위치가 된다는 것을 확인했다. 하지만 타게팅 제한거리보다 거리가 멀면 아웃.
            if (VectorUtil.DistanceXZ(checkTarget.cTransformPosition, _attacker.cTransformPosition) < _targetDistanceLimit)
            {
                _attacker = null;
                return(true);
            }
            else
            {
                _attacker = null;
                return(false);
            }
        }
        // 에너지가 낮은 적이니까 이건 획득한 캐릭터가 내가 아니면 무조건 아니다. 거리랑은 상관이 없는 녀석이다.
        else
        {
            // 일단 현재 위치들을 기준으로 자동타겟을 가져옴.
            _target = TargetingData.getAutomaticTarget(_attacker, targetType, targetAttr, canUseThisSkillOnThisType);

            if (_target == null || _target != checkTarget)
            {
                _attacker = null;
                _target   = null;
                return(false);
            }
        }

        _attacker = null;
        _target   = null;
        return(true);
    }