• Unity实现角色受到攻击后屏幕抖动的效果


    实现效果

    首先看一下实现效果。
    在这里插入图片描述

    摄像机

    我们要使用屏幕抖动,使用的是CinemachineVirtualCamera这个组件,这个组件需要在包管理器中进行导入。
    导入这个组件之后,创建一个Chinemachine-2D Camera,接下来我们修改ChinemachineVirtualCamera的Noise,将其设置为Basic Multi Channel Perlin,然后设置Noise Profile为6D Wobble,6D Wobble表示在摄像机位置和方向上的随机扰动。这种扰动会使摄像机在六个自由度上(三个位置坐标和三个旋转角度)产生随机的摇摆效果。也就是说,通过调整6D wobble的参数,我们可以在实现抖动效果的同时,还可以使摄像机在位置和方向上产生更自然的随机运动。这样可以增强场景的真实感和动态感。

    接下来,我们通过调整"6D wobble"的幅度和频率来控制摄像机的抖动效果。较大的幅度和频率值将会产生更明显的随机抖动。具体可以根据你的游戏需求来调整这些参数,以达到目标效果。

    然后将Amplitude Gain和Frequency Gain属性设置为0。Amplitude Gain参数表示摄像机震动的幅度增益。该参数控制着摄像机震动的强度。较大的Amplitude Gain值会产生更强烈的震动效果,而较小的值则会减弱震动效果。

    g

    抖动脚本

    创建一个脚本,命名为FollowCamera,然后修改内容为以下代码,挂载到CM vcam1物体上。
    在脚本中,我们通过修改震动强度和频率两个属性来实现振动,同时还设置了一个持续时间,通过在调用该函数传递不同参数,来实现不同的效果。当然我也写了默认值,方便了直接调用。

    using UnityEngine;
    using Cinemachine;
    
    public class FollowCamera : MonoBehaviour
    {
        private CinemachineVirtualCamera virtualCamera;
        private CinemachineBasicMultiChannelPerlin noiseProfile;
    
        private void Start()
        {
            virtualCamera = GetComponent<CinemachineVirtualCamera>();
            noiseProfile = virtualCamera.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>();
        }
        /// 
        /// 摄像机振动
        /// 
        /// 持续时间
        /// 幅度
        /// 频率
        public void ShakeCamera(float duration=0.25f, float amplitude=2, float frequency = 1)
        {
            if (noiseProfile != null)
            {
                noiseProfile.m_AmplitudeGain = amplitude;
                noiseProfile.m_FrequencyGain = frequency;
                Invoke(nameof(StopShaking), duration);
            }
        }
    
        private void StopShaking()
        {
            if (noiseProfile != null)
            {
                noiseProfile.m_AmplitudeGain = 0;
                noiseProfile.m_FrequencyGain = 0;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    玩家受伤

    修改你的玩家受伤部分的函数,使其调用follow Camera的ShakeCamera()方法。

    public class Player : Person
    {
        [Header("摄像机")]
        public FollowCamera followCamera;
        public override void Start()
        {
        	if(followCamera == null)
            {
                followCamera=GameObject.Find("CM vcam1").GetComponent<FollowCamera>();
            }
        }
    	public override void BeHit(float damage, Vector3 attacker)
    	{
    	    base.BeHit(damage, attacker);
    	    followCamera.ShakeCamera();
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    其他文章

    Unity实现2D游戏跟随摄像机(平滑移动)
    Unity2D实现左右移动的敌人角色
    Unity创建一个可移动的2D角色

  • 相关阅读:
    为什么说指针是 C 语言的精髓?
    金仓数据库 KingbaseGIS 使用手册(8.1. 支持栅格功能的数据类型)
    Android View的测量、布局、绘制
    java面试题(一年工作经验)的心得
    如何实现模拟量信号远距离无线传输?
    Oracle 11g_FusionOS_安装文档
    网络协议--概述
    Python 代码智能感知 —— 类型标注与特殊的注释(献给所有的Python人)
    Day 54 前端 jQuery
    Window Server 2016 FTP用户隔离和磁盘配额部署
  • 原文地址:https://blog.csdn.net/weixin_44499065/article/details/132962951