【Unity】Unity Transform缩放控制教程:实现3D模型缩放交互,支持按钮/鼠标/手势操作
【Unity 】Transform缩放控制教程:实现3D模型缩放交互,支持按钮/鼠标/手势操作
在Unity开发中,Transform组件承担着场景中物体的空间信息控制,包括位置、旋转和缩放。而缩放(Scale)操作,作为三维交互中最常用的一种变换形式,不仅在模型调整、UI动画、场景编辑中被广泛使用,在许多实际项目中更是交互控制的核心。今天我们就来实现一个简单而实用的缩放控制脚本,并结合多个应用场景探讨它的使用方式与拓展思路。
一、为什么需要自定义缩放控制?
Unity虽然提供了对Transform的基本控制,但在实际开发中,我们常常需要自定义缩放行为,比如:
- UI按钮控制3D模型的缩放
- 鼠标滚轮或手势手势控制物体缩放
- 限制缩放的最大/最小值,防止模型变得太大或太小
- 在编辑器中交互式缩放对象,用于地图编辑器、安全区域编辑等功能
如果你正在开发一款需要用户交互的3D编辑工具、模拟器、教育培训产品或者VR/AR应用,那么“可控的缩放行为”将是你无法绕过的一个功能。
二、实现核心:ScaleController 脚本
我们从一个最基础的脚本出发,它提供两个公共方法,分别用于放大和缩小当前对象的 Transform。
using UnityEngine;/// <summary>
/// 控制对象缩放的通用脚本
/// </summary>
public class ScaleController : MonoBehaviour
{// 缩放因子,默认为1.1,即每次放大10%public float scaleFactor = 1.1f;// 最小缩放值public float minScale = 0.1f;// 最大缩放值public float maxScale = 10f;/// <summary>/// 放大当前对象/// </summary>public void ScaleUp(){Vector3 newScale = transform.localScale * scaleFactor;if (newScale.x <= maxScale && newScale.y <= maxScale && newScale.z <= maxScale){transform.localScale = newScale;}}/// <summary>/// 缩小当前对象/// </summary>public void ScaleDown(){Vector3 newScale = transform.localScale / scaleFactor;if (newScale.x >= minScale && newScale.y >= minScale && newScale.z >= minScale){transform.localScale = newScale;}}
}
这个脚本提供了:
- 简洁的放大/缩小方法
- 缩放限制,防止极端数值
- Inspector 面板可调参数
三、应用场景详解
场景一:UI 控制 3D 模型大小
在产品展示类应用中,用户常常需要点击按钮对模型进行缩放。我们可以将 ScaleController
挂载到模型上,并通过 UI 按钮绑定 ScaleUp()
和 ScaleDown()
方法:
public class ScaleUIHandler : MonoBehaviour
{public ScaleController controller;public void OnClickScaleUp(){controller.ScaleUp();}public void OnClickScaleDown(){controller.ScaleDown();}
}
这样就可以通过按钮交互控制模型大小,适用于家具展示、角色查看等场景。
场景二:鼠标滚轮控制缩放
在场景查看器或编辑工具中,常见交互是使用鼠标滚轮进行缩放。我们可以在 Update 方法中监听滚轮输入:
void Update()
{float scroll = Input.GetAxis("Mouse ScrollWheel");if (scroll > 0f){ScaleUp();}else if (scroll < 0f){ScaleDown();}
}
这个功能适合:
- 3D场景查看器
- 场景地图编辑器
- 自由浏览VR空间的桌面版本
场景三:手势控制(适配VR/AR)
在 VR 或 AR 中,用户更希望使用手势进行缩放控制,比如双指开合(pinch gesture)。以 Unity 的 AR Foundation 或 XR Toolkit 为例,可以通过监听 PinchGesture
实现缩放,进而调用我们封装好的 ScaleController
方法。
void OnPinch(float pinchDelta)
{if (pinchDelta > 0)scaleController.ScaleUp();elsescaleController.ScaleDown();
}
这种交互在以下场景中非常常见:
- AR 中的家具放置和缩放
- VR 设计工具中的精细调整
- 虚拟展馆中的展品查看
场景四:编辑器工具中的对象缩放
你可以将该组件结合 Unity 的自定义 Editor 工具,制作一个可交互调整对象缩放的 Scene 工具:
#if UNITY_EDITOR
using UnityEditor;
[CustomEditor(typeof(ScaleController))]
public class ScaleControllerEditor : Editor
{public override void OnInspectorGUI(){DrawDefaultInspector();ScaleController sc = (ScaleController)target;GUILayout.Space(10);if (GUILayout.Button("放大")){sc.ScaleUp();}if (GUILayout.Button("缩小")){sc.ScaleDown();}}
}
#endif
只需选中带有该脚本的 GameObject,即可在 Inspector 中直接控制缩放。
四、进阶拓展
1. 非等比缩放
目前的实现是等比缩放,但有些时候我们可能希望只在某一个轴上缩放,例如:
transform.localScale += new Vector3(0.1f, 0, 0); // 仅放大X轴
这种方式适合:
- 面积、长度模拟的可视化工具
- 在某些动画过程中拉伸物体,如技能特效
2. 增加缩放动画效果
为了增强用户体验,可以将缩放改为渐变效果,例如使用 Lerp
或 DOTween
:
void ScaleTo(Vector3 targetScale)
{StartCoroutine(ScaleSmoothly(targetScale));
}IEnumerator ScaleSmoothly(Vector3 targetScale)
{float t = 0;Vector3 start = transform.localScale;while (t < 1){transform.localScale = Vector3.Lerp(start, targetScale, t);t += Time.deltaTime * 5f;yield return null;}transform.localScale = targetScale;
}
这种方式可以带来更柔和、真实的体验。
五、实际开发建议
控制范围必须设置
缩放无限放大/缩小会导致模型渲染异常或穿模,建议始终设置最大/最小限制。
统一缩放方式
如果一个项目中多个模型使用缩放逻辑,建议统一封装为工具类或抽象接口,便于统一管理与测试。
缩放中心需注意
默认的缩放中心是模型的原点(Pivot),如果缩放出现偏移问题,可以调整模型导入时的中心点或在父物体上处理。
缩放带来的碰撞问题
缩放会改变物体的碰撞盒大小,尤其是 MeshCollider,注意需要在缩放后重新 RecalculateBounds()
或刷新碰撞体。
六、结语
本文从一个简单的Transform缩放脚本出发,介绍了其基础实现、参数控制以及多个实际应用场景。
专栏《VR 360°全景视频开发》,持续更新中,敬请关注!
【专栏预告】《VR 360°全景视频开发:从GoPro到Unity VR眼镜应用实战》
《VR 360°全景视频开发》将带你深入探索从GoPro拍摄到Unity眼镜端应用开发的全流程技术。专栏内容涵盖安卓原生VR播放器开发、Unity VR视频渲染与手势交互、360°全景视频制作与优化,以及高分辨率视频性能优化等实战技巧。敬请关注每周更新的技术分享!
相关文章:
【Unity】Unity Transform缩放控制教程:实现3D模型缩放交互,支持按钮/鼠标/手势操作
【Unity 】Transform缩放控制教程:实现3D模型缩放交互,支持按钮/鼠标/手势操作 在Unity开发中,Transform组件承担着场景中物体的空间信息控制,包括位置、旋转和缩放。而缩放(Scale)操作,作为三…...
集成nacos2.2.1出现的错误汇总
总结 1.jdk问题 jdk要一致 2.idea使用问题 idea启动nacos要配置,idea启动类要启动两次,并配置两次vm参数 3.项目依赖问题 依赖要正确添加,有的模块就是不能用公共模块的pom配置,需要独立配置,先后启动顺序也要注意…...
从零到有的游戏开发(visual studio 2022 + easyx.h)
引言 本文章适用于C语言初学者掌握基本的游戏开发, 我将用详细的步骤引领大家如何开发属于自己的游戏。 作者温馨提示:不要认为开发游戏很难,一些基本的游戏逻辑其实很简单, 关于游戏的开发环境也不用担心,我会详细…...
海外高防服务器延迟优化——跨国业务安全加速的底层逻辑
本文深度解析海外高防服务器延迟优化的技术实现路径,揭示跨国业务场景下DDoS防护与网络性能的平衡法则。从物理线路选择到协议栈调优,从流量调度算法到安全检测机制重构,系统阐述降低20ms-50ms延迟的工程实践方案,并附2023年东南亚…...
常用环境部署(二十六)——Centos搭建MQTT服务端EMQX
1、安装docker https://blog.csdn.net/wd520521/article/details/112609796?spm1011.2415.3001.5331 2、安装EMQX4.4.4 (1)使用docker pull指令安装emqx镜像 docker pull emqx/emqx:4.4.4 (2)查看镜像 docker images 3、启…...
ecovadis认证基本概述,ecovadis认证审核有效期
EcoVadis认证基本概述 1. 什么是EcoVadis认证? EcoVadis是全球领先的企业可持续发展(ESG)评级平台,专注于评估企业在**环境(E)、劳工与人权(S)、商业道德(L)…...
2.8.4 iOS覆盖率SDK开发
iOS系统的覆盖率SDK,通过搭建本地的pod仓库,直接在podfile中添加指定的下载地址,就可以实现对被测试的app注入覆盖率SDK。 2.8.4.1 开发iOS覆盖率获取Pod私有库 在网上查找了相应的开发方法后,决定开发自己的依赖库,开发方法及步骤如下: 1,开发新的包 (1)通过Xcode创…...
Redhat(6)-ansible-变量
变量 1.作用域 Global scope:命令行中设置。 Play scope:play中设置。 Host scope :inventory中定义、facts收集或任务中注册,在主机组和主机上设置。 1.全局变量 1.1cmd命令 #1.全局变量 #显示变量 echo %PATH1.2.ansible变量 全局变量 var变量不加…...
麦科信光隔离探头在碳化硅(SiC)MOSFET动态测试中的应用
碳化硅(SiC)MOSFET 是基于宽禁带半导体材料碳化硅(SiC)制造的金属氧化物半导体场效应晶体管,相较于传统硅(Si)MOSFET,具有更高的击穿电压、更低的导通电阻、更快的开关速度以及更优异…...
android audiorecord
这里写目录标题 初始化失败记录 AudioRecord 初始化及参数介绍基本初始化参数详解1. audioSource (音频源)2. sampleRateInHz (采样率)3. channelConfig (声道配置)4. audioFormat (音频格式)5. bufferSizeInBytes (缓冲区大小) 完整初始化示例使用注意事项 参考地址 初始化失败…...
有一个变量 在有些线程没有加锁 有些线程加锁了,那我在这些加锁的线程中能起到对应的作用吗
这是一个非常经典、但也很危险的问题。 🧨 简单结论: 如果一个变量在某些线程访问时没有加锁,即使其他线程对它加了锁,也: ❌ 不能保证线程安全! ❌ 加锁的部分不会“保护”未加锁的部分! &am…...
【人工智能】AI大模型开发数学基础指南
目录 学习内容**1. 线性代数****2. 概率与统计****3. 微积分****4. 优化理论****5. 信息论****6. 数值计算****7. 离散数学****8. 统计学进阶****如何学习?****总结** 如何学习**1. 明确学习目标****2. 分阶段学习计划****阶段 1:夯实基础****阶段 2&…...
直流减速电机控制实验:Simulink应用层开发(3)
文章目录 1 阶段目标2 单元测试方法3 单元测试过程3.1 按键指令识别测试3.2 电机状态转换测试4 代码生成5 总结1 阶段目标 本文是《直流减速电机控制实验》的第四部分,会通过图文结合的方式,手把手带读者操作Simulink工具进行直流减速电机的应用层开发。 本章主要将《直流减…...
隔行换色总结
功能效果展示: 第一种思路: 使用数组,将数组的内容渲染到页面上,序号也就是将数组的下标输出到第一个td上,将数组的内容输出到第二个td上,(使用拼接字符串) 具体操作: …...
【kind管理脚本-2】脚本使用说明文档 —— 便捷使用 kind 创建、删除、管理集群脚本
当然可以,以下是为你这份 Kind 管理脚本写的一份使用说明文档,可作为 README.md 或内部文档使用: 🚀 Kind 管理脚本说明文档 本脚本是一个便捷的工具,帮助你快速创建、管理和诊断基于 Kind (Kubernetes IN Docker) 的…...
Python星球日记 - 第13天:封装、继承与多态
🌟引言: 上一篇:Python星球日记 - 第12天:面向对象编程(OOP)基础 名人说:不要人夸颜色好,只留清气满乾坤(王冕《墨梅》) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、引言二、封装的概念与实现1. 公有属性与私有属性2. 使用getter和sett…...
基于AT89C52单片机的GSM上报智能家居报警温度烟雾防盗系统
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/90579530?spm1001.2014.3001.5503 功能介绍: 1、功能:具有温度、烟雾、入侵报警功能,采用LCD1602液晶显示屏实时显示温度值与…...
北重数控滑台厂家:机器人地轨究竟是如何运作的,又在哪些领域发光发热呢?
机器人地轨是指利用机器人技术在地面上移动或执行任务的轨道系统。这种系统通常包括导轨、传动装置、传感器和控制系统等组成部分。机器人地轨的运作原理是通过控制传动装置沿着导轨移动,同时利用传感器获取周围环境信息并通过控制系统进行实时调节。 机器人地轨在…...
2025最新系统 Git 教程(三)
2.3 Git 基础 - 查看提交历史 查看提交历史 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的工具是 git log 命令。 我们使用一个非常简单的 simplegit 项目作为示例。 运行下面的命令获取该项目&…...
显示器各类异常处理方法
显示器各类异常处理方法 导航 文章目录 显示器各类异常处理方法导航画面无显示/黑屏/无HDMI信号输入显示器闪烁显示器花屏显示画面模糊或扭曲显示器颜色异常显示器出现死点或亮点 画面无显示/黑屏/无HDMI信号输入 首先应该检查的是显示器电源(真的有人弄掉电源…...
Error 1062 (23000): Duplicate entry ‘‘ for key ‘id‘`
目录 Error 1062 (23000): Duplicate entry for key id1. **问题分析**2. **解决方法****步骤 1:检查 id 字段的值****步骤 2:检查表结构****步骤 3:检查现有数据****步骤 4:检查插入逻辑****步骤 5:修改表结构&#…...
谈谈模板方法模式,模板方法模式的应用场景是什么?
一、模式核心理解 模板方法模式是一种行为设计模式,通过定义算法骨架并允许子类重写特定步骤来实现代码复用。 如同建筑图纸规定房屋结构,具体装修由业主决定,该模式适用于固定流程中需要灵活扩展的场景。 // 基础请求处理…...
未来蓉城:科技与生态共舞的诗意栖居-成都
故事背景 故事发生在中国四川成都的2075年,展现科技与自然深度交融的未来城市图景。通过六个充满想象力的生态装置场景,描绘市民在智慧城市中诗意栖居的生活状态,展现环境保护与人文传承的和谐共生。 故事内容 在电子竹林轻轨站,通…...
模仿axios的封装效果来封装fetch,实现baseurl超时等
因为要在cocos游戏项目里面发送网络请求获取数据,并且还有可能用到websocket发送请求,所以这里封装一个fetch放便使用: // fetch封装// 基础配置 const BASE_URL 你的url const TIMEOUT 5000// 请求封装 const http async (url: string, …...
Linux(CentOS10) gcc编译
本例子摘自《鸟哥的linux私房菜-基础学习第四版》 21.3 用make进行宏编译 书中的代码在本机器(版本见下)编译出错,改正代码后发布此文章: #kernel version: rootlocalhost:~/testmake# uname -a Linux localhost 6.12.0-65.el10.x86_64 #1…...
Design Compiler:语法检查工具dcprocheck
相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 dcprocheck是一个在Design Compiler存在于安装目录下的程序(其实它是一个指向snps_shell的符号链接,但snps_shell可以根据启动命令名判…...
根据日期格式化的常见规则和标准
根据日期格式化的常见规则和标准,2025年1月9日17:00可以正常格式化。具体分析如下: 1. 日期合法性验证 日期2025年1月9日不存在逻辑错误(如2月30日等非法日期),且时间17:00(24小时制)符合规范…...
macOS Chrome - 打开开发者工具,设置 Local storage
文章目录 macOS Chrome - 打开开发者工具设置 Local storage macOS Chrome - 打开开发者工具 方式2:右键点击网页,选择 检查 设置 Local storage 选择要设置的 url,显示右侧面板 双击面板,输入要添加的内容 2025-04-08ÿ…...
idea 的 WEB-INF 下没有 classes 编译文件,如何添加?
idea 打开项目却没有在 WEB-INF 下找到 classes 编译文件 添加流程如下: 1、选中 File ->Project Structure 后右击 2、选中 Modules ->选中项目 ->点击 Paths ->修改 output path为:项目绝对路径\WebRoot\WEB-INF\classes 3、修改完成后&…...
EasyExcel结合多线程+控制sheet页全量导出
业务分析 内部平台需要一个导出mysql数据到excel的方法,所以使用了EasyExcel 因为EasyExcel的sheet页是放到一个List里面的,如果把百万量级的数据放到sheet页中全量写入会有OOM风险,所以最终选择的方案是分sheet页写入 同时因为该平台是多…...
【学习笔记】RL4LLM
字数溢出,分了一半出来 上半段:LLMRL 文章目录 8 [RL4LLM] 理解 reasoning model Tokenizer 的 chat template,vllm inferencetokenizerchat templatedistill tokenizerqwen tokenizer apply chat templatevllm inference 9 [RL4LLM] PPO wo…...
在Windows搭建gRPC C++开发环境
一、环境构建 1. CMake Download CMake 2. Git Git for Windows 3. gRPC源码 git clone --recurse-submodules -b v1.67.1 --depth 1 --shallow-submodules https://github.com/grpc/grpc grpc-1.67.1二、使用CMake生成工程文件 mkdir cmake_build cd cmake_build cmake…...
NO.76十六届蓝桥杯备战|数据结构-单调栈|发射站|Largest Rectangle in a Histogram(C++)
什么是单调栈? 单调栈,顾名思义,就是具有单调性的栈。它依旧是⼀个栈结构,只不过⾥⾯存储的数据是递增或者递减的。这种结构是很容易实现的(如下⾯的代码),但重点是维护⼀个单调栈的意义是什么 …...
消息队列(Message Queue)简介
消息队列是一种进程间通信(IPC)机制,允许不同进程通过发送和接收消息进行 异步通信。它的核心特点包括: 解耦:消息队列解耦了生产者和消费者,简化了系统设计。 持久化存储:支持将消息存储在队列…...
动/静态库
1.先了解一下动静态库 上图可以看出来静态库就是由一堆进过链接阶段的.o文件组成的.a文件。在这里必须要强调的是库文件格式一定是libxxx.a/so在你进行路径查找使用的时候要去掉lib和后缀使用! 静态库 概念:在程序编译链接阶段,其代码被完整…...
KWDB创作者计划—边缘计算:从概念到落地的技术解读
引言 随着物联网(IoT)和人工智能(AI)的快速发展,数据量呈爆炸式增长,传统的云计算架构逐渐暴露出延迟高、带宽占用大等问题。边缘计算作为一种新兴的分布式计算范式,正在改变数据处理的方式。本…...
ubuntu根文件系统通过uMTP-Responder实现usb的MTP功能
实现mtp设备 添加服务 /home/flynn/firfly_rootfs/lib/systemd/system/adbd.service #start [Unit] Description Adbd for linux Beforerockchip.service[Service] Typeforking ExecStart/etc/init.d/adbd.sh start ExecStop/etc/init.d/adbd.sh stop ExecReload/etc/init.d…...
8、nRF52xx蓝牙学习(boards.h文件学习)
boards.h文件的代码如下: #ifndef BOARDS_H #define BOARDS_H#include "nrf_gpio.h" #include "nordic_common.h"#if defined(BOARD_NRF6310)#include "nrf6310.h" #elif defined(BOARD_PCA10000)#include "pca10000.h" #…...
辛格迪客户案例 | 河南宏途食品实施电子合约系统(eSign)
01 河南宏途食品有限公司:食品行业的数字化践行者 河南宏途食品有限公司(以下简称“宏途食品”)作为国内食品行业的创新企业,专注于各类食品的研发、生产和销售。公司秉承“质量为先、创新驱动、服务至上”的核心价值观ÿ…...
webrtc-stats
1. RTP 相关统计 1.1 inbound-rtp (接收端统计) 接收到的 RTP 流统计信息,包含以下关键指标: bytesReceived: 接收到的字节总数packetsReceived: 接收到的数据包总数packetsLost: 丢失的数据包数量jitter: 数据包到达时间的抖动(毫秒&…...
【LangChain框架组成】 LangChain 技术栈的模块化架构解析
目录 整体架构概述 整体架构层级划分 模块详细解析 1. 部署与服务层(LangServe & Deployments) 2. 应用模板层(Templates & Committee Architectures) 3. 核心功能层(LangChain) 4. 社区扩展…...
RNN、LSTM、GRU汇总
RNN、LSTM、GRU汇总 0、论文汇总1.RNN论文2、LSTM论文3、GRU4、其他汇总 1、发展史2、配置和架构1.配置2.架构 3、基本结构1.神经元2.RNN1. **RNN和前馈网络区别:**2. 计算公式:3. **梯度消失:**4. **RNN类型**:(查看发展史)5. **…...
用TypeScript和got库编写爬虫程序指南
用TypeScript和got库写一个爬虫程序。首先,我得确认他们对TypeScript和Node.js的基础了解,可能他们已经有了一些JS的经验,但不确定。接下来,需要明确爬虫的目标,比如要爬取的网站、需要的数据类型以及处理方式。 首先…...
使用 Spring Boot 快速构建企业微信 JS-SDK 权限签名后端服务
使用 Spring Boot 快速构建企业微信 JS-SDK 权限签名后端服务 本篇文章将介绍如何使用 Spring Boot 快速构建一个用于支持企业微信 JS-SDK 权限校验的后端接口,并提供一个简单的 HTML 页面进行功能测试。适用于需要在企业微信网页端使用扫一扫、定位、录音等接口的…...
【软考-架构】13.2、软件层次风格
✨资料&文章更新✨ GitHub地址:https://github.com/tyronczt/system_architect 文章目录 2、层次架构风格两层C/S架构三层C/S架构三层B/S架构富互联网应用RIAMVC架构MVP架构MVVM架构 ✨3、面向服务的架构风格SOASOA中应用的关键技术WEB Service企业服务总线ESB …...
Java 进阶-全面解析
目录 异常处理 集合框架 List 集合 Set 集合 Map 集合 文件与字符集 IO 流 多线程 通过继承Thread类创建线程 通过实现Runnable接口创建线程 线程同步示例 线程通信示例 网络编程 Java 高级技术 反射机制 动态代理 注解 异常处理 在 Java …...
mongodb 创建keyfile
在 MongoDB 中,keyFile 是用于副本集成员间内部认证的密钥文件。它是一个包含随机字符串的文件,所有副本集成员必须使用相同的 keyFile 进行通信。以下是创建和配置 keyFile 的详细步骤。 创建 KeyFile 的步骤 1. 生成随机字符串 使用以下命令生成一个…...
工业4.0时代,RK3562工控机为何成为智慧工位首选?
在制造业数字化转型的浪潮中,智慧车间已成为提升生产效率、降低运营成本的关键战场。作为智慧车间的"神经末梢",工位机的智能化程度直接影响着整个生产线的运行效率。RK3562工控机凭借其强大的计算性能、稳定的运行表现和丰富的接口配置&#…...
WPF 资源加载问题:真是 XAML 的锅吗?
你的观察很敏锐!确实,在 WPF 项目中,.cs 文件主要负责逻辑实现,而资源加载的问题通常跟 XAML(以及它背后的 .csproj 配置)关系更大。我会围绕这个观点,用 CSDN 博客风格详细解释一下 .cs、XAML …...
5. 深度剖析:Spring AI项目架构与分层体系全解读
1、前言 前面我们已经可以通过简单的方式集成Spring AI进行快速开发了。授人以鱼不如授人以渔,我们还是需要了解Spring AI的项目结构,以及他的一些核心概念。 2、项目结构 我们将Spring AI代码直接fork到我们自己的仓库中。fork的目的是方便我们为了学…...