解决方法"/>
Unity屏幕晃动解决方法
在寒假实习中做消除游戏时需要实现一个效果:多行消除时有一个屏幕晃动的特效,其实这个没什么难的,看了一篇别人的博客,他就完全通过改变摄像机的范围来模拟场景中所有物体的移动,但是我发现并不适用于我这里,因为我是全部使用UGUI做的这个游戏,哈哈哈,那就很尴尬,不过他的思路给了我灵感,所以自己写了个UGUI进行晃动的代码:
如果要晃动屏幕就需要新建一个Panel把所有UI放置到其下,再把脚本挂给他,需要屏幕晃动的时候就调用Shake方法即可,如果仅仅是某个UGUI元素那么加给它即可
public class ShakePoint : MonoBehaviour
{//这里的目标点就是移动的目标位置:因为策划明确指出了数值public Transform[] targetPos;//最后要回到起始位置所以记录一下private Vector3 origionPos;//当前目标点索引private int currentIndex;//是否开启晃动public static bool isshake = false;//到目标点多远算到public float arriveDistance;[Range(0,1)]public float speed;void Start(){origionPos = transform.position;}// Update is called once per framevoid Update(){if (isshake){if (currentIndex >= targetPos.Length){isshake = false;currentIndex = 0;transform.position = origionPos;}else {Vector3 target = targetPos[currentIndex].position;transform.position = Vector3.Lerp(transform.position, target, speed);if (Vector3.Distance(target, transform.position) <= arriveDistance) {currentIndex++;}}}}public static void Shake(){isshake = true;}
}
当然只是指定目标位置的方式,只是出于要求才这么做,其实应该是随机的晃动,所以我们先看看上面说的别人做的就知道怎么随机才是最好的:
public class ShakeCamera : MonoBehaviour
{private float shakeTime;//晃动时间private float fps;//晃动频率private float frameTime;private float shakeDelta;//晃动幅度public Camera cam;public static bool isshakeCamera = false;void Start(){shakeTime = 1.0f;fps = 30.0f;shakeDelta = 0.005f;}// Update is called once per framevoid Update(){if (isshakeCamera){if (shakeTime > 0){shakeTime -= Time.deltaTime;if (shakeTime <= 0){cam.rect = new Rect(0.0f, 0.0f, 1.0f, 1.0f);isshakeCamera = false;shakeTime = 1.0f;fps = 20.0f;shakeDelta = 0.005f;}else{frameTime += Time.deltaTime;if (frameTime > 1.0 / fps){frameTime = 0;cam.rect = new Rect(shakeDelta * (-1.0f + 2.0f * Random.value), shakeDelta * (-1.0f + 2.0f * Random.value), 1.0f, 1.0f);}}}}}public static void shakeCamera(){isshakeCamera = true;}}
所以我们再为UGUI的晃动写一个随机的方式:
public class ShakeUI : MonoBehaviour
{public float shakeTime = 1.0f;//晃动时长public float fps = 30.0f;//晃动频率public float shakeValue = 10.0f;//振幅private float frameTime = 0f;private Vector3 origionPos;public static bool isshake = false;void Start(){origionPos = transform.position;}// Update is called once per framevoid Update(){if (isshake){if (shakeTime > 0){shakeTime -= Time.deltaTime;if (shakeTime <= 0){isshake = false;transform.position = origionPos;shakeTime = 1.0f;fps = 20.0f;frameTime = 0;}else{frameTime += Time.deltaTime;if (frameTime > 1.0 / fps){frameTime = 0;Vector3 target = new Vector3(Random.Range(-shakeValue, shakeValue), Random.Range(-shakeValue, shakeValue), 0) + transform.position;transform.position = Vector3.Lerp(transform.position, target, 0.5f);}}}}}public static void shakeCamera(){isshake = true;}
}
更多推荐
Unity屏幕晃动解决方法
发布评论