【Unity】基于Cinemachine的震屏效果(基础向)
月羽衔蝉
编辑于 2024年12月12日 02:22
收录于文集
共2篇

源码:

夸克:https://pan.quark.cn/s/268dc2e372bc

UC:https://drive.uc.cn/s/3fde23464ae04?public=1

百度:https://pan.baidu.com/s/186waYDWxVXxpBKVx-Vv0OA?pwd=vu5c

迅雷:https://pan.xunlei.com/s/VODplqW1IxiRpj9GVm6xjxs3A1?pwd=85ad#

蓝奏云:https://wwul.lanzoue.com/ivquJ1d2ztof

用应对的手机网盘APP收藏资源后再下载,可以更好的支持up主哟,创作不易,感谢支持~

网盘空间快满了,限时分享,建议尽快保存文件,防止资源被删除~

创建好Unity项目后,安装Cinemachine插件。

安装Cinemachine插件

创建虚拟相机Virtual Camera。(确保名字也是这个,如果不是就重命名为Virtual Camera,否则后面代码中会找不到这个对象。除非在代码中也同步修改名字,或通过单例模式查找到这个对象上的组件)

创建虚拟相机Virtual Camera

创建Capsule暂时代替角色,重命名为Player。

创建Capsule暂时代替角色,重命名为Player

创建C#脚本,命名为VirtualCamera。

创建C#脚本,命名为VirtualCamera

同样创建C#脚本,命名为PlayerController。

创建C#脚本,命名为PlayerController

双击打开VirtualCamera脚本,输入以下代码。

代码块
C#
自动换行
复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine;

public class VirtualCamera : MonoBehaviour
{
    private CinemachineVirtualCamera virtualCamera;
    private CinemachineBasicMultiChannelPerlin noiseProfile;

    void Start()
    {
        virtualCamera = GetComponent<CinemachineVirtualCamera>();
        noiseProfile = virtualCamera.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>();
    }

    /// <summary>
    /// 震屏
    /// </summary>
    /// <param name="duration">时长</param>
    /// <param name="amplitude">幅度</param>
    /// <param name="frequency">频率</param>
    public void CameraShake(float duration = 0.25f, float amplitude = 1f, float frequency = 1f)
    {
        if (noiseProfile != null)
        {
            noiseProfile.m_AmplitudeGain = amplitude;
            noiseProfile.m_FrequencyGain = frequency;
            Invoke(nameof(StopShaking), duration);
        }
    }

    /// <summary>
    /// 停止震屏
    /// </summary>
    private void StopShaking()
    {
        if (noiseProfile != null)
        {
            noiseProfile.m_AmplitudeGain = 0f;
            noiseProfile.m_FrequencyGain = 0f;
        }
    }
}
复制成功

双击打开PlayerController脚本,输入以下代码。

代码块
C#
自动换行
复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private VirtualCamera virtualCamera;

    void Start()
    {
        if (virtualCamera == null)
        {
            virtualCamera = GameObject.Find("Virtual Camera").GetComponent<VirtualCamera>();
        }
    }

    void LateUpdate()
    {
        if (Input.GetKeyDown(KeyCode.K))
        {
            CameraShake();
        }
    }

    public void CameraShake()
    {
        virtualCamera.CameraShake();
    }
}
复制成功

把VirtualCamera脚本挂载到Virtual Camera对象上。

把VirtualCamera脚本挂载到Virtual Camera对象上

把PlayerController脚本挂载到Player对象上。

把PlayerController脚本挂载到Player对象上

选中Virtual Camera对象,把Player对象拖拽到CinemachineVirtualCamera组件下的Follow和Look At中。

修改Noise为Basic Multi Channel Perlin;

修改Noise Profile为6D Shake或6D Wobble(震动效果更明显);

修改Amplitude Gain和Frequency Gain为0(若不为0,则运行后会一直震动)。

设置CinemachineVirtualCamera组件参数

运行项目,在Game窗口按下K键(英文输入法下)触发摄像机震动效果。

运行项目,在Game窗口按下K键(英文输入法下)触发摄像机震动效果

总结:基于Cinemachine的震屏效果,主要是通过CinemachineVirtualCamera组件下的Noise来实现的。原理是对相机添加噪波来控制摄像机抖动。

震屏效果可以显著提升游戏打击感,往往在角色受到重击,或射击游戏开枪时触发。案例中是通过按下K键触发的,实际项目中需修改触发逻辑到相关的方法中。

本案例只是提供一个实现简易震屏效果的方法,要实现更复杂的效果,需要根据实际项目进行修改,推荐参考官方文档,或其他专业文档进行学习。

祝各位开发顺利~