예제 #1
0
        public override void ProcessFrame(Playable playable, FrameData info, object playerData)
        {
            base.ProcessFrame(playable, info, playerData);

            // Get the brain that this track controls.
            // Older versions of timeline sent the gameObject by mistake.
            GameObject go = playerData as GameObject;

            if (go == null)
            {
                mBrain = (CinemachineBrain)playerData;
            }
            else
            {
                mBrain = go.GetComponent <CinemachineBrain>();
            }
            if (mBrain == null)
            {
                return;
            }

            // Find which clips are active.  We can process a maximum of 2.
            // In the case that the weights don't add up to 1, the outgoing weight
            // will be calculated as the inverse of the incoming weight.
            int activeInputs        = 0;
            ICinemachineCamera camA = null;
            ICinemachineCamera camB = null;
            float camWeightB        = 1f;

            for (int i = 0; i < playable.GetInputCount(); ++i)
            {
                CinemachineShotPlayable shot
                    = ((ScriptPlayable <CinemachineShotPlayable>)playable.GetInput(i)).GetBehaviour();
                float weight = playable.GetInputWeight(i);
                if (shot != null && shot.IsValid &&
                    playable.GetPlayState() == PlayState.Playing &&
                    weight > 0.0001f)
                {
                    if (shot.VirtualCamera != null)
                    {
                        camA       = camB;
                        camWeightB = weight;
                        camB       = shot.VirtualCamera;
                    }
                    if (++activeInputs == 2)
                    {
                        break;
                    }
                }
            }

            // Override the Cinemachine brain with our results
            mBrainOverrideId = mBrain.SetCameraOverride(
                mBrainOverrideId, camA, camB, camWeightB, GetDeltaTime(info.deltaTime));
        }
예제 #2
0
    public override void ProcessFrame(Playable playable, FrameData info, object playerData)
    {
        base.ProcessFrame(playable, info, playerData);

        // Get the brain that this track controls.
        // Older versions of timeline sent the gameObject by mistake.
        GameObject go = playerData as GameObject;

        if (go == null)
        {
            mBrain = (CinemachineBrain)playerData;
        }
        else
        {
            mBrain = go.GetComponent <CinemachineBrain>();
        }
        if (mBrain == null)
        {
            return;
        }

        // Find which clips are active.  We can process a maximum of 2.
        // In the case that the weights don't add up to 1, the outgoing weight
        // will be calculated as the inverse of the incoming weight.
        int      activeInputs = 0;
        ClipInfo clipA        = new ClipInfo();
        ClipInfo clipB        = new ClipInfo();

        for (int i = 0; i < playable.GetInputCount(); ++i)
        {
            float weight = playable.GetInputWeight(i);
            var   clip   = (ScriptPlayable <CinemachineShotPlayable>)playable.GetInput(i);
            CinemachineShotPlayable shot = clip.GetBehaviour();
            if (shot != null && shot.IsValid &&
                playable.GetPlayState() == PlayState.Playing &&
                weight > 0)
            {
                clipA           = clipB;
                clipB.vcam      = shot.VirtualCamera;
                clipB.weight    = weight;
                clipB.localTime = clip.GetTime();
                clipB.duration  = clip.GetDuration();
                if (++activeInputs == 2)
                {
                    break;
                }
            }
        }

        // Figure out which clip is incoming
        bool incomingIsB = clipB.weight >= 1 || clipB.localTime < clipB.duration / 2;

        if (activeInputs == 2)
        {
            if (clipB.localTime < clipA.localTime)
            {
                incomingIsB = true;
            }
            else if (clipB.localTime > clipA.localTime)
            {
                incomingIsB = false;
            }
            else
            {
                incomingIsB = clipB.duration >= clipA.duration;
            }
        }

        // Override the Cinemachine brain with our results
        ICinemachineCamera camA = incomingIsB ? clipA.vcam : clipB.vcam;
        ICinemachineCamera camB = incomingIsB ? clipB.vcam : clipA.vcam;
        float camWeightB        = incomingIsB ? clipB.weight : 1 - clipB.weight;

        mBrainOverrideId = mBrain.SetCameraOverride(
            mBrainOverrideId, camA, camB, camWeightB, GetDeltaTime(info.deltaTime));
    }
    public override void ProcessFrame(Playable playable, FrameData info, object playerData)
    {
        base.ProcessFrame(playable, info, playerData);

        // Get the brain that this track controls.
        // Older versions of timeline sent the gameObject by mistake.
        GameObject go = playerData as GameObject;

        if (go == null)
        {
            mBrain = (CinemachineBrain)playerData;
        }
        else
        {
            mBrain = go.GetComponent <CinemachineBrain>();
        }
        if (mBrain == null)
        {
            return;
        }

        // Find which clips are active.  We can process a maximum of 2.
        // In the case that the weights don't add up to 1, the outgoing weight
        // will be calculated as the inverse of the incoming weight.
        int   activeInputs = 0;
        int   clipIndexA   = -1;
        int   clipIndexB   = -1;
        bool  incomingIsA  = false;   // Assume that incoming clip is clip B
        float weightB      = 1;

        for (int i = 0; i < playable.GetInputCount(); ++i)
        {
            float weight = playable.GetInputWeight(i);
            var   clip   = (ScriptPlayable <CinemachineShotPlayable>)playable.GetInput(i);
            CinemachineShotPlayable shot = clip.GetBehaviour();
            if (shot != null && shot.IsValid &&
                playable.GetPlayState() == PlayState.Playing &&
                weight > 0)
            {
                clipIndexA = clipIndexB;
                clipIndexB = i;
                weightB    = weight;
                if (++activeInputs == 2)
                {
                    // Deduce which clip is incoming (timeline doesn't know)
                    var clipA = playable.GetInput(clipIndexA);
                    // Incoming has later start time (therefore earlier current time)
                    incomingIsA = clip.GetTime() >= clipA.GetTime();
                    // If same start time, longer clip is incoming
                    if (clip.GetTime() == clipA.GetTime())
                    {
                        incomingIsA = clip.GetDuration() < clipA.GetDuration();
                    }
                    break;
                }
            }
        }

        // Special case: check for only one clip that's fading out - it must be outgoing
        if (activeInputs == 1 && weightB < 1 &&
            playable.GetInput(clipIndexB).GetTime() > playable.GetInput(clipIndexB).GetDuration() / 2)
        {
            incomingIsA = true;
        }
        if (incomingIsA)
        {
            (clipIndexA, clipIndexB) = (clipIndexB, clipIndexA);
            weightB = 1 - weightB;
        }

        ICinemachineCamera camA = null;

        if (clipIndexA >= 0)
        {
            CinemachineShotPlayable shot
                 = ((ScriptPlayable <CinemachineShotPlayable>)playable.GetInput(clipIndexA)).GetBehaviour();
            camA = shot.VirtualCamera;
        }

        ICinemachineCamera camB = null;

        if (clipIndexB >= 0)
        {
            CinemachineShotPlayable shot
                 = ((ScriptPlayable <CinemachineShotPlayable>)playable.GetInput(clipIndexB)).GetBehaviour();
            camB = shot.VirtualCamera;
        }

        // Override the Cinemachine brain with our results
        mBrainOverrideId = mBrain.SetCameraOverride(
            mBrainOverrideId, camA, camB, weightB, GetDeltaTime(info.deltaTime));

#if UNITY_EDITOR && UNITY_2019_2_OR_NEWER
        if (m_ScrubbingCacheHelper != null && TargetPositionCache.CacheMode != TargetPositionCache.Mode.Disabled)
        {
            bool isNewB = (m_ScrubbingCacheHelper.ActivePlayableA != clipIndexB &&
                           m_ScrubbingCacheHelper.ActivePlayableB != clipIndexB);

            m_ScrubbingCacheHelper.ActivePlayableA = clipIndexA;
            m_ScrubbingCacheHelper.ActivePlayableB = clipIndexB;
            if (clipIndexA >= 0)
            {
                m_ScrubbingCacheHelper.ScrubToHere(
                    (float)GetMasterPlayableDirector().time, clipIndexA, false,
                    (float)playable.GetInput(clipIndexA).GetTime(), mBrain.DefaultWorldUp);
            }
            if (clipIndexB >= 0)
            {
                m_ScrubbingCacheHelper.ScrubToHere(
                    (float)GetMasterPlayableDirector().time, clipIndexB, isNewB && weightB > 0.99f,
                    (float)playable.GetInput(clipIndexB).GetTime(), mBrain.DefaultWorldUp);
            }
        }
#endif
    }