iPhone手机图标抖动

最近看了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&#91;] { 
            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&#91;] {
         -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&#91;] 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 &lt;= delayTime)
            {
                return;
            }

            int rate = (int)(time / duration);
            float lerp = (time - rate * duration)/duration;
            int index = rate % (positions.Length-1);
            var startPos = positions&#91;index];
            var endPos = positions&#91;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&#91;] 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 &lt;= delayTime)
            {
                return;
            }

            int rate = (int)(time / duration);
            float lerp = (time - rate * duration)/duration;
            int index = rate % (rotations.Length - 1);
            var start = rotations&#91;index];
            var end = rotations&#91;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 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>