Unity - Cinemachine

动态修改Cinemachine属性

bc73dbb25aa190ee7bc1ab6e29c5d019.png


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资源:

f77b7b9aa08b132f91d4aa5f2546e904.png

可以创建Noise资源,自定义配置需要的抖动参数

acad78a30e094cb8b50e047d79d2dfeb.png7fa15679f1fad063fd4b91234fdc20a4.png

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博客

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值