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

Unity_通过鼠标点击屏幕移动屏幕里的一个对象

文章目录

  • 一、获取到点击物体的Tansform(摁下鼠标左键的瞬间)
  • 二、移动点击的物体(摁着鼠标左键不放)
  • 三、松开左键清理被移动对象属性
  • 总结

注:本文章只是学习总结的笔记,视频链接


一、获取到点击物体的Tansform(摁下鼠标左键的瞬间)

实现思路:通过Camera的ScreenPointToRay方法和Input.mousePosition鼠标坐标生成创建Ray射线,再通过Physics的Raycast方法和射线,获得被碰撞的物体相关信息存储在RaycastHit里。
实现代码:

using UnityEngine;public class 点击移动物体 : MonoBehaviour
{public Camera cam;public Transform 被点击物体;//clickedOBJ// Update is called once per framevoid Update(){if (Input.GetMouseButtonDown(0)) {Ray ray = cam.ScreenPointToRay(Input.mousePosition);RaycastHit hit;Physics.Raycast(ray, out hit);被点击物体 = hit.transform;}}
}

二、移动点击的物体(摁着鼠标左键不放)

思路:通过相机的射线和距离获得一个点,设置给物体从而达到移动物体。
距离如何获取:
方法一:获取到点击物体时hit对象中存射线起点到碰撞点的距离
方法二:通过两个点算一个距离,也就的那被移动对象的坐标和相机坐标算一个距离
代码如下:

using System.Globalization;
using UnityEngine;public class 点击移动物体 : MonoBehaviour
{public Camera cam;public Transform 被点击物体;//clickedOBJpublic float 距离;//distance// Update is called once per framevoid Update(){if (Input.GetMouseButtonDown(0)) {Ray ray = cam.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if(Physics.Raycast(ray, out hit)){被点击物体 = hit.transform;距离 = Vector3.Distance(cam.transform.position, hit.transform.position);float 距离1 = hit.distance; //这是视频老师写的获取应该相机和碰撞点的距离Debug.Log($"1:{距离}\n2:{距离1}");}}if(Input.GetMouseButton(0)){if(被点击物体){Ray ray = cam.ScreenPointToRay(Input.mousePosition);被点击物体.position = ray.GetPoint(距离);}}}
}

三、松开左键清理被移动对象属性

using System.Globalization;
using UnityEngine;public class 点击移动物体 : MonoBehaviour
{public Camera cam;public Transform 被点击物体;//clickedOBJpublic float 距离;//distance// Start is called once before the first execution of Update after the MonoBehaviour is createdvoid Start(){}// Update is called once per framevoid Update(){if (Input.GetMouseButtonDown(0)) {Ray ray = cam.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if(Physics.Raycast(ray, out hit)){被点击物体 = hit.transform;距离 = Vector3.Distance(cam.transform.position, hit.transform.position);float 距离1 = hit.distance; //这是视频老师写的获取应该相机和碰撞点的距离Debug.Log($"1:{距离}\n2:{距离1}");}}if(Input.GetMouseButton(0)){if(被点击物体){Ray ray = cam.ScreenPointToRay(Input.mousePosition);被点击物体.position = ray.GetPoint(距离);}}if (Input.GetMouseButtonUp(0)) {被点击物体 = null;}}
}

总结

射线生成,射线检测,射线+距离获得坐标

http://www.dtcms.com/a/283835.html

相关文章:

  • Redis4缓存穿透:布隆过滤器与空对象方案
  • Python爬虫实战:Requests与Selenium详解
  • 电脑截图软件排行榜 Windows和mac电脑截图软件TOP10
  • Perspective:一款开源的交互式分析和数据可视化组件
  • ZKmall开源商城架构助力增长:多端流量聚合与用户体验
  • macOS 12.7.6部署Ollama+Dify避坑指南
  • 集群聊天服务器各个类进行详解
  • LAMP迁移LNMP Nginx多站点配置全流程
  • 大型语言模型(LLM)在网络安全中最具商业价值的应用场景(Grok3 回答 DeepSearch模式)
  • Java-75 深入浅出 RPC Dubbo Java SPI机制详解:从JDK到Dubbo的插件式扩展
  • 新版本flutter(3.32.7) android 端集成百度地图sdk
  • 网络编程7.17
  • cors跨域资源共享
  • Python 网络爬虫 —— 代理服务器
  • 阿里云-通义灵码:隐私保护机制—为数据安全筑起铜墙铁壁
  • Web3.0 实战项目、简历打造、精准投递+面试准备
  • MongoDB 与MySQL 及es的区别
  • 黑客知识-攻击
  • 数据仓库分层经典架构:ODS、DWD、DWS
  • 安卓 GoFasting(间歇性断食)v1.03.35.0708
  • python-字典、集合、序列切片、字符串操作(笔记)
  • cdh6.3.2的hive使用apache paimon格式只能创建不能写报错的问题
  • Thymeleaf 表单绑定与验证详解
  • Rabbitmq direct 模式与 finout区别
  • Apache Ignite 的 Pages Writes Throttling(页面写入节流)
  • C++ - 仿 RabbitMQ 实现消息队列--C++11 异步操作实现线程池
  • InfluxDB 3与Apache Parquet:打造高性能时序数据存储与分析解决方案
  • Apache DolphinScheduler介绍与部署
  • UE5 Nanite使用
  • 下班倒计时