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)); } } }
// 리미트 거리가 있는 것. 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 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); }
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); }
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); }
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; }
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); } }
//기본공격거리내 적존재 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); }
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 ); } }
// 2번 자동선택 타겟팅 중 6~11번은 최대 타겟 거리를 계산해야한다. // 6~11번을 제외한 녀석들은 자동타겟이면 무조건 되는거다. bool ctAutoByTargetDistance(Monster attacker) { return(VectorUtil.DistanceXZ(attacker.skillTarget.cTransformPosition, attacker.cTransformPosition) <= _targetDistanceLimit); }
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]; } }