using System.Collections; using System.Collections.Generic; using UnityEngine; public class SlideInPanel1UI : MonoBehaviour { public AnimationCurve curve = new AnimationCurve(new Keyframe(0, 0), new Keyframe(1, 1)); // 动画曲线 private RectTransform rectTransform; // 目标面板的 RectTransform public float animationTime = 0.5f; // 更短的动画持续时间 public bool isFromTop = true; // 是否从上方移动进来,false 则从下方移动进来 public float offscreenDistance = 1.2f; // UI 元素开始时在屏幕外的距离比例,1表示完全在画布外,>1可以让其更远 private Vector3 startPos; // 动画开始位置 private Vector3 endPos; // 动画结束位置 void Start() { rectTransform = GetComponent(); // 获取 Canvas 的高度 float canvasHeight = rectTransform.rect.height; // 根据比例设置初始位置 if (isFromTop) { startPos = new Vector3(rectTransform.localPosition.x, canvasHeight * offscreenDistance, rectTransform.localPosition.z); // 屏幕上外侧 } else { startPos = new Vector3(rectTransform.localPosition.x, -canvasHeight * offscreenDistance, rectTransform.localPosition.z); // 屏幕下外侧 } endPos = rectTransform.localPosition; // 最终位置为当前面板位置 rectTransform.localPosition = startPos; // 初始位置设置为外部 // 启动动画 StartCoroutine(SlideIn()); } IEnumerator SlideIn() { float time = 0f; // 加速动画,时间增速(比如通过乘一个常数系数来加快时间流逝) while (time < animationTime) { // 计算动画的插值,归一化时间 time += Time.deltaTime * 2f; // 增加 `2f` 的加速系数,使动画更快 // 确保 `time` 不超过 `animationTime` time = Mathf.Min(time, animationTime); // 根据动画曲线计算当前位置 rectTransform.localPosition = Vector3.Lerp(startPos, endPos, curve.Evaluate(time / animationTime)); yield return null; } // 最终确保位置准确 rectTransform.localPosition = endPos; } }