public void BackToActor(float backTime) { m_curTargetType = ENCameraTargetType.enBackToActor; m_changeTime = backTime; m_startTime = Time.time; m_isChangeY = false; }
public void ChangeFollowTarget(Vector3 pos, float changeTime, float backTime, bool isChangeY, float autoBackTime = 0) { m_curTargetType = ENCameraTargetType.enPostion; m_targetPos = pos; m_changeTime = changeTime; m_backTime = backTime; m_isChangeY = isChangeY; m_autoBackTime = autoBackTime; m_startTime = Time.time; }
public void ChangeFollowTarget(GameObject obj, float changeTime, float backTime, bool isChangeY, float autoBackTime = 0) { if (obj == null || !obj.activeSelf) { return; } m_curTargetType = ENCameraTargetType.enGameObject; m_targetObj = obj; m_changeTime = changeTime; m_backTime = backTime; m_isChangeY = isChangeY; m_autoBackTime = autoBackTime; m_startTime = Time.time; }
public void MoveAtOnce(Actor target) { m_targetActor = target; m_curTargetType = ENCameraTargetType.enActor; Vector3 cameraPos = m_targetActor.MainObj.transform.position; cameraPos.y = 0.35f; MainCamera.transform.position = cameraPos; MainCamera.transform.Translate(Vector3.back * GameSettings.Singleton.CameraDistance); MainCamera.transform.rotation = Quaternion.Euler(GameSettings.Singleton.CameraRotate); m_lastCacheCameraPos = MainCamera.transform.position; xVelocity = 0; yVelocity = 0; zVelocity = 0; m_isChangeY = false; UpdateImpl(false); }
void UpdateImpl(bool damping) { //camera跟随目标的位置 Vector3 cameraPos = Vector3.zero; // float smoothTime = 0; switch (m_curTargetType) { case ENCameraTargetType.enActor: { if (m_targetActor == null) { return; } GameObject obj = m_targetActor.CenterPart; if (m_targetActor.ActionControl.IsActionEmpty() || m_targetActor.ActionControl.IsActionRunning(ActorAction.ENType.enStandAction) || m_targetActor.ActionControl.IsActionRunning(ActorAction.ENType.enActorEnterAction) || IsNormalAttack()) { obj = m_targetActor.MainObj; } cameraPos = null != obj ? obj.transform.position : Vector3.zero; if (!m_targetActor.IsDead) { //主控角色未死亡时,对准主控角色跟目标之间 Actor target = m_targetActor.CurrentTarget; if (target != null && !target.IsDead) { Vector3 selfPos = cameraPos; Vector3 targetPos = target.MainPos; selfPos.y = 0; targetPos.y = 0; cameraPos = selfPos + (targetPos - selfPos) * 0.5f; } } //计算smooth时间 smoothTime = GameSettings.Singleton.m_cameraSmoothTimeForStart; MoveAction action = m_targetActor.ActionControl.LookupAction(ActorAction.ENType.enMoveAction) as MoveAction; if (action != null && CursorEffectFunc.Singleton.CurFingerType != CursorEffectFunc.ENFingerType.enOnDragMoveType) { float d = ActorTargetManager.GetTargetDistance(m_targetActor.RealPos, action.m_realTargetPos); if (d < GameSettings.Singleton.m_cameraStopDistance) { smoothTime = GameSettings.Singleton.m_cameraSmoothTimeForStop; } } else if (m_lastCameraPos == cameraPos) { //目标停止运动 smoothTime = GameSettings.Singleton.m_cameraSmoothTimeForStop; } float velocity = 0; m_currentSmoothTime = Mathf.SmoothDamp(m_currentSmoothTime, smoothTime, ref velocity, GameSettings.Singleton.m_timeForCameraChangeTime); } break; case ENCameraTargetType.enGameObject: { cameraPos = m_targetObj.transform.position; smoothTime = m_changeTime; if (m_autoBackTime != 0) { if (Time.time - m_startTime > m_autoBackTime) { m_changeTime = m_backTime; m_startTime = Time.time; m_curTargetType = ENCameraTargetType.enBackToActor; } } m_currentSmoothTime = smoothTime; } break; case ENCameraTargetType.enPostion: { cameraPos = m_targetPos; smoothTime = m_changeTime; if (m_autoBackTime != 0) { if (Time.time - m_startTime > m_autoBackTime) { m_changeTime = m_backTime; m_startTime = Time.time; m_curTargetType = ENCameraTargetType.enBackToActor; } } m_currentSmoothTime = smoothTime; } break; case ENCameraTargetType.enBackToActor: { GameObject obj = m_targetActor.CenterPart; if (m_targetActor.ActionControl.IsActionEmpty() || m_targetActor.ActionControl.IsActionRunning(ActorAction.ENType.enStandAction) || m_targetActor.ActionControl.IsActionRunning(ActorAction.ENType.enActorEnterAction) || IsNormalAttack()) { obj = m_targetActor.MainObj; } cameraPos = null != obj ? obj.transform.position : Vector3.zero; if (!m_targetActor.IsDead) { //主控角色未死亡时,对准主控角色跟目标之间 Actor target = m_targetActor.CurrentTarget; if (target != null && !target.IsDead) { Vector3 selfPos = cameraPos; Vector3 targetPos = target.MainPos; selfPos.y = 0; targetPos.y = 0; cameraPos = selfPos + (targetPos - selfPos) * 0.5f; } } smoothTime = m_changeTime; if (Time.time - m_startTime > m_changeTime) { m_curTargetType = ENCameraTargetType.enActor; } m_currentSmoothTime = smoothTime; } break; default: { m_curTargetType = ENCameraTargetType.enActor; UpdateImpl(damping); return; } // break; } m_lastCameraPos = cameraPos; if (!m_isChangeY) { cameraPos.y = 0.35f; } //拉远 MainCamera.transform.position = cameraPos; MainCamera.transform.Translate(Vector3.back * GameSettings.Singleton.CameraDistance); MainCamera.transform.rotation = Quaternion.Euler(GameSettings.Singleton.CameraRotate); cameraPos = MainCamera.transform.position; //damp if (damping) { float x = Mathf.SmoothDamp(m_lastCacheCameraPos.x, cameraPos.x, ref xVelocity, m_currentSmoothTime, GameSettings.Singleton.m_smoothMaxSpeed); float y = Mathf.SmoothDamp(m_lastCacheCameraPos.y, cameraPos.y, ref yVelocity, m_currentSmoothTime, GameSettings.Singleton.m_smoothMaxSpeed); float z = Mathf.SmoothDamp(m_lastCacheCameraPos.z, cameraPos.z, ref zVelocity, m_currentSmoothTime, GameSettings.Singleton.m_smoothMaxSpeed); cameraPos = new Vector3(x, y, z); } Vector3 pos = CheckFloat(m_shakeObj.transform.localPosition); //shake cameraPos += pos; MainCamera.transform.position = cameraPos; m_lastCacheCameraPos = cameraPos; }