最近看了iphone手机上的图标抖动算法,提供一个实现
<code>using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotationAnimation : MonoBehaviour
{
// Start is called before the first frame update
public float duration = 0.25f;
public float displacement = 1.0f;
public float degreesRotation = 2.0f;
public bool play = false;
public bool enablePos;
public bool enableRotation;
public bool useXY = false;
public bool useXZ = true;
public bool useYZ = false;
private Position position;
private Rotation rotation;
private void Awake()
{
Init();
StartPlay();
}
public void StartPlay()
{
play = true;
position.startTime = Time.realtimeSinceStartup;
rotation.startTime = Time.realtimeSinceStartup;
}
public void StopPlay()
{
play = false;
transform.localPosition = Vector3.zero;
transform.localRotation = Quaternion.Euler(transform.localRotation.x, 0f, transform.localRotation.z);
}
public void Update()
{
if (play)
{
if (enablePos)
{
position.Update();
}
if (enableRotation)
{
rotation.Update();
}
}
}
public void Init()
{
var negativeDisplacement = -1.0f * displacement;
position = new Position();
position.transform = transform;
position.duration = duration;
position.positions = new Vector2[] {
new Vector2(negativeDisplacement,negativeDisplacement),
new Vector2(0,0),
new Vector2(negativeDisplacement,0),
new Vector2(0,negativeDisplacement),
new Vector2(negativeDisplacement,negativeDisplacement),
};
position.useXY = useXY;
position.useXZ = useXZ;
position.useYZ = useYZ;
rotation = new Rotation();
rotation.transform = transform;
rotation.duration = duration;
rotation.rotations = new float[] {
-1.0f * degreesRotation ,
degreesRotation ,
-1.0f * degreesRotation
};
rotation.useXY = useXY;
rotation.useXZ = useXZ;
rotation.useYZ = useYZ;
}
class Position
{
public float startTime;
public float delayTime;
public float duration;
public Vector2[] positions;
public Transform transform;
public bool useXZ = true;
public bool useXY = false;
public bool useYZ = false;
public void Update()
{
// 线性插值
float time = Time.realtimeSinceStartup - startTime;
if (time <= delayTime)
{
return;
}
int rate = (int)(time / duration);
float lerp = (time - rate * duration)/duration;
int index = rate % (positions.Length-1);
var startPos = positions[index];
var endPos = positions[index + 1];
//Debug.Log("index: " + index);
Vector2 pos = Vector2.Lerp(startPos, endPos,lerp);
if (useXZ)
{
transform.localPosition = new Vector3(pos.x, transform.localPosition.y, pos.y);
}else if (useXY)
{
transform.localPosition = new Vector3(pos.x, pos.y, transform.localPosition.z);
}
else if (useYZ)
{
transform.localPosition = new Vector3(transform.localPosition.x, pos.x, pos.y);
}
}
}
class Rotation
{
public float startTime;
public float delayTime;
public float duration;
public float[] rotations;
public Transform transform;
public bool useXZ = true;
public bool useXY = false;
public bool useYZ = false;
public void Update()
{
// 线性插值
float time = Time.realtimeSinceStartup - startTime;
if (time <= delayTime)
{
return;
}
int rate = (int)(time / duration);
float lerp = (time - rate * duration)/duration;
int index = rate % (rotations.Length - 1);
var start = rotations[index];
var end = rotations[index + 1];
float rotation = Mathf.Lerp(start, end, lerp);
//Debug.Log(start + " " + end + " value:"+rotation+" lerp:" + lerp+" index:"+index);
if (useXZ)
{
transform.localRotation = Quaternion.Euler(transform.localRotation.x, rotation, transform.localRotation.z);
}else if (useXY)
{
transform.localRotation = Quaternion.Euler(transform.localRotation.x,transform.localRotation.y, rotation);
}
else if (useYZ)
{
transform.localRotation = Quaternion.Euler(rotation,transform.localRotation.y, transform.localRotation.z);
}
}
}
}
</code>
近期评论