代码先锋网 代码片段及技术文章聚合

Unity实现震动效果,抖动,震屏等

技术标签: unity  Camera

上篇震屏博客说到的简单震屏效果,虽然可以实现,但是屏幕边界会给人一种扭曲感,振幅越大感觉越明显。所以本篇博客做出了大幅度更改,以正弦规律震动,效果更加自然,若实现震屏将此脚本挂载到相机上即可,可以设置震动幅度,震动角度,震动次数等,具体参数效果可以通过更改控制面板上的参数测试,也可用于其他物体的晃动,反复控制enabled=true,即可反复震动。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ShakeCamera : MonoBehaviour {


	public Vector3 positionShake;//震动幅度
	public Vector3 angleShake;   //震动角度
	public float cycleTime = 0.2f;//震动周期
	public int cycleCount = 6;    //震动次数
	public bool fixShake = false; //为真时每次幅度相同,反之则递减
	public bool unscaleTime = false;//不考虑缩放时间
	public bool bothDir = true;//双向震动
	public float fCycleCount = 0;//设置此参数,以此震动次数为主
	public bool autoDisable = true;//自动disbale
	

	float currentTime;
	int curCycle;
	Vector3 curPositonShake;
	Vector3 curAngleShake;
	float curFovShake;
	Vector3 startPosition;
	Vector3 startAngles;
	Transform myTransform;

	void OnEnable()
	{
		currentTime = 0f;
		curCycle = 0;
		curPositonShake = positionShake;
		curAngleShake = angleShake;
		myTransform = transform;
		startPosition = myTransform.localPosition;
		startAngles = myTransform.localEulerAngles;
		if (fCycleCount > 0)
			cycleCount = Mathf.RoundToInt(fCycleCount);
	}

	void OnDisable()
	{
		myTransform.localPosition = startPosition;
		myTransform.localEulerAngles = startAngles;
	}

	// Update is called once per frame
	void Update () {

		#if UNITY_EDITOR
		if (fCycleCount > 0)
			cycleCount = Mathf.RoundToInt(fCycleCount);
		#endif

		if (curCycle >= cycleCount)
		{
			if (autoDisable)
				enabled = false;
			return;
		}

		float deltaTime = unscaleTime ? Time.unscaledDeltaTime : Time.deltaTime;
		currentTime += deltaTime;
		while (currentTime >= cycleTime)
		{
			currentTime -= cycleTime;
			curCycle++;
			if (curCycle >= cycleCount)
			{
				myTransform.localPosition = startPosition;
				myTransform.localEulerAngles = startAngles;
				return;
			}

			if (!fixShake)
			{
				if (positionShake != Vector3.zero)
					curPositonShake = (cycleCount - curCycle) * positionShake / cycleCount;
				if (angleShake != Vector3.zero)
					curAngleShake = (cycleCount - curCycle) * angleShake / cycleCount;
			}
		}

		if (curCycle < cycleCount)
		{
			float offsetScale = Mathf.Sin((bothDir ? 2 : 1) * Mathf.PI * currentTime / cycleTime);
			if (positionShake != Vector3.zero)
				myTransform.localPosition = startPosition + curPositonShake * offsetScale;
			if (angleShake != Vector3.zero)
				myTransform.localEulerAngles = startAngles + curAngleShake * offsetScale;
		}
	}
    //重置
	public void Restart()
	{
		if (enabled)
		{
			currentTime = 0f;
			curCycle = 0;
			curPositonShake = positionShake;
			curAngleShake = angleShake;
			myTransform.localPosition = startPosition;
			myTransform.localEulerAngles = startAngles;
			if (fCycleCount > 0)
				cycleCount = Mathf.RoundToInt(fCycleCount);
		}
		else
			enabled = true;
	}
}

 

版权声明:本文为wafcc9原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wafcc9/article/details/83144138

智能推荐

Unity实现震动特效

写了一个测试脚本,当按下空格按键时,屏幕开始震动 将脚本挂载到相机上:  ...

U3D震屏效果源码

项目中用的,其实就是不断的做判断。...

Unity 实现屏幕抖动效果(通过Camera Viewport Rect)

实现屏幕抖动其实是实现相机Camera的抖动,通过修改Viewport Rect属性改变屏幕位置 以下是百度到的代码: 但是在Update方法里Camera的Rect的修改,以及上面定义的private float fps,shakeDelta,shakeLevel的作用不是很理解...

Unity 实现屏幕抖动效果(通过Camera Viewport Rect)

实现屏幕抖动其实是实现相机Camera的抖动,通过修改Viewport Rect属性改变屏幕位置 以下是百度到的代码: 但是在Update方法里Camera的Rect的修改,以及上面定义的private float fps,shakeDelta,shakeLevel的作用不是很理解...

android实现抖动效果

实现抖动是采用的Animation动画 shake.xml文件 cycle_7.xml文件 使用这个效果,只需下面两行代码:...

猜你喜欢

jquery 实现抖动效果

调用方法: $("抖动元素").shake(次数, 距离, 持续时间); $("#userName").shake(2, 10, 400);...

unity 摄像机震动效果

挂载到摄像机上 外部调用 CameraShake.ShakeFor(0.2f, 0.1f);...

setInterval与clearInterval的应用--实现震屏

setInterval(code,millisec) 按照指定的周期来调用函数,返回值为定时器的ID值 code-->在定时时间到时要执行的JavaScript代码 millisec-->设定的定时时间,用毫秒数表示。 clearInterval(idofsetInterval)取消由setInterval()方法设置的定时器。 eg:...

Unity3D ——游戏开炮,开枪屏幕震动效果实现

RPG或者动作游戏最重要的就是打击感,好的打击效果可以给游戏增色不少,而一种最方便最简单的提升打击感的效果就是震屏效果,短短几十行代码就可以让我们的游戏效果提升不少。 那么在我们进行游戏战斗场景开发时,常常为了加强临场感,会在有爆炸或者撞击的时候加入震屏的效果,原理其实很简单,就是对场景主相机进行坐标和角度的变化。 话不多说,看一下代码: 接下来咱们看一下设计思路: 1.创建类,带参数构造方法: ...