Cinemachine代码中自定义抖动事件

抖动事件监听脚本

using UnityEngine;

namespace Cinemachine
{
    /// <summary>
    /// 此脚本是复制CinemachineIndependentImpulseListener脚本,因为我们不想创建抖动频道文件,所有复制一份,公开m_ChannelMask
    /// 此脚本挂载到摄像机上,针对于在代码中自定义抖动事件
    /// </summary>
    public class FixedCinemachineImpulseListener : MonoBehaviour
    {
        private Vector3 impulsePosLastFrame;
        private Quaternion impulseRotLastFrame;
        
        /// <summary>
        /// 此脚本监听的抖动频道
        /// </summary>
        public int m_ChannelMask = 1;

        /// <summary>
        /// Gain to apply to the Impulse signal.
        /// </summary>
        public float m_Gain = 1;

        /// <summary>
        /// Enable this to perform distance calculation in 2D (ignore Z).
        /// </summary>
        public bool m_Use2DDistance = false;


        private void OnEnable()
        {
            impulsePosLastFrame = Vector3.zero;
            impulseRotLastFrame = Quaternion.identity;
        }

        private void Update()
        {
            // Unapply previous shake
            transform.position -= impulsePosLastFrame;
            transform.rotation = transform.rotation * Quaternion.Inverse(impulseRotLastFrame);
        }

        // We do this in LateUpdate specifically to support attaching this script to the
        // Camera with the CinemachineBrain.  Script execution order is after the brain.
        private void LateUpdate()
        {
            // Apply the shake
            if (CinemachineImpulseManager.Instance.GetImpulseAt(
                transform.position, m_Use2DDistance, m_ChannelMask, 
                out impulsePosLastFrame, out impulseRotLastFrame))
            {
                impulsePosLastFrame *= m_Gain;
                impulseRotLastFrame = Quaternion.SlerpUnclamped(
                    Quaternion.identity, impulseRotLastFrame, -m_Gain);
                transform.position += impulsePosLastFrame;
                transform.rotation = transform.rotation * impulseRotLastFrame;
            }
        }
    }
}

发出抖动事件

using Cinemachine;
using System.Collections.Generic;
using UnityEngine;

public class ImpulseScriptEditor : MonoBehaviour
{

    public bool OnPlay = false;
    private bool m_play = false;


    private void Start()
    {

    }

    private void Update()
    {
        if (m_play != OnPlay)
        {
            m_play = OnPlay;
            if (OnPlay)
            {

                Debug.Log("执行一次");

                AddImpulseEvent();

            }
        }
    }

    private void AddImpulseEvent()
    {
        NoiseSettings noiseSettings = GetNoiseSettings();
        CinemachineImpulseManager.ImpulseEvent e = CinemachineImpulseManager.Instance.NewImpulseEvent();
        e.m_Envelope = new CinemachineImpulseManager.EnvelopeDefinition();

        e.m_Envelope.m_SustainTime = 3;
        e.m_Envelope.m_ScaleWithImpact = true;
        if (e.m_Envelope.m_ScaleWithImpact)
        {
            e.m_Envelope.m_DecayTime *= Mathf.Sqrt(Vector3.down.magnitude) * 0.7f;
        }
        else
        {
            e.m_Envelope.m_DecayTime = 0.7f;
        }
        e.m_SignalSource = noiseSettings;
        e.m_Position = transform.position;//震动中心点
        e.m_Radius = 100;//具有完整信号值的信号原点周围的半径。距离耗散在该距离之后开始
        e.m_Channel = 99;
        e.m_DirectionMode = CinemachineImpulseManager.ImpulseEvent.DirectionMode.Fixed;
        e.m_DissipationMode = CinemachineImpulseManager.ImpulseEvent.DissipationMode.ExponentialDecay;
        e.m_DissipationDistance = 1000;
        e.m_PropagationSpeed = 340;
        CinemachineImpulseManager.Instance.AddImpulseEvent(e);
    }
    private NoiseSettings GetNoiseSettings()
    {
        NoiseSettings noiseSettings = new NoiseSettings();

        List<NoiseSettings.TransformNoiseParams> positionNoises = new List<NoiseSettings.TransformNoiseParams>();
        NoiseSettings.TransformNoiseParams positionNoise = new NoiseSettings.TransformNoiseParams();
        positionNoise.X.Frequency = 2;
        positionNoise.X.Amplitude = 1;
        positionNoise.X.Constant = false;
        positionNoise.Y.Frequency = 2;
        positionNoise.Y.Amplitude = 1;
        positionNoise.Y.Constant = false;
        positionNoise.Z.Frequency = 2;
        positionNoise.Z.Amplitude = 1;
        positionNoise.Z.Constant = false;

        positionNoises.Add(positionNoise);

        noiseSettings.PositionNoise = positionNoises.ToArray();

        List<NoiseSettings.TransformNoiseParams> orientationNoises = new List<NoiseSettings.TransformNoiseParams>();
        NoiseSettings.TransformNoiseParams orientationNoise = new NoiseSettings.TransformNoiseParams();
        orientationNoise.X.Frequency = 1;
        orientationNoise.X.Amplitude = 1;
        orientationNoise.X.Constant = false;
        orientationNoise.Y.Frequency = 1;
        orientationNoise.Y.Amplitude = 1;
        orientationNoise.Y.Constant = false;
        orientationNoise.Z.Frequency = 1;
        orientationNoise.Z.Amplitude = 1;
        orientationNoise.Z.Constant = false;

        orientationNoises.Add(orientationNoise);

        noiseSettings.OrientationNoise = orientationNoises.ToArray();

        return noiseSettings;
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容