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_RELEASEif(ConsoleCommands.ConsoleScreenController.SCREENSHOT_MODE){return;}#endifInstance 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);}}}}