⭐ Unity 实现UI视差滚动效果(Parallax)鼠标控制、可拓展陀螺仪与脚本控制

✨ 效果如下

在许多游戏、APP 或动效页面中,我们常见的一种视觉效果是 视差滚动(Parallax Scrolling):前景、中景、背景在鼠标或设备移动时以不同速率轻微移动,从而营造出一种空间感和深度感。

目前遇到这样一个需求 所以在 Unity 中实现一个支持鼠标控制、陀螺仪控制和脚本控制的 UI 视差脚本,并提供完整源码、注释及使用方法,适合用于启动页、主菜单、信息卡片界面等多种场景。


🧠 实现原理

核心思想是:

  • 每个 UI 图层记录起始位置;

  • 根据输入设备(鼠标或陀螺仪),获取目标参考位置(通常是屏幕坐标归一化到 [0,1]);

  • Lerp 缓动插值方式移动 UI 图层,使其偏移方向和输入方向一致;

  • 每个图层的移动速度和最大移动范围可以独立配置。


📦 脚本结构概述

我们将视差系统封装为一个 MonoBehaviour 脚本,名为 MMParallaxUI,结构清晰、易于扩展:

名称说明
ParallaxLayer子类,表示每一层的参数设置(RectTransform、速度、幅度、是否启用等)
Modes视差控制模式(鼠标 / 陀螺仪 / 脚本)
ParallaxLayers图层列表,可在 Inspector 中直接配置
AmplitudeMultiplier所有图层的幅度乘数
SpeedMultiplier所有图层的速度乘数


🧩 完整源码(含中文注释)

using System;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 用于实现UI视差滚动效果的组件(Parallax)
/// 支持鼠标控制、陀螺仪控制(移动端)、或通过代码控制
/// </summary>
public class MMParallaxUI : MonoBehaviour
{/// <summary>/// 用于存储每个视差图层的设置/// </summary>[Serializable]public class ParallaxLayer{[Tooltip("该图层的 RectTransform 组件")]public RectTransform Rect;[Tooltip("该图层移动的速度")]public float Speed = 2f;[Tooltip("该图层相对初始位置最大移动距离(幅度)")]public float Amplitude = 50f;[HideInInspector]public Vector2 StartPosition;  // 图层的初始位置(运行时记录)[Tooltip("是否启用该图层的视差效果")]public bool Active = true;}/// <summary>/// 控制视差输入的模式类型/// </summary>public enum Modes{Mouse,      // 使用鼠标位置控制(适用于PC)Gyroscope,  // 使用陀螺仪控制(适用于移动设备)Script      // 外部脚本通过 SetReferencePosition 控制}[Header("基础设置")][Tooltip("当前使用的控制模式")]public Modes Mode = Modes.Mouse;[Tooltip("控制所有图层振幅的倍率")]public float AmplitudeMultiplier = 1f;[Tooltip("控制所有图层速度的倍率")]public float SpeedMultiplier = 1f;[Tooltip("参与视差移动的图层列表")]public List<ParallaxLayer> ParallaxLayers;// 内部变量protected Vector2 _referencePosition;   // 当前输入参考位置(归一化)protected Vector3 _newPosition;         // 图层的新位置protected Vector2 _mousePosition;       // 鼠标当前位置(屏幕坐标)/// <summary>/// Start 时初始化所有图层的起始位置/// </summary>protected virtual void Start(){Initialization();}/// <summary>/// 初始化:记录每个图层的起始位置/// </summary>public virtual void Initialization(){foreach (ParallaxLayer layer in ParallaxLayers){if (layer.Rect != null){layer.StartPosition = layer.Rect.position;}}}/// <summary>/// 每帧更新:移动所有图层/// </summary>protected virtual void Update(){MoveLayers();}/// <summary>/// 根据控制模式更新 _referencePosition 并移动图层/// </summary>protected virtual void MoveLayers(){// 根据控制模式获取输入switch (Mode){case Modes.Gyroscope:// 示例:你可以接入 Input.gyro.rotationRate 或 attitude(仅限移动设备)// _referencePosition = new Vector2(Input.gyro.rotationRate.x, Input.gyro.rotationRate.y);break;case Modes.Mouse:
#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER_mousePosition = UnityEngine.InputSystem.Mouse.current.position.ReadValue(); // 新输入系统
#else_mousePosition = Input.mousePosition; // 旧输入系统
#endif// 将鼠标屏幕坐标转为归一化视口坐标(0~1)_referencePosition = Camera.main.ScreenToViewportPoint(_mousePosition);break;case Modes.Script:// 由外部通过 SetReferencePosition() 设置break;}// 遍历每个图层并移动位置foreach (ParallaxLayer layer in ParallaxLayers){if (layer.Active && layer.Rect != null){// X轴移动(缓动)_newPosition.x = Mathf.Lerp(layer.Rect.position.x,layer.StartPosition.x + _referencePosition.x * layer.Amplitude * AmplitudeMultiplier,layer.Speed * SpeedMultiplier * Time.deltaTime);// Y轴移动(缓动)_newPosition.y = Mathf.Lerp(layer.Rect.position.y,layer.StartPosition.y + _referencePosition.y * layer.Amplitude * AmplitudeMultiplier,layer.Speed * SpeedMultiplier * Time.deltaTime);_newPosition.z = 0f;// 更新图层位置layer.Rect.position = _newPosition;}}}/// <summary>/// 设置一个新的输入参考位置(仅在 Script 模式下使用)/// 值通常在 (0,0) 到 (1,1) 之间/// </summary>public virtual void SetReferencePosition(Vector3 newReferencePosition){_referencePosition = newReferencePosition;}
}


🛠️ 使用方法

1️⃣ 添加组件

  1. 在 Canvas 下创建一个空 GameObject,命名为 UIParallaxRoot

  2. 挂载 MMParallaxUI 脚本。

  3. 在 Inspector 中配置 ParallaxLayers 列表,添加你希望参与视差效果的图层(Image/Text 等 UI 元素)。

  4. 配置每层的 SpeedAmplitude

2️⃣ 设置控制模式

  • Mouse(默认):使用鼠标位置控制(适用于PC)。

  • Gyroscope:适用于移动端,可扩展为接入 Input.gyro

  • Script:通过代码调用 SetReferencePosition() 控制。

// 示例:手动控制参考位置
parallaxUI.SetReferencePosition(new Vector2(0.5f, 0.5f)); // 回中


🎮 目前我使用的阈值如下

👇 均为透明png实现
按我这个阈值去配置  可以得到首图的效果


这个脚本目前直接挂载使用即可,陀螺仪方面还未拖拽完毕,也可以增加“自动回中”逻辑,在鼠标或输入松开后回归中心位置。如需图片素材做参考,或者你有新的思路和实现方式 可以私信我或在评论区留言。

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

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

相关文章

【05】VM二次开发——模块参数配置--带渲染/不带渲染(WinForm界面调用 模块参数配置)

文章目录1 Winform 窗口界面 &#xff08;带渲染的参数配置控件&#xff09;2 配置代码3 运行测试4 不带渲染的参数配置控件 对比4.1 添加控件4.2 代码及演示效果模块参数配置本教程介绍如何在VM二次开发中对模块参数进行配置 1 Winform 窗口界面 &#xff08;带渲染的参数配置…

Android 之 蓝牙通信(2.0 经典)

​​一、环境配置​​1. ​​添加依赖​​在 build.gradle 中添加库依赖&#xff1a;dependencies {implementation com.github.akexorcist:bluetoothspp:1.0.0 }2. ​​权限声明&#xff08;AndroidManifest.xml&#xff09;​<uses-permission android:name"androi…

使用 Scikit-LLM 进行零样本和少样本分类

使用 Scikit-LLM 进行零样本和少样本分类 使用 Scikit-LLM 进行零样本和少样本分类 在本文中&#xff0c;您将学习&#xff1a; Scikit-LLM如何将OpenAI的GPT等大型语言模型与Scikit-learn框架集成以进行文本分析。零样本和少样本分类之间的区别以及如何使用Scikit-LLM实现它…

android内存作假通杀补丁(4GB作假8GB)

可过如下app检测&#xff1a; 安兔兔、鲁大师、白眼、AIDA64、CPU X、CPU-Z、DevCheck、DeviceInfoHW lyw235yk235:~/Extend/lyw235/V/sprdroid1_v_4/sprdroid1_v$ git diff vnd/bsp/kernel5.15/kernel5.15/mm/page_alloc.c diff --git a/vnd/bsp/kernel5.15/kernel5.15/mm/pag…

Android 之 MVC架构

介绍1. MVC架构分工​​​​Model层​​&#xff1a;处理数据验证、网络请求等业务逻辑。​​View层​​&#xff1a;XML布局定义界面&#xff0c;Activity处理用户输入和显示结果。​​Controller层​​&#xff1a;Activity作为控制器&#xff0c;协调Model和View的交互对于登…

Centos Docker 安装手册(可用)

Centos 安装 Docker # 卸载旧版 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine \docker-selinux # 安装依赖工具 yum install -y yum-utils device-mapper-persistent-d…

烽火HG680-KX-海思MV320芯片-2+8G-安卓9.0-强刷卡刷固件包

烽火HG680-KX-海思MV320芯片-28G-安卓9.0-强刷卡刷固件包U盘强刷刷机步骤&#xff1a;1、强刷刷机&#xff0c;用一个usb2.0的8G以下U盘&#xff0c;fat32&#xff0c;2048块单分区格式化&#xff08;强刷对&#xff35;盘非常非常挑剔&#xff0c;usb2.0的4G U盘兼容的多&…

Python爬虫实战:研究pycares技术构建DNS解析系统

1. 引言 1.1 研究背景 随着互联网的飞速发展,网络上的数据量呈现爆炸式增长。网络爬虫作为一种高效的数据采集工具,被广泛应用于数据分析、市场调研、学术研究等领域。传统的爬虫在进行大规模数据采集时,往往会受到 DNS 解析效率的制约,成为影响爬取性能的瓶颈之一。 DNS…

从 0 到 1 认识 Spring MVC:核心思想与基本用法(下)

文章目录&#x1f4d5;4. 响应✏️4.1 返回静态页面✏️4.2 返回数据ResponseBody​✏️4.3 返回HTML代码片段​✏️4.4 返回JSON✏️4.5 设置状态码✏️4.6 设置Header&#xff08;了解&#xff09;&#x1f4d5;5. 案例练习✏️5.1 加法计算器✏️5.2 用户登录✏️5.3 留言板…

Python-初学openCV——图像预处理(五)——梯度处理、边缘检测、图像轮廓

目录 一、图像梯度处理 1、垂直边缘提取 2、Sobel算子 3、Laplacian算子 二、图像边缘检测 1、高斯滤波 2、计算图像的梯度、方向 3、非极大值抑制 4、双阈值筛选 三、绘制图像轮廓 1、概念 2、寻找轮廓 3、绘制轮廓 一、图像梯度处理 还记得高数中的一阶导数求极值…

【Redis】安装Redis,通用命令,常用数据结构,单线程模型

目录 一.在Ubuntu系统安装Redis 二. redis客户端介绍 三. 全局命令 3.1.GET和SET命令 3.2.KEYS&#xff08;生产环境禁止使用&#xff09; 3.3.EXISTS 3.4.DEL 3.5.EXPIRE 3.6.TTL 3.6.1.Redis的过期策略 3.6.2.基于优先级队列/堆的实现去实现定时器 3.6.3.定时器&a…

ubuntu22.04系统实践 linux基础入门命令(三) 用户管理命令

以下有免费的4090云主机提供ubuntu22.04系统的其他入门实践操作 地址&#xff1a;星宇科技 | GPU服务器 高性能云主机 云服务器-登录 相关兑换码星宇社区---4090算力卡免费体验、共享开发社区-CSDN博客 之所以推荐给大家使用&#xff0c;是因为上面的云主机目前是免费使用的…

DPDK中的TCP头部处理

1. TCP头部结构 TCP头部通常为20字节&#xff08;不含可选字段&#xff09;&#xff0c;每个字段占据固定的字节位置。以下是TCP头部的结构&#xff0c;按字节位置逐一说明&#xff1a;0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 …

开源在线客服系统Chatwoot配置文件

参考&#xff1a; https://developers.chatwoot.com/self-hosted/deployment/dockerhttps://developers.chatwoot.com/self-hosted/deployment/docker 1、.env 配置文件 # Learn about the various environment variables at # https://www.chatwoot.com/docs/self-hosted/co…

PHP进阶语法详解:命名空间、类型转换与文件操作

掌握了PHP面向对象编程的基础后&#xff0c;就可以深入学习命名空间、类型转换、文档注释、序列化以及文件操作等重要概念。 1、命名空间&#xff08;Namespace&#xff09; 命名空间是PHP 5.3引入的重要特性&#xff0c;它解决了类名、函数名和常量名冲突的问题&#xff0c;使…

Webpack 搭建 Vue3 脚手架详细步骤

创建一个新的 Vue 项目 1&#xff09;初始化项目目录 新建一个文件夹&#xff0c;或者使用以下指令 mkdir webpack-vue_demo cd webpack-vue_demo2&#xff09;初始化 npm 项目 npm init -y3&#xff09;安装 vue 和 webpack 相关依赖 npm install vue vue-loader vue-template…

【Git 误操作恢复指南】

Git 误操作恢复指南 适用场景&#xff1a;git reset --hard 误操作后的紧急恢复 风险等级&#xff1a;&#x1f534; 高风险 - 可能导致代码丢失 恢复成功率&#xff1a;95%&#xff08;CI/CD 环境下&#xff09; &#x1f6a8; 紧急情况概述 问题描述 在项目开发过程中&am…

Go语言 逃 逸 分 析

逃逸分析是什么 逃逸分析是编译器用于决定变量分配到堆上还是栈上的一种行为。一个变量是在堆上分配&#xff0c;还是在栈上分配&#xff0c;是经过编译器的逃逸分析之后得出的“结论”。Go 语言里编译器的逃逸分析&#xff1a;它是编译器执行静态代码分析后&#xff0c…

LeetCode算法日记 - Day 1: 移动零、复写零

目录 1. 移动零 1.1 思路解析 1.2 代码实现 2. 复写零 2.1 思路解析 2.2 代码实现 1. 移动零 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请…

Odoo:免费开源的医疗器械行业解决方案

开源智造Odoo专家团队深知&#xff0c;作为医疗器械制造商&#xff0c;您的成功取决于制造卓越产品的能力。您必须遵循严密控制的流程&#xff0c;开发和制造出达到最严格质量标准的产品。“开源智造Odoo医疗器械行业解决方案”是为医疗器械制造商设计的全球企业资源规划(ERP)软…