回到原始点

博客记录行程,以成都为起点,深圳为中转点,最终又回到成都,形成一个行程闭环。
成都是起点,深圳是中转点,成都是终点! 
内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
<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、付费专栏及课程。

余额充值