Unity地面震动的效果

有时候需要一个效果,一块巨大的陨石从天而降,这样就需要地面震动一下的震撼效果,这个实现的时候有时候会让地面抖动一下,但更多时候是用相机轻微晃动一下,实现地面的震撼效果。以下是相机震动的代码

using UnityEngine;
using System.Collections.Generic;

namespace combat
{
	public class Shake
	{
		class Instance
		{
			public Vector2 Position;
			public Vector2 Direction;
			public float Timeout;
			public float Lifetime;
			public float Strength;
			public float Angle;
			public float Speed;
		}
		
		private static List<Instance> m_shakes;
		
		static public void Init()
		{
			m_shakes = new List<Instance>();
		}
		
		static public void Dispose()
		{
			m_shakes = null;
		}
		
		static public void addShake(Vector2 pos, float time, float strength)
		{
			#if !IS_RELEASE
			if(ConsoleCommands.ConsoleScreenController.SCREENSHOT_MODE)
			{
				return;
			}
			#endif
		
			Instance instance = new Instance();
			instance.Position = pos;
			instance.Timeout = time;
			instance.Lifetime = time;
			instance.Strength = strength;
			instance.Angle = 0;
			instance.Speed = 50;
			instance.Direction = new Vector2(Random.Range(-1f,1f),Random.Range(-1f,1f));
			instance.Direction.Normalize();
			
			m_shakes.Add(instance);
		}
		
		static public void process(float time)
		{
			if(m_shakes.Count > 0 && time != 0)
			{
				Vector2 total = Vector2.zero;
			
				for(int c1 = 0; c1 < m_shakes.Count; ++c1)
				{
					Instance instance = m_shakes[c1];
					instance.Timeout -= time;
					if(instance.Timeout <= 0)
					{
						m_shakes.RemoveAt(c1);
						--c1;
					}
					else
					{
						float percentage = instance.Timeout / instance.Lifetime;

						instance.Angle += instance.Speed * time;

						float sin = Mathf.Sin(instance.Angle);
						
						float amount = instance.Strength * percentage * sin;
					
						total += instance.Direction * amount;
					}
				}
				
				Camera.main.transform.RotateAround(Camera.main.transform.position, Camera.main.transform.right, total.x);
				Camera.main.transform.RotateAround(Camera.main.transform.position, Camera.main.transform.up, total.y);
			}
		}
	}
}

只要调用addshake就可以实现相机的震动效果,犹如巨石从天而降

有时候也需要一个巨石会一个由大变小的过程砸向远处的过程,如果是3d的物体在3d世界中运动,当然自己会变小,但是若是需要用ui 实现,这需要ui由大变小

这个由大变小的过程就放在Update里面

		void Update()
		{
			if (m_Logo != null)
			{
				float time = Time.deltaTime;

				if (m_pause > 0)		//等待0.75秒
				{
					m_pause -= time;

					if (m_pause <= 0)
					{
						m_timeout = 1;
						m_Logo.SetActive(true);
					}
				}

				if (m_pause <= 0)		//logo从大到小进行播放
				{
					if (m_timeout >= 0)
					{
						m_time += time;
						m_timeout -= m_time;

						float percent = Mathf.Clamp01(m_timeout / 1);
						m_Logo.transform.localScale = Vector3.one * (1 + (1f * percent));
						if(m_timeout <0 )
						{
							Engine.audio.AudioManager.Instance.queue("deployStructure", 0);
						}
					}
				}
				if (m_pause <= 0 && m_timeout <= 0)		//logo播放完毕,按钮从浅到深着色
				{
					if (diaphaneity < 1)
					{
						diaphaneity += diaphaneityIncreace;
						SetDiaphaneity(diaphaneity);
					}
				}
			}
		}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值