当前位置: 首页 > news >正文

【Unity开发】Unity实现对模型移动、缩放、旋转操作的功能

一、效果展示

Unity实现模型移动、旋转和缩放功能

通过鼠标实现对模型的不同操作
鼠标中键点击,模型变为高亮状态,表示选中状态,再次点击其他地方,则取消高亮,表示未选中状态
鼠标中键上下滚动,实现模型的缩放
鼠标左键点击或长按,实现模型的移动
鼠标右键点击,左右滑动,实现模型的水平旋转;同时按下shift键,上下滑动,实现模型垂直旋转

二、实现完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ModelControl : MonoBehaviour
{private Material originalMaterial;      //模型原始材质private Material highlightMaterial;     //模型选中时的高亮材质private Renderer myRenderer;            //模型渲染组件private bool isSelect = false;          //模型是否被旋转// Start is called before the first frame updatevoid Start(){//确保模型在地面上方KeepOnGround();//新建一个高亮材质highlightMaterial = new Material(Shader.Find("Universal Render Pipeline/Lit"));highlightMaterial.color = Color.yellow;highlightMaterial.SetFloat("_Smoothness", 0.8f);highlightMaterial.SetColor("_EmissionColor", Color.yellow * 1.2f); // 开启自发光//获取原始材质myRenderer = GetComponent<Renderer>();if (myRenderer != null){originalMaterial = myRenderer.material;}//判断是否包含碰撞体组件,不包含直接添加if (GetComponent<Collider>() == null){gameObject.AddComponent<BoxCollider>();}}// Update is called once per framevoid Update(){if (Input.GetMouseButton(0)&&isSelect){//鼠标左键控制移动Drag();}if (Input.GetMouseButton(1)&&isSelect){//鼠标右键控制旋转Rotate();}float scroll = Input.GetAxis("Mouse ScrollWheel");if (Mathf.Abs(scroll) > 0.01f&&isSelect){// 鼠标中键滚轮:缩放模型Scale(scroll);}if (Input.GetMouseButton(2)){//鼠标中键点击,进行模型选中Select();}}/// <summary>/// 模型选中方法  选中显示高亮  否则选择原始材质/// </summary>public void Select(){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);if (Physics.Raycast(ray, out RaycastHit hit)){//鼠标点击到模型if (hit.collider.gameObject == this.gameObject){myRenderer.material = highlightMaterial;isSelect = true;}else{//点击到别的模型myRenderer.material = originalMaterial;isSelect = false;}}else{//点击到空白处myRenderer.material = originalMaterial;isSelect = false;}}/// <summary>/// 模型移动方法/// </summary>void Drag(){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit)){if (hit.transform.name == "Plane"){this.transform.position = hit.point;KeepOnGround();}}}/// <summary>/// 模型旋转方法 鼠标右键=左右旋转 shift+鼠标右键=上下旋转/// </summary>void Rotate(){       if (Input.GetKey(KeyCode.LeftShift)){float rotY = Input.GetAxis("Mouse Y") * 5f;this.transform.Rotate(Vector3.right, rotY, Space.World);}else{float rotX = Input.GetAxis("Mouse X") * 5f;this.transform.Rotate(Vector3.up, rotX, Space.World);}}/// <summary>/// 模型缩放方法/// </summary>/// <param name="scroll">缩放倍率</param>void Scale(float scroll){float scaleFactor = 1 + scroll;this.transform.localScale *= scaleFactor;KeepOnGround();}/// <summary>/// 确保模型在地面上方,防止穿模/// </summary>void KeepOnGround(){// 计算当前模型的边界包围盒Renderer renderer = GetComponentInChildren<Renderer>();if (renderer != null){Bounds bounds = renderer.bounds;float bottomY = bounds.min.y;float offsetY = transform.position.y - bottomY;float targetY = 0f; // 地面高度为0(可根据你的地面高度调整)Vector3 pos = transform.position;pos.y += targetY - bottomY;this.transform.position = pos;}}
}
http://www.dtcms.com/a/266483.html

相关文章:

  • 基于Docker构建OrangePi5 SDK环境
  • 408第三季part2 - 计算机网络 - 计算机网络基本概念
  • 闲庭信步使用SV搭建图像测试平台:第二十九课——绘制正弦波的图片
  • Android 实现底部弹窗
  • Datasophon的Ranger安装时数据库踩坑及问题解决
  • NeighborGeo:基于邻居的IP地理定位(三)
  • NeighborGeo:基于邻居的IP地理定位(二)
  • 【WEB】Polar靶场 6-10题 详细笔记
  • Jenkins-Email Extension 插件插件
  • 前端开发-前置知识
  • Android WebView 性能优化指南
  • Vue2中的keep-alive:组件状态缓存与性能优化实战指南
  • Android发展历程
  • Android 安装使用教程
  • [论文精读]StruQ: Defending Against Prompt Injection with Structured Queries
  • 前端捕获异常的全面场景及方法
  • 算法题目记录
  • OTC机器人焊机节气设备
  • EPLAN 电气制图:建立自己的部件库,添加部件-加SQL Server安装教程(三)上
  • web3钱包的运作原理
  • Type-C PD快充协议智能芯片S312L详解
  • GO 语言学习 之 结构体
  • mysql索引:索引应该选择哪种数据结构 B+树 MySQL中的页 页主体 页目录 索引分类
  • C++学习笔记一
  • Mac获取终端历史
  • Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务
  • Java 与 MySQL 性能优化:MySQL全文检索查询优化实践
  • Rust+Blender:打造高性能游戏引擎
  • 宽表设计(Wide Table) 与 子表 + 类型 + 属性表设计(EAV 模型或“属性表”模型)
  • golang 中当 JSON 数据缺少结构体(struct)中定义的某些字段,会有异常吗