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

被折叠的 条评论
为什么被折叠?



