コード例 #1
0
 public bool checkingDefaultAttackRange(Monster attacker, Monster target, IVector3 targetPosition, float offset = 0.0f)
 {
     if (attacker.isPlayerSide == false)
     {
         if (isShortType)
         {
             return(VectorUtil.DistanceXZ(targetPosition, attacker.cTransformPosition) <= (IFloat)(attacker.stat.atkRange + target.damageRange + offset + attacker.damageRange));                                // hitrange
         }
         else
         {
             return(Xfloat.lessEqualThan(attacker.cTransformPosition.x - attacker.stat.atkRange - offset - attacker.damageRange, targetPosition.x + target.hitObject.lineRight));
         }
     }
     else
     {
         if (isShortType)
         {
             return(Xfloat.lessEqualThan(VectorUtil.DistanceXZ(targetPosition, attacker.cTransformPosition), attacker.stat.atkRange + target.damageRange + offset + attacker.damageRange));                                 // hitrange
         }
         else
         {
             return(Xfloat.greatEqualThan(attacker.cTransformPosition.x + attacker.stat.atkRange + offset + attacker.damageRange, target.hitObject.lineLeft + targetPosition.x));
         }
     }
 }
コード例 #2
0
    // 리미트 거리가 있는 것.
    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);
    }
コード例 #3
0
// ====== 데미지 =====//

    // 반경을 그리는 충돌 영역 검사.
    public bool hitByDistance(IVector3 centerPoint, IFloat hitRadius)
    {
        // 반경에 damageRange를 더한 이유는 원 끝부분에 캐릭터가 걸쳐있을때도 맞게하기 위함이다.
        // 보면서 조정이 필요할 수도 있다.

#if UNITY_EDITOR
//		Debug.Log("centerPoint : " + centerPoint + " cTransformPosition : " + cTransformPosition + " hitRadius : " + hitRadius );
#endif

        return(VectorUtil.DistanceXZ(centerPoint, cTransformPosition) <= hitRadius + damageRange);          // * 0.5f);
    }
コード例 #4
0
    float getDamagePer(Vector3 centerPos, Vector3 targetPos, float radius)
    {
        float damagePer = 1.0f - ((VectorUtil.DistanceXZ(centerPos, targetPos)) / (radius * 0.5f));

        if (damagePer < 0.0f)
        {
            damagePer = 0.1f;
        }
        else if (damagePer > 1.0f)
        {
            damagePer = 1.0f;
        }

        return(damagePer);
    }
コード例 #5
0
    void hitTest()
    {
        _v = mon.cTransformPosition;

        for (int i = _cm.playerMonster.Count - 1; i >= 0; --i)
        {
            if (_cm.playerMonster[i].isEnabled)
            {
                if (VectorUtil.DistanceXZ(_v, _cm.playerMonster[i].cTransformPosition) <= _hitRadius + _cm.playerMonster[i].damageRange)
                {
                    if (_cm.playerMonster[i].isPlayer)
                    {
                        _cm.playerMonster[i].characterEffect.addKnockBack(200);
                    }
                    else
                    {
                        _cm.playerMonster[i].damageDead();
                    }
                }
            }
        }
    }
    //  - '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);
    }
コード例 #8
0
    void updateBullets(List <Bullet> bulletList, List <Monster> targetMonsterList)
    {
        int    j      = 0;
        bool   isSkip = false;
        bool   isHit  = false;
        IFloat _tempF;

        for (int i = bulletList.Count - 1; i >= 0; --i)
        {
            if (bulletList[i].isDeleteObject)
            {
                setBullet(bulletList[i]);
                bulletList.RemoveAt(i);
                continue;
            }

            _tempBullet = bulletList[i];

            _tempBullet.update();


            if (GameManager.me.currentScene != Scene.STATE.PLAY_BATTLE && UIPopupSkillPreview.isOpen == false)
            {
                continue;
            }


            _tempHitObject = _tempBullet.getHitObject();

            if (_tempBullet.isCollisionCheckAtEndOnly || _tempBullet.canCollide == false || _tempBullet.delay > 0)
            {
            }
            else
            {
                //======= 곡사포가 아닌것만 체크.
                ///////////////////////////////////////////////////////////////////////////////////

                // 몬스터와 충돌 체크
                int monsterCount = targetMonsterList.Count;
                isSkip = false;

                // 지속형 스킬일때 피격횟수를 매번 초기화하기위해.
                _tempBullet.checkTargetNum();


                for (j = 0; j < monsterCount; ++j)
                {
//					if(GameManager.me.isPlaying == false) break;

                    _tempMonster = targetMonsterList[j];

                    if (_tempMonster.isEnabled == false)
                    {
                        continue;                                                      // || _tempMonster.skipHitCheck
                    }
                    isHit = false;

                    if (_tempBullet.isCircleColliderType)
                    {
                        _tempF = _tempBullet.targetRange + _tempMonster.damageRange;
                        if (_tempF >= VectorUtil.DistanceXZ(_tempBullet.bTransformPosition, _tempMonster.cTransformPosition))
                        {
                            isHit = true;
                        }
                    }
                    else
                    {
                        if (_tempHitObject.intersectsBullet(_tempMonster.getHitObject()))
                        {
                            isHit = true;
                        }
                    }

                    if (isHit)
                    {
                        //Log.log("_tempBullet : " + _tempBullet + "_tempMonster : " + _tempMonster.resourceId);

                        _tempBullet.prevHp = _tempBullet.hp.Get();

                        if (_tempBullet.damageToCharacter != null)
                        {
                            _tempBullet.damageToCharacter(_tempMonster);
                        }

                        if (_tempMonster.isDeleteObject)                         //|| (_tempMonster.hp <= 0 && _tempMonster.invincible == false))
                        {
                            //Log.log("==== _tempMonster.isDeleteObject !!");
                            _tempBullet.bulletData.hitDeadActionStart(_tempMonster.cTransformPosition);
                        }

                        if (_tempBullet.hp.Get() <= 0 && _tempBullet.invincible == false)
                        {
                            //_tempBullet.setDelete();
                            _tempBullet.destroy();
                            //playerBulletList.RemoveAt(i);
                            isSkip = true;
                            break;
                        }
                        else
                        {
                            if (_tempBullet.prevHp > _tempBullet.hp.Get() && _tempBullet.damageCheckTypeNo == 5)
                            {
                                int r = _tempBullet.retargetingRange.Get();

                                if (r > 0)
                                {
                                    _tempBullet.startRetargeting(_tempMonster);
                                }
                            }
                        }
                    }
                }


                if (isSkip)
                {
                    continue;
                }
                // 곡사포가 아닌것들 여기까지 =====
            }
            // 화면 밖으로 벗어났는지 검사.
            if (_tempBullet.isOutSide())            // 화면 밖을 벗어났으면...
            {
                _tempBullet.setDelete();
            }
        }

        _tempBullet = null;
    }
コード例 #9
0
    void move(Monster target)
    {
        if (GameManager.me.stageManager.playTime - _infoShowTime > 0.5f)
        {
            _m = (int)(VectorUtil.Distance(GameManager.me.player.cTransformPosition.x, mon.cTransformPosition.x) * 0.01f);

            if (_m != _infoValue)
            {
                GameManager.me.uiManager.uiPlay.lbChaser.text = "-" + _m + "m";
                _infoValue    = _m;
                _infoShowTime = GameManager.me.stageManager.playTime;
            }
        }


        _target = target;

        mon.attackPosition = Util.getPositionByAngleAndDistanceXZ(0, mon.stat.atkRange + _target.damageRange + mon.damageRange);          // hitrange
        //mon.action.delay = 0.3f;

        _v = _target.cTransformPosition + mon.attackPosition;

        if (VectorUtil.DistanceXZ(_target.cTransformPosition, mon.cTransformPosition) <= mon.stat.atkRange + _target.damageRange + mon.damageRange)          // hitrange
        {
            _v = _target.cTransformPosition - mon.cTransformPosition;

            _q = Util.getLookRotationQuaternion(_v);
            // 자리를 다 잡았으면 공격...
            mon.tf.rotation = Util.getFixedQuaternionSlerp(mon.tf.rotation, _q, CharacterAction.rotationSpeed * GameManager.globalDeltaTime);

            if ((mon.action.delay > 0 || Xfloat.greaterThan(Quaternion.Angle(_q, mon.tf.rotation), 5)) || _target.isEnabled == false)
            {
                mon.state         = Monster.NORMAL;
                mon.action.delay -= GameManager.globalDeltaTime;
            }
            else
            {
                mon.action.state = CharacterAction.STATE_ACTION;
            }
        }
        else if (mon.cTransformPosition.x + mon.attackPosition.x >= _target.cTransformPosition.x && VectorUtil.Distance(_v.z, mon.cTransformPosition.z) < 5)
        {
            //Debug.Log("1");

            _v = _target.cTransformPosition - mon.cTransformPosition;

            _q = Util.getLookRotationQuaternion(_v);
            // 자리를 다 잡았으면 공격...
            mon.tf.rotation = Util.getFixedQuaternionSlerp(mon.tf.rotation, _q, CharacterAction.rotationSpeed * GameManager.globalDeltaTime);

            if ((mon.action.delay > 0 || Xfloat.greaterThan(Quaternion.Angle(_q, mon.tf.rotation), 5)) || _target.isEnabled == false)
            {
                mon.state         = Monster.NORMAL;
                mon.action.delay -= GameManager.globalDeltaTime;
            }
            else
            {
                mon.action.state = CharacterAction.STATE_ACTION;
            }
        }
        else
        {
            _v = _target.cTransformPosition + mon.attackPosition;
            _q = Util.getLookRotationQuaternion(_v - mon.cTransformPosition);
            mon.tf.rotation = Util.getFixedQuaternionSlerp(mon.tf.rotation, _q, CharacterAction.rotationSpeed * GameManager.globalDeltaTime);

            _v   = mon.cTransformPosition + mon.tf.forward * mon.stat.speed * GameManager.globalDeltaTime;
            _v.y = 0;

            mon.setPlayAniRightNow(Monster.WALK);
            mon.animation[Monster.WALK].speed = 0.3f;
            mon.setPosition(_v);
        }
    }
コード例 #10
0
    //기본공격거리내 적존재 TARGET_IN_CZONE
    // 원래는 캐릭터 공격 거리내에 적 존재였는데 지금은 지정된 거리 안에 적이 있는지만 본다.


    bool checkEnemyInDefaultActionZone(Monster mon, AISlot ai)
    {
        int len = GameManager.me.characterManager.playerMonster.Count;

        if (len <= 0)
        {
            return(false);
        }

        if (VectorUtil.DistanceXZ(mon.cTransformPosition, GameManager.me.characterManager.playerMonster[0].cTransformPosition) < targetInDefaultTargetZone)
        {
            mon.targetPosition = GameManager.me.characterManager.playerMonster[0].cTransformPosition;
            mon.targetHeight   = GameManager.me.characterManager.playerMonster[0].hitObject.height;
            mon.targetUniqueId = GameManager.me.characterManager.playerMonster[0].stat.uniqueId;
            return(true);
        }

        /*
         * if(GameManager.me.player.isEnabled)
         * {
         *      if(len >= targetInDefaultTargetZone)
         *      {
         *              _tempMon = GameManager.me.characterManager.playerMonster[targetInDefaultTargetZone-1];
         *      }
         *      else if(len > 0 && len + 1 >= targetInDefaultTargetZone)
         *      {
         *              _tempMon = GameManager.me.characterManager.playerMonster[targetInDefaultTargetZone-1];
         *      }
         *      else if(targetInDefaultTargetZone == 1)
         *      {
         *              return (GameManager.me.player.cTransformPosition.x + GameManager.me.player.damageRange + mon.stat.atkRange >= GameManager.me.characterManager.playerMonsterRightLine); // hitrange
         *      }
         *
         *
         *      bool returnValue = false;
         *
         *      if(_tempMon != null)
         *      {
         *              if(_tempMon.lineRight > GameManager.me.player.lineRight)
         *              {
         *                      returnValue = (_tempMon.cTransformPosition.x + _tempMon.damageRange + mon.stat.atkRange >= GameManager.me.characterManager.playerMonsterRightLine); // hitrange
         *              }
         *              else
         *              {
         *                      returnValue = (GameManager.me.player.cTransformPosition.x + GameManager.me.player.damageRange + mon.stat.atkRange >= GameManager.me.characterManager.playerMonsterRightLine); // hitrange
         *              }
         *
         *              _tempMon = null;
         *      }
         *
         *      return returnValue;
         * }
         * else
         * {
         *      if(len >= targetInDefaultTargetZone)
         *      {
         *              return (GameManager.me.characterManager.playerMonster[targetInDefaultTargetZone-1].damageRange + mon.stat.atkRange >= GameManager.me.characterManager.playerMonsterRightLine); // hitrange
         *      }
         * }
         */

        return(false);


        //if(VectorUtil.DistanceXZ(mon.target.cTransformPosition , mon.cTransformPosition) <= mon.hitRange  + mon.target.damageRange)
        //mon.stat.atkRange

        //targetInDefaultTargetZone
        //return (GameManager.me.characterManager.playerMonsterRightLine + targetInDefaultTargetZone >= mon.lineLeft);
        //return (GameManager.me.characterManager.getCloseEnemyTargetByPosX(false).lineLeft > GameManager.me.characterManager.targetZonePlayerLine - mon.stat.atkRange);
    }
コード例 #11
0
    public void getNextTarget(bool isPlayerSide)
    {
        _chaByRangeDistance.Clear();

        int targetCount = _targets.Count;

        if (targetCount == 0)
        {
            _v = _attacker.cTransformPosition;
        }
        else
        {
            _v = _targets[_targets.Count - 1].cTransformPosition;
        }

        Monster cha;

        if (isPlayerSide)
        {
            len = GameManager.me.characterManager.monsters.Count;


            // 총알에서 가까운 녀석들부터 처리하기위해...
            for (i = len - 1; i >= 0; --i)
            {
                cha = GameManager.me.characterManager.monsters[i];
                if (cha.isEnabled == false || cha.chainLighting.Contains(this))
                {
                    continue;
                }
                cha.distanceFromHitPoint = VectorUtil.DistanceXZ(_v, cha.cTransformPosition);
                _chaByRangeDistance.Add(cha);
            }
        }
        else
        {
            len = GameManager.me.characterManager.playerMonster.Count;

            // 총알에서 가까운 녀석들부터 처리하기위해...
            for (i = len - 1; i >= 0; --i)
            {
                cha = GameManager.me.characterManager.playerMonster[i];
                if (cha.isEnabled == false || cha.chainLighting.Contains(this))
                {
                    continue;
                }
                cha.distanceFromHitPoint = VectorUtil.DistanceXZ(_v, cha.cTransformPosition);
                _chaByRangeDistance.Add(cha);
            }
        }

        _chaByRangeDistance.Sort(CharacterManager.sortByDistHitPointCharacter);

        len = _chaByRangeDistance.Count;

        if (len <= 0)
        {
            _canMore = false;
            _delay   = 0.0f;
            _chaByRangeDistance.Clear();
            return;
        }

        i = len - 1;

        cha = _chaByRangeDistance[i];
        _chaByRangeDistance.Clear();

        if (_nowConnectionNum == 0)        // 최대연결거리 A만 계산.
        {
//			if(VectorUtil.DistanceXZ(_attacker.cTransformPosition, cha.cTransformPosition).AsFloat() > _distanceLimitA - _attacker.damageRange - cha.damageRange)

            if (VectorUtil.DistanceXZ(_attacker.cTransformPosition, cha.cTransformPosition).AsFloat() > _distanceLimitA)
            {
                _canMore = false;
                _delay   = 0.0f;
                return;
            }
        }
        else         // 최대연결거리B와 최대 전체거리를 다 계산해야함.
        {
            if (targetCount == 0)
            {
                _canMore = false;
                _delay   = 0.0f;
                return;
            }

            _tempF = VectorUtil.DistanceXZ(_targets[targetCount - 1].cTransformPosition, cha.cTransformPosition);

            if (_tempF > _distanceLimitB)
            {
                _canMore = false;
                _delay   = 0.0f;
                return;
            }
            else
            {
                _nowTotalDistance = 0.0f;
                for (i = _targets.Count - 1; i > 0; --i)
                {
                    _nowTotalDistance += VectorUtil.DistanceXZ(_targets[i].cTransformPosition, _targets[i - 1].cTransformPosition);
                }

                if (_nowTotalDistance + _tempF > _totalDistanceLimit)
                {
                    _canMore = false;
                    _delay   = 0.0f;
                    return;
                }
            }
        }

        _startPosition = cha.cTransformPosition;

        ElectricEffect eff = GameManager.me.effectManager.getElectricEffect(type);

        eff.mode = ElectricEffect.Mode.CHARACTER;
        _effects.Add(eff);

        ParticleEffect pe = GameManager.me.effectManager.getParticleEffect(hitEffectId, GameManager.info.effectData[hitEffectId].resource);

        _v   = cha.cTransformPosition;
        _v.y = cha.hitObject.top * 0.5f;

        if (GameManager.info.effectData[hitEffectId].maxSizeRatio < cha.effectSize)
        {
            pe.start(_v, cha.tf, true, GameManager.info.effectData[hitEffectId].maxSizeRatio);
        }
        else
        {
            pe.start(_v, cha.tf, true, cha.effectSize);
        }


        pe.shooterUniqueId = _attacker.stat.uniqueId;
        pe.checkSkillCam();

        _particleEffects.Add(pe);

        if (_nowConnectionNum == 0)
        {
            eff.cFrom = _attacker;
            if (_attacker.shootingHand != null)
            {
                eff.shootingPoint = _attacker.shootingHand;
            }
        }
        else
        {
            eff.cFrom = _targets[targetCount - 1];
        }

        eff.cTo       = cha;
        eff.isEnabled = true;

        cha.chainLighting.Add(this);
        _targets.Add(cha);
        ++_nowConnectionNum;


        IFloat dp = 1.0f;

        if (_damageOffsetPerConnectionLevel > 0.0f && _nowConnectionNum > 1)
        {
            dp = 1.0f - (_nowConnectionNum - 1) * _damageOffsetPerConnectionLevel;
        }

        if (_skillData != null)
        {
            _skillData.applySkillEffect(cha, _skillLevel, null, _applyInforceLevel, _attacker, dp);
        }
        else
        {
            cha.damage(_attacker.stat.monsterType,
                       _attacker,
                       _attacker.stat.uniqueId, false,
                       1,
                       _attacker.tf,
                       _attacker.stat.atkPhysic,
                       _attacker.stat.atkMagic,
                       1.0f,
                       1.0f,
                       true,
                       GameManager.info.skillEffectSetupData[_attacker.atkEffectType].effUp,
                       GameManager.info.skillEffectSetupData[_attacker.atkEffectType].soundDown,
                       dp
                       );
        }
    }
コード例 #12
0
 // 2번 자동선택 타겟팅 중 6~11번은 최대 타겟 거리를 계산해야한다.
 // 6~11번을 제외한 녀석들은 자동타겟이면 무조건 되는거다.
 bool ctAutoByTargetDistance(Monster attacker)
 {
     return(VectorUtil.DistanceXZ(attacker.skillTarget.cTransformPosition, attacker.cTransformPosition) <= _targetDistanceLimit);
 }
コード例 #13
0
    public void start(Vector3 targetStartPos,      // 속성1> 기준점좌표 [x,y,z(/x,y,z)] : 기준점 시작좌표 / 기준점 끝좌표(생략가능)
                      Vector3 targetEndPos,
                      bool useTargetEndPos,

                      Vector3 targetStartScreenPos,      // 속성2> 화면좌표A [x,y(/x,y)] : 기준점을 위치시킬 화면좌표(시작) / 기준점을 위치시킬 화면좌표(끝)
                      Vector3 targetEndScreenPos,
                      bool useTargetEndScreenPos,

                      float duration,              // 속성3> 카메라이동시간 (sec) : 설정된 시간동안 카메라 이동

                      int finalCamYpos,            //속성4> 최종카메라 높이(y)값 : 현재 높이값에서 설정된 높이값으로 변경 (0 세팅시 높이 변화 없음)
                      float distanceTweeningValue, //속성5> 기준점과의 거리변경(%) : 기준점과의 현재거리 대비 N%만큼 거리를 줄이거나 늘림 (y축은 무시, x,z 값만 가지고 기준점과의 거리를 계산)
                      int rotValue,                //속성6> 회전각도 : 오른쪽 (or 왼쪽) 이동시 양수 / 반대쪽 이동은 음수로 지정 (예 : -540 세팅시 왼쪽으로 한바퀴반 돌기)
                      string easingType)           // 속성7> 가속도 : CAM_MOVE 와 동일
    {
        isEnabled = true;


        if (UIPlay.nowSkillEffectCamStatus == UIPlay.SKILL_EFFECT_CAM_STATUS.Play)
        {
            targetStartPos += GameManager.me.uiManager.uiPlay.getUnitSkillCamOffsetPosition() + GameManager.me.uiManager.uiPlay.gameCameraContainer.position;
            targetEndPos   += GameManager.me.uiManager.uiPlay.getUnitSkillCamOffsetPosition() + GameManager.me.uiManager.uiPlay.gameCameraContainer.position;
        }

        UIPlay.isFollowPlayerWhenSkillEffectCamIdle = false;


        _targetStartPos  = targetStartPos;
        _targetEndPos    = targetEndPos;
        _useTargetEndPos = useTargetEndPos;

        _targetStartScreenPos  = targetStartScreenPos;
        _targetEndScreenPos    = targetEndScreenPos;
        _useTargetEndScreenPos = useTargetEndScreenPos;


        if (targetStartScreenPos.z < 0)
        {
            _targetStartScreenPos = GameManager.me.gameCamera.WorldToScreenPoint(_targetStartPos);
            _targetStartScreenPos = Util.screenPositionWithCamViewRect(_targetStartScreenPos);
        }


        _v = GameManager.me.uiManager.uiPlay.gameCameraPosContainer.localPosition;

        if (UIPlay.nowSkillEffectCamStatus == UIPlay.SKILL_EFFECT_CAM_STATUS.Play)
        {
            _v += GameManager.me.uiManager.uiPlay.gameCameraContainer.position;
        }

        _startAngle = Util.getFloatAngleBetweenXZ(_v, targetStartPos);
        _startDist  = VectorUtil.DistanceXZ(_v, targetStartPos);


        csCamOffset.x = (GameManager.screenSize.x * 0.5f - _targetStartScreenPos.x) / GameManager.screenSize.x;
        csCamOffset.y = (GameManager.screenSize.y * 0.5f - _targetStartScreenPos.y) / GameManager.screenSize.y;
        csCamOffset.x = GameManager.screenWidth * csCamOffset.x * GameManager.me.uiManager.uiPlay.gameCamera.rect.width;
        csCamOffset.y = GameManager.screenHeight * csCamOffset.y * GameManager.me.uiManager.uiPlay.gameCamera.rect.height;

        useEasing = false;

        _progressTime = 0.0f;
        _time         = duration;

        _startYpos = GameManager.me.uiManager.uiPlay.gameCameraPosContainer.localPosition.y;

        _endYpos = finalCamYpos;

        useYPosMove = (finalCamYpos != 0);

        _distTweeningValue = distanceTweeningValue;

        _endAngle = _startAngle + rotValue;

        if (string.IsNullOrEmpty(easingType) == false)
        {
            useEasing = true;
            string[] e = easingType.Split(',');
            easingStyle  = MiniTweenEasingType.getEasingType(e[1]);
            easingMethod = e[0];
        }
    }