Exemple #1
0
 public void BackToActor(float backTime)
 {
     m_curTargetType = ENCameraTargetType.enBackToActor;
     m_changeTime    = backTime;
     m_startTime     = Time.time;
     m_isChangeY     = false;
 }
Exemple #2
0
 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;
 }
Exemple #3
0
 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;
 }
Exemple #4
0
    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);
    }
Exemple #5
0
    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;
    }