Unity3D游戏 震屏效果

2017年03月15日 17:17 1 点赞 0 评论 更新于 2025-11-21 21:15
Unity3D游戏 震屏效果

前言

在进行游戏战斗场景开发时,为了增强玩家的临场感,我们常常会在爆炸或撞击等场景中加入震屏效果。其原理较为简单,主要是对场景主相机的坐标和角度进行变化。

设计思路

在开始编写代码之前,我们需要梳理一下大致的实现思路。主要涉及两个关键参数:震动幅度和震动时间。震动幅度主要涉及 Transform 的各项参数,通常情况下,我们只改变 localPositionlocalRotation,必要时也可以对 localScale 进行操作。若无需规则震动,可通过在振幅范围内取随机数的方法来实现。

代码实现

1. 创建类并实现带参数构造方法

/// <summary>
/// 创建振动器
/// </summary>
/// <param name="timer">震动时间</param>
/// <param name="force">震动幅度</param>
/// <param name="delay">延迟多久震动</param>
public CameraShaker(float timer, float force, float delay = 0)
{
Timer = timer;
Force = force;
delayTime = delay;
Reset();
}

Reset() 方法用于恢复一些状态和数据信息,这样通过 CameraShaker 类创建的单个振动器就可以反复使用。

2. 获取相机的起始位置

为了在震动结束后能够恢复相机的初始状态,我们需要记录相机的起始位置和旋转信息。

m_initialPosition = Camera.main.transform.position;
m_initialRotation = Camera.main.transform.localRotation;

3. 相机震动操作

这里我们通过 while 循环来实现相机的震动效果。当然,在 MonoBehavior 中也可以在 Update 方法中实现相同的操作。为了更好地封装代码,我们将这部分逻辑从 MonoBehavior 的特性中抽离出来。

while (duration > 0)
{
Transform objectToMove = Camera.main.transform;
Vector3 newOffset = new Vector3(UnityEngine.Random.Range(-Force, Force), UnityEngine.Random.Range(-Force, Force), 0);
float newRotationOffset = UnityEngine.Random.Range(-RotationAngle, RotationAngle);
objectToMove.position = objectToMove.position - m_oldOffset + newOffset;
objectToMove.Rotate(0, 0, -m_oldRotationOffset);
objectToMove.Rotate(0, 0, newRotationOffset);
m_oldOffset = newOffset;
m_oldRotationOffset = newRotationOffset;
duration -= Time.deltaTime;
}

在上述代码中,duration 表示震动时长,Force 表示震动的幅度。

4. 震动结束后恢复相机参数

当震动结束后,我们需要将相机的位置和旋转信息恢复到初始状态。

Camera.main.transform.position = m_initialPosition;
Camera.main.transform.localRotation = m_initialRotation;

通过以上步骤,我们就可以在 Unity3D 游戏中实现简单的震屏效果。

作者信息

孟子菇凉

孟子菇凉

共发布了 3994 篇文章