RPG或者动作游戏最重要的就是打击感,好的打击效果可以给游戏增色不少,而一种最方便最简单的提升打击感的效果就是震屏效果,短短几十行代码就可以让我们的游戏效果提升不少。
那么在我们进行游戏战斗场景开发时,常常为了加强临场感,会在有爆炸或者撞击的时候加入震屏的效果,原理其实很简单,就是对场景主相机进行坐标和角度的变化。
话不多说,看一下代码:
// 相机震动效果
using UnityEngine;
public class CameraShakeEffect : MonoBehaviour
{
/// <summary>
/// 相机震动方向
/// </summary>
public Vector3 shakeDir = Vector3.one;
/// <summary>
/// 相机震动时间
/// </summary>
public float shakeTime = 1.0f;
private float currentTime = 0.0f;
private float totalTime = 0.0f;
public void Trigger()
{
totalTime = shakeTime;
currentTime = shakeTime;
}
public void Stop()
{
currentTime = 0.0f;
totalTime = 0.0f;
}
public void UpdateShake()
{
if (currentTime > 0.0f && totalTime > 0.0f)
{
float percent = currentTime / totalTime;
Vector3 shakePos = Vector3.zero;
shakePos.x = UnityEngine.Random.Range(-Mathf.Abs(shakeDir.x) * percent, Mathf.Abs(shakeDir.x) * percent);
shakePos.y = UnityEngine.Random.Range(-Mathf.Abs(shakeDir.y) * percent, Mathf.Abs(shakeDir.y) * percent);
shakePos.z = UnityEngine.Random.Range(-Mathf.Abs(shakeDir.z) * percent, Mathf.Abs(shakeDir.z) * percent);
Camera.main.transform.position += shakePos;
currentTime -= Time.deltaTime;
}
else
{
currentTime = 0.0f;
totalTime = 0.0f;
}
}
void LateUpdate()
{
UpdateShake();
}
void OnEnable()
{
Trigger();
}
}
接下来咱们看一下设计思路:
1.创建类,带参数构造方法:
2.获得相机的起始位置,方便震动结束之后恢复相机状态:
3.相机震动操作:
这里我直接通过while循环来实现了,当然在MonoBehavior中也可以在Update方法中实现这样的操作,这里为了封装,所以抽离了一些MonoBehavior的特性。
4.震动结束后恢复相机参数: