动态修改Cinemachine属性
var cinemachineBasicMultiChannelPerlin = vCam.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>(); var cinemachineComponentBase = cinemachineVirtualCamera.GetCinemachineComponent(CinemachineCore.Stage.Noise); var cinemachineBasicMultiChannelPerlin = (CinemachineBasicMultiChannelPerlin)cinemachineComponentBase; var cinemachineComponentBase = cinemachineVirtualCamera.GetCinemachineComponent(CinemachineCore.Stage.Body); //动态添加与移除虚拟相机组件:屏幕抖动 CinemachineBasicMultiChannelPerlin noise = cv.AddCinemachineComponent<CinemachineBasicMultiChannelPerlin>(); noise.m_NoiseProfile = noiseSettings; await UniTask.Delay(TimeSpan.FromSeconds(1), false); cv.DestroyCinemachineComponent<CinemachineBasicMultiChannelPerlin>();
屏幕抖动
插件自带的Noise资源:
可以创建Noise资源,自定义配置需要的抖动参数
internal class VirtualCameraScreenNoiser { /// <summary> /// 相机抖动:CinemachineBasicMultiChannelPerlin 方式 /// </summary> /// <param name="duration">时长</param> /// <param name="amplitude">幅度</param> /// <param name="frequency">频率</param> public async void CinemachineVirtualCameraShaking(CinemachineVirtualCamera vCam, float duration = 0.25f, float amplitude = 1f, float frequency = 1f) { var cinemachineBasicMultiChannelPerlin = vCam.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>(); if (cinemachineBasicMultiChannelPerlin != null) { cinemachineBasicMultiChannelPerlin.m_AmplitudeGain = amplitude; cinemachineBasicMultiChannelPerlin.m_FrequencyGain = frequency; //延时后复原 await UniTask.Delay(TimeSpan.FromSeconds(duration), false); StopCinemachineVirtualCameraShaking(vCam); } } /// <summary> /// 相机抖动复原:CinemachineBasicMultiChannelPerlin 方式 /// </summary> public void StopCinemachineVirtualCameraShaking(CinemachineVirtualCamera cvCam) { var cinemachineBasicMultiChannelPerlin = cvCam.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>(); if (cinemachineBasicMultiChannelPerlin != null) { cinemachineBasicMultiChannelPerlin.m_AmplitudeGain = 0f; cinemachineBasicMultiChannelPerlin.m_FrequencyGain = 0f; } } /// <summary> /// 相机抖动:设置 Noise 方式 /// #1.异步实现一定延时后自动停止 /// </summary> /// <param name="cvCam"></param> /// <param name="noiseSettingsAssetPath"></param> /// <param name="duration"></param> public void SetCinemachineVirtualCameraNoise(CinemachineVirtualCamera cvCam, string noiseSettingsAssetPath, float duration = 1f) { if (cvCam != null) { var noise = cvCam.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>(); AssetLoader.LoadAsync(noiseSettingsAssetPath, async p => { if (p.MainAsset is NoiseSettings obj) { if (noise.m_NoiseProfile != null) { GameObject.Destroy(noise.m_NoiseProfile); } noise.m_NoiseProfile = (NoiseSettings)p.Instantiate(); await UniTask.Delay(TimeSpan.FromSeconds(duration)); cvCam.DestroyCinemachineComponent<CinemachineBasicMultiChannelPerlin>(); } }); } } /// <summary> /// 相机抖动:设置 Noise 方式 /// #1.加载虚拟相机的 NoiseSettings 配置文件,来设置抖动参数 /// </summary> /// <param name="path"></param> public void SetCinemachineVirtualCameraNoise(CinemachineVirtualCamera cvCam, string path) { var cinemachineVirtualCamera = cvCam; if (cinemachineVirtualCamera != null) { var cinemachineComponentBase = cinemachineVirtualCamera.GetCinemachineComponent(CinemachineCore.Stage.Noise); var cinemachineBasicMultiChannelPerlin = (CinemachineBasicMultiChannelPerlin)cinemachineComponentBase; if (cinemachineBasicMultiChannelPerlin != null) { AssetLoader.LoadAsync(path, p => { if (p.MainAsset is NoiseSettings obj) { if (cinemachineBasicMultiChannelPerlin.m_NoiseProfile != null) { GameObject.Destroy(cinemachineBasicMultiChannelPerlin.m_NoiseProfile); } cinemachineBasicMultiChannelPerlin.m_NoiseProfile = (NoiseSettings)p.Instantiate(); } }); } } } /// <summary> /// 相机抖动复原:设置 Noise 方式 /// </summary> public void CinemachineVirtualCameraRevertNoise(CinemachineVirtualCamera cvCam) { var cinemachineVirtualCamera = cvCam; if (cinemachineVirtualCamera != null) { var cinemachineComponentBase = cinemachineVirtualCamera.GetCinemachineComponent(CinemachineCore.Stage.Noise); var cinemachineBasicMultiChannelPerlin = (CinemachineBasicMultiChannelPerlin)cinemachineComponentBase; if (cinemachineBasicMultiChannelPerlin.m_NoiseProfile != null) { GameObject.Destroy(cinemachineBasicMultiChannelPerlin.m_NoiseProfile); } cinemachineBasicMultiChannelPerlin.m_NoiseProfile = null; } } /// <summary> /// 相机抖动:CinemachineImpulseSource方式 /// </summary> /// <param name="impulseSource">震动冲量源</param> /// <param name="frequencyGain">震动频率</param> /// <param name="amplitudeGain">震动幅度</param> /// <param name="force">震动力度</param> public void CinemachineImpulseSourceShaking(CinemachineImpulseSource impulseSource, float frequencyGain = 1, float amplitudeGain = 1, Vector3 force = default) { if (impulseSource == null) { FLibrary.FDebug.LogWarning($"CinemachineImpulseSource is Null"); return; } impulseSource.m_ImpulseDefinition.m_AmplitudeGain = amplitudeGain; impulseSource.m_ImpulseDefinition.m_FrequencyGain = frequencyGain; impulseSource.GenerateImpulse(force); } /// <summary> /// 相机抖动复原:CinemachineImpulseSource 方式 /// </summary> /// <param name="impulseSource">震动冲量源</param> /// <param name="frequencyGain">震动频率</param> /// <param name="amplitudeGain">震动幅度</param> /// <param name="force">震动力度</param> public void CinemachineImpulseSourceShakingRevert(CinemachineImpulseSource impulseSource, float frequencyGain = 1, float amplitudeGain = 1, Vector3 force = default) { if (impulseSource == null) { FLibrary.FDebug.LogWarning($"CinemachineImpulseSource is Null"); return; } impulseSource.m_ImpulseDefinition.m_AmplitudeGain = 0; impulseSource.m_ImpulseDefinition.m_FrequencyGain = 0; impulseSource.GenerateImpulse(Vector3.zero); } }
Reference:
【游戏开发教程】Unity Cinemachine快速上手,详细案例讲解(虚拟相机系统 | 新发出品 | 良心教程)_unity安装cinemachine csdn-CSDN博客