NG_/Assets/Scripts/UI/动画/SlideInPanelUI.cs
2024-12-13 19:40:05 +08:00

66 lines
2.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SlideInPanelUI : MonoBehaviour
{
public AnimationCurve curve = new AnimationCurve(new Keyframe(0, 0), new Keyframe(1, 1)); // 动画曲线
private RectTransform rectTransform; // 目标面板的 RectTransform
public float animationTime = 2f; // 动画持续时间
public bool isFromLeft = true; // 是否从左侧移动进来false 则从右侧移动进来
public float offscreenDistance = 1.2f; // UI 元素开始时在屏幕外的距离比例1表示完全在画布外>1可以让其更远
private Vector3 startPos; // 动画开始位置
private Vector3 endPos; // 动画结束位置
private Vector3 ChuShi;
void Awake()
{
ChuShi = GetComponent<RectTransform>().localPosition;
}
void OnEnable()
{
rectTransform = GetComponent<RectTransform>();
rectTransform.localPosition = ChuShi;
// 获取 Canvas 的宽度和高度
float canvasWidth = rectTransform.rect.width;
// 根据比例设置初始位置
if (isFromLeft)
{
startPos = new Vector3(-canvasWidth * offscreenDistance, rectTransform.localPosition.y, rectTransform.localPosition.z); // 屏幕左外侧
}
else
{
startPos = new Vector3(canvasWidth * offscreenDistance, rectTransform.localPosition.y, rectTransform.localPosition.z); // 屏幕右外侧
}
endPos = rectTransform.localPosition; // 最终位置为当前面板位置
rectTransform.localPosition = startPos; // 初始位置设置为外部
// 启动动画
StartCoroutine(SlideIn());
}
IEnumerator SlideIn()
{
float time = 0f;
while (time < animationTime)
{
// 计算动画的插值,归一化时间
time += Time.deltaTime*2f;
float t = time / animationTime;
// 根据动画曲线计算当前位置
rectTransform.localPosition = Vector3.Lerp(startPos, endPos, curve.Evaluate(t));
yield return null;
}
// 最终确保位置准确
rectTransform.localPosition = endPos;
}
}