直接賦給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)
);
}
}