最近看了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>
0 条评论。