? 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
英文地址,請注明出處:http://en.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)軟…