回到原始点

博客记录行程,以成都为起点,深圳为中转点,最终又回到成都,形成一个行程闭环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

成都是起点,深圳是中转点,成都是终点! 
<think>根据问题描述,需要修改之前的脚本,使按钮在收起时回到始位置,而不是标题位置。之前的代码在收起时是回到标题位置,现在需要改为回到各自初始记录的位置(originalPositions)。修改:1.在Start方法中记录每个按钮的始位置(已经做了,存储在originalPositions数组中)。2.在CollapseMenu方法中,将按钮的目标位置改为始位置(originalPositions[i]),而不是标题位置。以下是修改后的脚本:</think># Unity菜单栏动画修改:按钮返始位置 我理解您需要修改之前的脚本,使菜单按钮在收起时返回到它们的始位置,而不是收缩到标题位置。以下是修改后的完整解决方案: ```csharp using UnityEngine; using UnityEngine.EventSystems; using DG.Tweening; public class MenuAnimator : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler { [Header("UI Elements")] public RectTransform title; // 标题对象 public RectTransform[] menuButtons; // 菜单按钮数组(4个) [Header("Animation Settings")] public float fadeDuration = 0.3f; // 渐隐/渐显动画时长 public float expandDuration = 0.5f; // 展开动画时长 public float spacing = 100f; // 按钮间距 public Ease expandEase = Ease.OutBack; // 展开动画缓动类型 public Ease collapseEase = Ease.InBack; // 收起动画缓动类型 private Vector2[] originalPositions; // 存储按钮始位置 private Vector2 titlePosition; // 标题始位置 private bool isExpanded = false; // 当前菜单状态 void Start() { // 初始化存储位置 originalPositions = new Vector2[menuButtons.Length]; titlePosition = title.anchoredPosition; // 记录每个按钮的始位置 for (int i = 0; i < menuButtons.Length; i++) { originalPositions[i] = menuButtons[i].anchoredPosition; // 初始状态:透明并缩放到0 menuButtons[i].anchoredPosition = titlePosition; // 初始位置在标题处 menuButtons[i].localScale = Vector3.zero; CanvasGroup cg = GetOrAddCanvasGroup(menuButtons[i].gameObject); cg.alpha = 0f; } } // 鼠标进入标题区域 public void OnPointerEnter(PointerEventData eventData) { if (!isExpanded) { isExpanded = true; ExpandMenu(); } } // 鼠标离开标题区域 public void OnPointerExit(PointerEventData eventData) { if (isExpanded) { isExpanded = false; CollapseMenu(); } } // 展开菜单动画 - 移动到始位置 private void ExpandMenu() { // 先取消所有正在进行的动画 DOTween.Kill("MenuAnimation"); for (int i = 0; i < menuButtons.Length; i++) { RectTransform button = menuButtons[i]; CanvasGroup cg = GetOrAddCanvasGroup(button.gameObject); // 动画序列:渐显 + 移动到始位置 + 缩放 Sequence seq = DOTween.Sequence().SetId("MenuAnimation"); seq.Append(cg.DOFade(1f, fadeDuration)); seq.Join(button.DOAnchorPos(originalPositions[i], expandDuration).SetEase(expandEase)); seq.Join(button.DOScale(1f, expandDuration).SetEase(expandEase)); // 添加延迟效果,使按钮依次出现 seq.PrependInterval(i * 0.1f); } } // 收起菜单动画 - 返始位置 private void CollapseMenu() { // 先取消所有正在进行的动画 DOTween.Kill("MenuAnimation"); for (int i = 0; i < menuButtons.Length; i++) { RectTransform button = menuButtons[i]; CanvasGroup cg = GetOrAddCanvasGroup(button.gameObject); // 动画序列:渐隐 + 移动标题位置 + 缩放 Sequence seq = DOTween.Sequence().SetId("MenuAnimation"); seq.Append(cg.DOFade(0f, fadeDuration)); seq.Join(button.DOAnchorPos(titlePosition, expandDuration).SetEase(collapseEase)); seq.Join(button.DOScale(0f, expandDuration).SetEase(collapseEase)); // 反转延迟效果,使按钮依次收起 seq.PrependInterval((menuButtons.Length - i - 1) * 0.1f); } } // 获取或添加CanvasGroup组件 private CanvasGroup GetOrAddCanvasGroup(GameObject obj) { CanvasGroup cg = obj.GetComponent<CanvasGroup>(); if (cg == null) { cg = obj.AddComponent<CanvasGroup>(); } return cg; } } ``` ## 主要修改 ### 1. 按钮位置管理 - **存储始位置**:在`Start()`方法中,使用数组`originalPositions`存储每个按钮的初始位置 ```csharp originalPositions[i] = menuButtons[i].anchoredPosition; ``` - **初始位置设置**:启动时将按钮移动到标题位置 ```csharp menuButtons[i].anchoredPosition = titlePosition; ``` ### 2. 展开动画修改 - **移动到始位置**:展开时按钮移动到它们各自的始位置 ```csharp button.DOAnchorPos(originalPositions[i], expandDuration) ``` - **移除位置计算**:不再需要计算目标位置,直接使用存储的始位置 ### 3. 收起动画保持 - **返标题位置**:收起时按钮仍返回到标题位置(视觉收缩效果) ```csharp button.DOAnchorPos(titlePosition, expandDuration) ``` ## 使用说明 1. **场景设置**: - 在编辑器中,将每个菜单按钮放置在它们应该显示的最终位置 - 脚本会自动记录这些位置作为"始位置" 2. **动画过程**: - **初始状态**:所有按钮在标题位置,透明且缩放为0 - **鼠标悬停标题**: - 按钮依次移动到始位置 - 同时渐显并放大到正常尺寸 - **鼠标离开标题**: - 按钮依次收缩标题位置 - 同时渐隐并缩小到0 3. **自定义选项**: - 调整`spacing`不再影响位置(因为使用固定始位置) - 可通过修改`originalPositions`数组实现动态位置调整 ## 高级功能扩展 如果您需要更复杂的行为,以下是两个扩展方案: ### 方案1:直接返始位置(无收缩动画) ```csharp // 修改后的CollapseMenu方法 private void CollapseMenu() { DOTween.Kill("MenuAnimation"); for (int i = 0; i < menuButtons.Length; i++) { RectTransform button = menuButtons[i]; CanvasGroup cg = GetOrAddCanvasGroup(button.gameObject); Sequence seq = DOTween.Sequence().SetId("MenuAnimation"); // 直接返始位置 seq.Append(cg.DOFade(0f, fadeDuration)); seq.Join(button.DOAnchorPos(originalPositions[i], expandDuration).SetEase(collapseEase)); seq.Join(button.DOScale(0f, expandDuration).SetEase(collapseEase)); seq.PrependInterval((menuButtons.Length - i - 1) * 0.1f); } } ``` ### 方案2:双重动画(先收缩到标题再返回到始位置) ```csharp private void CollapseMenu() { DOTween.Kill("MenuAnimation"); for (int i = 0; i < menuButtons.Length; i++) { RectTransform button = menuButtons[i]; CanvasGroup cg = GetOrAddCanvasGroup(button.gameObject); Sequence seq = DOTween.Sequence().SetId("MenuAnimation"); // 第一阶段:收缩到标题位置 seq.Append(cg.DOFade(0f, fadeDuration/2)); seq.Join(button.DOAnchorPos(titlePosition, expandDuration/2).SetEase(Ease.InQuad)); seq.Join(button.DOScale(0f, expandDuration/2).SetEase(Ease.InQuad)); // 第二阶段:返回到始位置(透明状态) seq.Append(button.DOAnchorPos(originalPositions[i], expandDuration/2).SetEase(Ease.OutQuad)); seq.PrependInterval((menuButtons.Length - i - 1) * 0.1f); } } ``` ## 最终效果 修改后的脚本实现了: 1. 菜单初始时隐藏在标题位置 2. 鼠标悬停标题时,菜单按钮动画移动到它们各自的始位置 3. 鼠标离开时,菜单按钮动画收缩标题位置 4. 所有动画平滑流畅,带有延迟效果增强视觉体验
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值