:wordpress网站如何播放自己的视频,wordpress类目权限,昆明移动网站建设,权威的合肥网站建设文章目录 每篇一句前言安装虚拟相机虚拟相机震动测试代码控制震动清除震动控制震动的幅度和时间 两个不同的强弱震动同时发生源码完结 每篇一句
围在城里的人想逃出来#xff0c;站在城外的人想冲进去#xff0c;婚姻也罢#xff0c;事业也罢#xff0c;人生的欲望大都如此… 文章目录 每篇一句前言安装虚拟相机虚拟相机震动测试代码控制震动清除震动控制震动的幅度和时间 两个不同的强弱震动同时发生源码完结 每篇一句
围在城里的人想逃出来站在城外的人想冲进去婚姻也罢事业也罢人生的欲望大都如此。——钱钟书《围城》
前言
相机的抖动我相信大家都不陌生网上其实已经有非常非常多的教程了之前我也写过一篇文章感兴趣的可以先去看看 unity实现简单的摄像机震动效果包括普通摄像机和虚拟摄像机
但有时我们可能需要两个震动同时发生例如如果我们开启了大门并且又收到伤害我们希望两个震动结合在一起
我在这里的规则是更强的震动被优先考虑但我们不要停止弱震动的进展而是一起工作 一旦完成了强震动弱震动就会继续
最终效果
安装虚拟相机
实现相机抖动的最简单方法是使用cinemachine虚拟相机 导入cinemachine插件 搜索Cinemachine,安装并导入
新建虚拟相机
虚拟相机震动测试
这里body和Aim都不需要就选择Do nothing
选择Noise ,选择 Basic Multi Channel Perlin Noise Profile 选择自己喜欢的震动模式(可以挨个自己测试)这里我选择6D Wobble AmplitudeGain FrequencyGain表示震动的频率
代码控制震动
新增代码控制
using System.Collections.Generic;
using System.Linq;
using Cinemachine;
using UnityEngine;public class CameraShaker : MonoBehaviour
{private readonly ListShakeRequest _requests new ListShakeRequest(); // 用于存储震动请求的列表private CinemachineBasicMultiChannelPerlin _noise; // CinemachineBasicMultiChannelPerlin组件用于控制相机震动效果private void Awake(){// 获取CinemachineBasicMultiChannelPerlin组件_noise GetComponentCinemachineVirtualCamera().GetCinemachineComponentCinemachineBasicMultiChannelPerlin();}private void Update(){if (_requests.Count 0){_noise.m_AmplitudeGain 0; // 如果没有震动请求将AmplitudeGain设置为0停止震动效果return;}var strongestShake _requests.Max(shake shake.ShakeAmount); // 获取最强烈的震动请求_noise.m_AmplitudeGain strongestShake; // 将AmplitudeGain设置为最强烈的震动请求的幅度}// 请求相机震动使用默认的持续时间0public void RequestShake(float amount){RequestShake(amount, 0);}// 请求相机震动指定震动的幅度和持续时间public void RequestShake(float amount, float time){_requests.Add(new ShakeRequest // 向列表中添加一个新的ShakeRequest{ShakeAmount amount, // 震动的幅度ShakeTime time // 震动的持续时间});}// 震动请求类用于存储一个震动请求的幅度和持续时间private class ShakeRequest{public float ShakeAmount { get; set; } // 请求的震动幅度public float ShakeTime { get; set; } // 请求的震动持续时间}
}挂载点击事件配置参数b的振幅比a大 效果大的震动会替换小的震动效果而且无限震动
清除震动
都按预期工作现在我们需要以某种方式 基本上清除震动以摆脱 那些不应该再存在的震动 修改脚本
[SerializeField]
private float _shakeDecreaseAmount 10f;// 震动幅度减少的速率每秒减少的幅度private void Update()
{//。。。// 遍历所有的震动请求for (var i _requests.Count - 1; i 0; i--){var request _requests[i];// 减少震动请求的持续时间request.ShakeTime - Time.deltaTime;// 如果震动请求的持续时间小于等于0开始减少震动幅度if (request.ShakeTime 0){request.ShakeAmount Mathf.Max(0, request.ShakeAmount - Time.deltaTime * _shakeDecreaseAmount);}// 如果震动幅度已经减少到0从列表中移除该震动请求if (request.ShakeAmount 0) _requests.Remove(request);}
}效果震动一会消失
控制震动的幅度和时间
新增脚本CameraShakeRequester控制震动的幅度和时间
using UnityEngine;public class CameraShakeRequester : MonoBehaviour
{[SerializeField]private float _shakeAmount; // 请求震动的幅度[SerializeField]private float _shakeTime; // 请求震动的持续时间[SerializeField]private CameraShaker _shaker; // CameraShaker组件用于控制相机震动效果// 请求相机震动public void RequestShake(){_shaker.RequestShake(_shakeAmount, _shakeTime);}
}挂载脚本配置参数并重新修改配置A、B按钮的点击事件 效果
两个不同的强弱震动同时发生
我们A的震动调成振幅为1持续5秒 B的震动调成振幅为10持续1秒 运行效果你会发现当强弱震动同时产生时强震动先覆盖弱震动强震动完成后再继续执行剩下时间的弱震动它们能够很好地协同工作
源码
https://gitcode.net/unity1/unity-shake
完结
赠人玫瑰手有余香如果文章内容对你有所帮助请不要吝啬你的点赞评论和关注以便我第一时间收到反馈你的每一次支持都是我不断创作的最大动力。点赞越多更新越快哦当然如果你发现了文章中存在错误或者有更好的解决方法也欢迎评论私信告诉我哦
好了我是向宇https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者出于兴趣爱好于是最近才开始自习unity。如果你遇到任何问题也欢迎你评论私信找我 虽然有些问题我可能也不一定会但是我会查阅各方资料争取给出最好的建议希望可以帮助更多想学编程的人共勉~