人物框視差效果 UI跟鼠標移動

直接賦給Image即可

 

using UnityEngine;

[RequireComponent(typeof(RectTransform))]
public class zzzzzz : MonoBehaviour
{

    public float y_maxRot, y_pos;//不需要它沿此軸旋轉,設置爲0


    public float x_maxRot, x_pos;//不需要它沿此軸旋轉,設置爲0

    //旋轉速度
    public float speed;

    RectTransform rect;
    //旋轉對象
    public RectTransform rectToRotate;
    Vector2 targetEulerAngles = Vector3.zero;
    Vector2 targetPos = Vector3.zero;
    private void Awake()
    {
        rect = GetComponent<RectTransform>();
    }

    private void Update()
    {
        //鼠標位置和麪板位置之間的差異
        Vector2 diff = (Vector2)transform.position - (Vector2)Input.mousePosition;

        //鼠標是否旋轉對象內
        if (Mathf.Abs(diff.x) <= (rect.sizeDelta.x * 0.5f) && Mathf.Abs(diff.y) <= (rect.sizeDelta.y * 0.5f))
        {
            float offset_X = -Mathf.Clamp(diff.y / (rect.sizeDelta.y * 0.5f), -1, 1);//隨着鼠標與對象Y軸的距離,在[-1,1]之間輸出
            float offset_Y = Mathf.Clamp(diff.x / (rect.sizeDelta.x * 0.5f), -1, 1);//隨着鼠標與對象X軸的距離,在[-1,1]之間輸出
            targetEulerAngles = new Vector3(x_maxRot * offset_X, y_maxRot * offset_Y, 0);
            targetPos = new Vector3(x_pos * offset_X, y_pos * offset_Y, 0);
        }
        else
        {
            //鼠標位於旋轉對象之外,目標旋轉爲零
            targetEulerAngles = Vector3.zero;
            targetPos = Vector3.zero;
        }

        //旋轉差值(沒想出旋轉差值代替方法)
        rectToRotate.eulerAngles = AngleLerp(rectToRotate.eulerAngles, targetEulerAngles, speed * Time.deltaTime);
        rectToRotate.anchoredPosition = Vector2.Lerp(rectToRotate.anchoredPosition, targetPos, speed * Time.deltaTime);
    }

    //兩個角度差值(每個軸使用Mathf.LerpAngle)
    public static Vector3 AngleLerp(Vector3 StartAngle, Vector3 FinishAngle, float t)
    {
        return new Vector3(
            Mathf.LerpAngle(StartAngle.x, FinishAngle.x, t),
            Mathf.LerpAngle(StartAngle.y, FinishAngle.y, t),
            Mathf.LerpAngle(StartAngle.z, FinishAngle.z, t)
            );
    }

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章