Unity中实现ScrollRect 滚动定位到视口内

news2024/11/25 18:54:20

Demo链接:

https://download.csdn.net/download/qq_41973169/89439428icon-default.png?t=N7T8https://download.csdn.net/download/qq_41973169/89439428

一、前言

Unity版本:2020.1.x

如果需要资源请联系我我会分享给你 因为本人也要存储一下Demo所以上传到这里了但是又不能设置不需要积分

在Unity游戏开发中,滚动视图中元素的定位是一个常见需求。为了解决这个问题,我们可以编写一个名为 "ScrollLocate" 的脚本来实现这个功能。

二、效果 

三、完整代码

代码都有注释逻辑也很简单故不再阐述

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ScrollLocate : MonoBehaviour
{
    public RectTransform targetTransform;
    private ScrollRect _scrollRect;
    private RectTransform _scrollRectTransform;
    private RectTransform _contentTransform;
    private RectTransform _viewPortTransform;

    // 测试代码
    public int locateIndex = 1;
    private List<RectTransform> _allTargetRects;
    private void Start()
    {
        _scrollRect = GetComponent<ScrollRect>();
        _contentTransform = _scrollRect.content;
        _viewPortTransform = _scrollRect.viewport;
        _scrollRectTransform = GetComponent<RectTransform>();

        //测试代码
        _allTargetRects = new List<RectTransform>();
        for (int i = 0; i < 20; i++)
        {
            GameObject targetObj = Instantiate(targetTransform.gameObject, _contentTransform.transform);
            Text text = targetObj.transform.GetChild(0).GetComponent<Text>();
            text.text = (i + 2).ToString();
            _allTargetRects.Add(targetObj.GetComponent<RectTransform>());
        }
    }

    //测试代码
    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            LocateTargetInViewportCenter(_allTargetRects[locateIndex - 1]);
        }
    }

    // 将目标元素定位到视口中心
    void LocateTargetInViewportCenter(RectTransform targetRect)
    {
        // 将目标元素的当前本地坐标转换为滚动视图的局部坐标系中的位置
        Vector3 targetCurrentLocalPosition = _scrollRectTransform.InverseTransformVector(ConvertLocalPosToWorldPos(targetRect));

        // 将视口的当前本地坐标转换为滚动视图的局部坐标系中的位置
        Vector3 viewportCurrentLocalPosition = _scrollRectTransform.InverseTransformVector(ConvertLocalPosToWorldPos(_viewPortTransform));

        // 计算目标元素在滚动视图中的偏移量
        Vector3 offset = viewportCurrentLocalPosition - targetCurrentLocalPosition;
        offset.z = 0.0f;

        // 计算偏移量在滚动视图 normalizedPosition 中的比例
        var normalizedOffset = new Vector2(
            offset.x / (_contentTransform.rect.width - _viewPortTransform.rect.width),
            offset.y / (_contentTransform.rect.height - _viewPortTransform.rect.height)
        );

        // 根据偏移量调整滚动视图的 normalizedPosition
        var newNormalizedPosition = _scrollRect.normalizedPosition - normalizedOffset;

        // 对新的 normalizedPosition 进行边界限制,确保其在合理范围内
        newNormalizedPosition.x = Mathf.Clamp01(newNormalizedPosition.x);
        newNormalizedPosition.y = Mathf.Clamp01(newNormalizedPosition.y);
        _scrollRect.normalizedPosition = newNormalizedPosition;
    }

    // 将目标元素本地坐标转换为世界坐标
    private Vector3 ConvertLocalPosToWorldPos(RectTransform targetRect)
    {
        // 计算目标 RectTransform 中心点在父对象空间中的位置偏移量
        var centerOffset = new Vector3(
            (0.5f - targetRect.pivot.x) * targetRect.rect.size.x,
            (0.5f - targetRect.pivot.y) * targetRect.rect.size.y,
            0f);

        // 将目标元素的本地坐标与偏移量相加,得到世界坐标
        var localPosition = targetRect.localPosition + centerOffset;
        return targetRect.parent.TransformPoint(localPosition);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1827551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

车载网络安全指南 软件层面开发阶段(八)

返回总目录->返回总目录<- 目录 前言 一、软件层面产品开发启动 二、确定网络安全需求 三、软件架构设计 四、软件层面漏洞分析 五、软件单元设计和实现 六、软件实现的分析与评估 七、软件单元测试 八、软件集成和测试 九、网络安全验证 十、细化网络安全评估…

发布自己的c#包到nuget

1)创建自己的nuget账号 NuGet Gallery | Home 2)在Rider中-->项目邮件-->properties 注意&#xff1a;必须勾选生成nuget包 3)编译后&#xff0c;将生成一个包 4)点击上传包 5)将之前的nuget包拖拽过来&#xff0c;点击上传即可&#xff0c;如果有不对的比如&#xf…

C++ 43 之 自增运算符的重载

#include <iostream> #include <string> using namespace std;class MyInt{friend ostream& operator<< (ostream& cout , MyInt& int1); public:MyInt(){this->m_num 0;}// 前置自增&#xff1a; 成员函数实现运算符的重载 返回的是 引用&a…

Android 蓝牙配对Settings应用里面的简要流程记录

Android 蓝牙配对Settings应用里面的简要流程记录 文章目录 Android 蓝牙配对Settings应用里面的简要流程记录一、前言二、Settings蓝牙配对的关键代码1、接收蓝牙请求的地方 AndroidManifest.xml2、BluetoothPairingRequest3、BluetoothPairingService4、BluetoothPairingDial…

石头、剪子、布小游戏图形化

石头、剪子、布小游戏图形化 也是之前编写了一个石头、剪子、布的小游戏&#xff0c;总感觉界面不够友好&#xff0c;AI时代到来&#xff0c;一切都无所不能&#xff0c;而且编程效率大大提高了。所以用AI大模型进行程序代码重构&#xff0c;再稍加修改&#xff0c;效果还不错…

LLM proj - 审稿大模型

常用数据处理 主要是四种方式&#xff1a;正则表达式、AC自动机、困惑度过滤低质文本、最小哈希算法实现文本去重 1. 正则表达式&#xff0c;去做一些模式匹配 ex&#xff1a; # 论文的评审内容有时会存在大量列举reference&#xff08;参考文献&#xff09;的情况 # 这些r…

KKT基础知识

KKT条件定义 KKT条件(Karush–Kuhn–Tucker conditions)是最优化&#xff08;特别是非线性规划&#xff09;领域最重要的成果之一&#xff0c;是判断某点是极值点的必要条件。 最优化问题 要选择一组参数&#xff08;变量&#xff09;&#xff0c;在满足一定的限制条件&…

Unity动态添加聊天文本

1.创建一个滚动视图 2.调整滚动视图的位置并删掉这个 3.创建一个输入框和一个按钮 这里插一句一定要给content添加这个组件并设置单元格大小 4创建一个脚本并编写下面代码 using System.Collections; using System.Collections.Generic; using TMPro; using Unity.VisualScrip…

⭐Unity 控制任意UI的渐隐渐显

使用脚本之前先给要控制的UI加上CanvasGroup组件 解释: 这个脚本使用协程来逐渐改变CanvasGroup的alpha值&#xff0c;从而实现渐隐和渐显的效果。 Mathf.Lerp函数用于在指定的时间内平滑地从当前透明度过渡到目标透明度。 通过调用FadeIn和FadeOut方法&#xff0c;你可以在任…

人工智能在风险管理中的创新之路及案例分析

随着科技的日新月异&#xff0c;人工智能&#xff08;AI&#xff09;技术已广泛应用于各个领域&#xff0c;特别是在风险管理方面&#xff0c;其展现出的巨大潜力和实际应用价值引人瞩目。本文将结合具体案例&#xff0c;深入探讨AI在风险管理中的创新应用及其带来的行业变革。…

FANUC机器人SRVO-454和SRVO-455故障报警处理总结

FANUC机器人SRVO-454和SRVO-455故障报警处理总结 公司内的一台FANUC机器人(型号:M-900iB;控制柜型号:R-30iB)正常运转过程中突然报警: SRVO-455 CPU看门狗(G:1 A:2),按Reset键无法消除该报警; 查看SRVO-455故障报警的具体内容,如下图所示: 由于现场没有备用的伺服放…

ubuntu 22.04下利用webmin 搭建一个Wordpress 网站(2)

上次我们讲到第二部分&#xff0c;今天我们继续这一个话题 第三部分&#xff1a;利用webmin创建一个wordpress网站 1、在 Webmin 内安裝Apache 未使用的模块> Apache Webserver > 现在安装 会出现如下图所示的有关软件 刷新模快后 检查开机时要自动启动Apache 测…

Midjourney提示词终极指南(完整版)

在这篇博客中&#xff0c;我们深入研究了使用提示的艺术&#xff0c;以利用Midjourney的AI功能的力量。我们将探索各种技术&#xff0c;以创建个性化和迷人的图像&#xff0c;将你的创意想法转变为令人惊叹的视觉杰作。 1. 了解提示词 提示是简短的文字描述或关键词&#xff…

JavaScript——初识:JavaScript的组成、输入和输出语句... | JavaScript基础:变量,数据类型转换

目录 初识JavaScript JavaScript的组成 输入和输出语句 ECMAScript 6保留关键字 变量的命名规范 注意事项 JavaScript基础 变量的数据类型 数据类型分类 数据类型转换 转换为字符串型 转换为数字型 转换为布尔型 例题 初识JavaScript JavaScript的组成 Java…

SpringAI快速上手

一、导入依赖 镜像&#xff08;导入maven依赖&#xff09; <repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>…

RPG游戏完整指南

环境&#xff1a;unity2021urp 本教程教大家如何使用Unity创建一个RPG游戏&#xff0c;玩家可以在城镇场景中进行导航并寻找战斗&#xff0c;并在战斗中遇到不同类型的敌人。玩家可以向敌人施加不同的动作&#xff0c;如&#xff1a;常规攻击和撤离。这会是一个十分有趣的体验。…

大疆Pocket2手持记录仪格式化恢复方法

大疆Pocket系列是手持类产品&#xff0c;此类产品处理过不少&#xff0c;今天来看一个Pocket2误格式化之后的恢复方法。 故障存储:256G存储卡 /文件系统&#xff1a;exFAT 故障现象: 客户描述其经常对存储进行格式化&#xff0c;一般重新拍就会格式化一次&#xff0c;需要恢…

Linux下的串口通信

串口通信 基础知识&#xff1a; 什么是串口&#xff1f; 串口全称串行通信接口&#xff0c;是一种常用于电子设备之间通信的异步&#xff0c;全双工接口&#xff0c;典型的串口通信只需要 3 根线&#xff0c;分别是地线 (GND)&#xff0c;发送线(TX)&#xff0c;接收线(RX)。如…

Excel/WPS《超级处理器》功能介绍与安装下载

超级处理器是基于Excel或WPS开发的一款插件&#xff0c;拥有近300个功能&#xff0c;非常简单高效的处理表格数据&#xff0c;安装即可使用。 点击此处&#xff1a;超i处理器安装下载 Excel菜单&#xff0c;显示如下图所示&#xff1a; WPS菜单显示&#xff0c;如下图所示&am…

运算符与表达式

运算符和表达式是C语言编程的基础构建块&#xff0c;它们共同构成了C语言程序的核心逻辑和计算。理解和掌握运算符和表达式的相关知识&#xff0c;对于编写高效、易读的C语言代码至关重要。 一、运算符概述 运算符是C语言中用于执行各种操作的符号&#xff0c;它们可以对变量、…