Unity开发笔记之震屏效果实现
发表于2017-08-06
RPG或者动作游戏最重要的就是打击感,好的打击效果可以给游戏增色不少,而一种最方便最简单的提升打击感的效果就是震屏效果,短短几十行代码就可以让我们的游戏效果提升不少,本篇文章就会给大家介绍开发中的震屏效果实现,一起来看看吧。
简单来说,震屏效果就是让我们的摄像机在运行时在正常的位置下随机朝各个方向偏移,直到震动结束。经过本人测试,发现如果可以将振幅逐渐减小,可以达到更好的视觉效果。话不多说,看一下代码:
// 相机震动效果 using UnityEngine; public class CameraShakeEffect : MonoBehaviour { /// /// 相机震动方向 /// public Vector3 shakeDir = Vector3.one; /// /// 相机震动时间 /// 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(); } }
可以将脚本直接拖给Camera组件,我们通过该组件的enable来进行测试。勾选CmeraShakeEffect前面的Enable方框,我们就可以看到一次相机震动了。
相机震动效果有两个参数,一个是震动的方向,是一个Vector类型,另一个是震动的时间。
不过要注意一点的是,这个震动效果是单独的一个,没有和真正的相机控制脚本写在一起,虽然比较直观,耦合性很低,但是有一个问题在于,一般的相机控制脚本,摄像机的更新时间也是在LateUpdate中,而脚本的执行顺序是不一定的,如果我们的震动脚本在真正的相机控制脚本执行之前执行了,是不会产生效果的,所以为了让我们的脚本在摄像机控制脚本执行,我们可以修改一下相机震动脚本的执行顺序,通过Projcet Setting->Script Execution Order来控制执行顺序,默认是0,我们让摄像机震动的脚本执行顺序权值大一些,保证在正常的相机控制脚本之前,就可以保证我们的震动效果生效。