unity实现简单的摄像机震动效果(包括普通摄像机和虚拟摄像机)

普通摄像机震动效果

用代码实现摄像机简单的震动效果

using UnityEngine;
using System.Collections;

public class CameraShake : MonoBehaviour
{
    private bool shaking = false;  // 是否正在震动
    private Vector3 originalPosition;  // 相机的初始位置
    private float shakeDuration = 0.5f;  // 震动持续时间
    private float shakeAmount = 0.1f;  // 震动幅度

    void Update()
    {
        // 当按下空格键时,开始协程来执行震动效果
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Shake());
        }
    }

    IEnumerator Shake()
    {
        if (shaking == false)
        {
            originalPosition = transform.localPosition;  // 记录相机的初始位置
            shaking = true;  // 标记为正在震动

            float elapsed = 0.0f;

            // 在指定的时间内执行震动效果
            while (elapsed < shakeDuration)
            {
                transform.localPosition = originalPosition + Random.insideUnitSphere * shakeAmount;  // 让相机的位置随机变化一定的幅度

                elapsed += Time.deltaTime;  // 算出时间已经过了多少

                yield return null; // 暂停一帧
            }

            shaking = false;  // 标记为停止震动
            transform.localPosition = originalPosition;  // 恢复相机的初始位置
        }
    }
}

cinemachine虚拟摄像机实现震动效果

导入cinemachine插件
搜索Cinemachine,安装并导入
unity实现简单的摄像机震动效果(包括普通摄像机和虚拟摄像机)_第1张图片
添加虚拟相机,这里我是2d项目,所以加2D Camera摄像机
unity实现简单的摄像机震动效果(包括普通摄像机和虚拟摄像机)_第2张图片

第一种办法

一、控制Noise实现屏幕震动效果
选择Noise ,选择 Basic Multi Channel Perlin
Noise Profile 选择自己喜欢的震动模式(可以挨个自己测试)
重点是:
AmplitudeGain:表示震动的幅度,设置为0不会震动
FrequencyGain: 表示震动的频率
unity实现简单的摄像机震动效果(包括普通摄像机和虚拟摄像机)_第3张图片
接下来一个简单脚本控制震动,记得把AmplitudeGain先设置为0

using UnityEngine;
using Cinemachine;
using System.Collections;

public class ScreenShake : MonoBehaviour
{
    CinemachineVirtualCamera virtualCamera;
    CinemachineBasicMultiChannelPerlin noise;
    private float shakeDuration = 0.5f;  // 震动持续时间
    private bool shaking = false;  // 是否正在震动
    void Start()
    {
        virtualCamera = GetComponent<CinemachineVirtualCamera>();
        noise = virtualCamera.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>();
    }

    void Update()
    {
        // 当按下空格键时,开始协程来执行震动效果
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Shake());
        }
    }


    IEnumerator Shake()
    {
        if (shaking == false)
        {
            shaking = true;  // 标记为正在震动
            noise.m_AmplitudeGain = 1; //震动个数
            noise.m_FrequencyGain = 1; //震动幅度
            yield return new WaitForSeconds(shakeDuration);
            noise.m_AmplitudeGain = 0; //震动个数
            noise.m_FrequencyGain = 0; //震动幅度
            shaking = false;
        }
    }
}

第二种办法

二、通过使用CinemachineImpulseSource组件在Unity中实现屏幕震动效果,具体步骤如下:

给cinemachine 2D摄像机添加CinemachineVirtualCamera组件,这个组件能感受监听到震动,没有就新建一个
unity实现简单的摄像机震动效果(包括普通摄像机和虚拟摄像机)_第4张图片

unity实现简单的摄像机震动效果(包括普通摄像机和虚拟摄像机)_第5张图片

unity实现简单的摄像机震动效果(包括普通摄像机和虚拟摄像机)_第6张图片
给需要震动效果的对象添加组件Cinemachine Impulse Source,这个是震动效果文件

unity实现简单的摄像机震动效果(包括普通摄像机和虚拟摄像机)_第7张图片

设置“Default Velocity”值来定义震动的大小和方向。
unity实现简单的摄像机震动效果(包括普通摄像机和虚拟摄像机)_第8张图片

在代码中,你可以通过以下方式触发震动:

CinemachineImpulseSource cameraShaker = FindObjectOfType<CinemachineImpulseSource>();
cameraShaker.GenerateImpulse();

你可能感兴趣的:(#,unity小技巧,unity,游戏引擎)