Unity3D测量距离实现方法(一)

系列文章目录

unity工具


文章目录

  • 系列文章目录
  • 👉前言
  • 👉一、Unity距离测量
    • 1-1 制作预制体
    • 1-2 编写测量的脚本
  • 👉二、鼠标点击模型进行测量
  • 👉二、字体面向摄像机的方法
  • 👉二、最短距离测量方法
  • 👉三、壁纸分享
  • 👉总结


👉前言

有时候会用到测量距离的问题,所以写了一个测量的小工具,方便使用,简单记录一下
大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
欢迎点赞评论哦.
下面就让我们进入正文吧 !


提示:以下是本篇文章正文内容,下面案例可供参考
效果展示

测量距离

👉一、Unity距离测量

1-1 制作预制体

创建一个空物体,空物体下面创建两个小球并设置一下大小,接着创建一个3D字体在空物体下面,最后在空物体上面添加LineRenderer组件
创建好的结构如下
在这里插入图片描述
st和ed是小球,这里切记小球不能带碰撞盒,带碰撞盒就会出现意外的情况 tm是3d字体
linerenderer组件设置一下Positions的数量为2,要么就在代码里面设置为2
具体怎么设置就看你心情喽

1-2 编写测量的脚本

脚步挂载到刚刚创建的空物体上面即可

using UnityEngine;
using TMPro;//距离单位
public enum UnitType
{ mm = 1000,  //毫米cm = 100,   //厘米dm = 10,    //分米m  = 1,     //米
}//[ExecuteInEditMode]
public class Line : MonoBehaviour
{public GameObject StObj, EdObj;TextMesh tm;LineRenderer line;[Header("实时绘制(较多会卡顿)")]public bool IsRt = false;[Header("线的粗细")]public float LineWidth = 0.05f;Material LineMat;[Header("线的颜色")]public Color LineColor;[Header("长度单位")]public UnitType unittype;Transform tram;private void Start(){LineMat = new Material(Shader.Find("Standard"));CreateTm();CreateLine();}void CreateTm(){tram = transform.Find("tm");if (tram != null)tm = tram.GetComponent<TextMesh>();if (tm == null){tm = new GameObject("tm").AddComponent<TextMesh>();tm.color = Color.white;tm.fontSize = 4;tm.transform.SetParent(this.transform);//tm.GetComponent<RectTransform>().sizeDelta = new Vector2(2, 1);//tm.alignment = TextAlignmentOptions.Center;}}void CreateLine(){line = gameObject.GetComponent<LineRenderer>();if (line == null)line = gameObject.AddComponent<LineRenderer>();line.material = LineMat;}public void DrawLineInfo(){tm.text = (Vector3.Distance(StObj.transform.position, EdObj.transform.position) * (int)unittype).ToString("F1") + unittype;tm.transform.position = (StObj.transform.position + EdObj.transform.position) / 2+new Vector3(0,0.1f,0);line.SetPositions(new Vector3[] { StObj.transform.position, EdObj.transform.position });line.startWidth = LineWidth;line.endWidth = LineWidth;LineMat.color = LineColor;}void Update(){if (IsRt)DrawLineInfo();}
}

👉二、鼠标点击模型进行测量

新建一个脚本进行编写
代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;//测量距离
public class RangeFinding : MonoBehaviour
{//总控制public bool isClbool;private Vector3 posOne, posTwo;//测量控制public bool isOpenDistance;private int distanceInt;   //计数控制public Transform prefabTransform;  //测量的预制体private Transform myDistanceObj;public Transform allCLParentTransform;  //所有预制体生成的父节点// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){if (isClbool){if (Input.GetMouseButtonDown(0)){posOne = Input.mousePosition;}Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;//距离if (isOpenDistance){if (Input.GetMouseButtonUp(0)){posTwo = Input.mousePosition;if (Physics.Raycast(ray, out hit, 1000) && posOne == posTwo){if (distanceInt == 0){distanceInt++;//鼠标点击克隆物体myDistanceObj = Instantiate(prefabTransform, allCLParentTransform);// transform.TransformPoint(Prefab,hit.poit, Quaternion.identity);myDistanceObj.transform.GetChild(0).position = hit.point;}else{myDistanceObj.transform.GetChild(1).position = hit.point;//isOpenJL = false;distanceInt = 0;}}}if (distanceInt > 0){if (Physics.Raycast(ray, out hit, 1000)){myDistanceObj.transform.GetChild(1).position = hit.point;}}}}}
}

脚本随便挂载,你开心就好
在这里插入图片描述
挂载完毕运行测试即可,把两个bool值勾选上就可以进行测量了
运行结果,上面我已经放过了,就在放一下吧

测量距离

👉二、字体面向摄像机的方法

如果生成的距离字体不面向摄像机的话,需要加一下面向摄像机的方法,要不然没有感觉
代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class LookAtCamera : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){transform.LookAt(Camera.main.transform);}
}

此代码挂载到我们一开始创建的tm上面
在这里插入图片描述

👉二、最短距离测量方法

还是用到上面的预制体,其他不用改
废话不多说了直接上代码 代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 最短距离  垂直距离
/// </summary>
public class MakeBeelineController : MonoBehaviour
{public bool isClbool;public bool isOpenMDistance;private Vector3 posOne, posTwo;private int distanceInt;   //记录次数public Transform prefabTransform;  //测量的预制体private Transform myDistanceObj;public Transform allCLParentTransform;  //所有预制体生成的父节点// Start is called before the first frame updatevoid Start(){}public void OpenCLLLLLL(){isClbool = true;isOpenMDistance = true;}public void CloseCLLLLLL(){isClbool = false;isOpenMDistance = false;if (allCLParentTransform.childCount == 0) return;if (allCLParentTransform.childCount > 0){for (int i = 0; i < allCLParentTransform.childCount; i++){Destroy(allCLParentTransform.GetChild(i).gameObject);}}}// Update is called once per framevoid Update(){if (isClbool){if (Input.GetMouseButtonDown(0)){posOne = Input.mousePosition;}Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit,hit1;//最短距离if (isOpenMDistance){if (Input.GetMouseButtonUp(0)){posTwo = Input.mousePosition;if (Physics.Raycast(ray, out hit) && posOne == posTwo){myDistanceObj = Instantiate(prefabTransform, allCLParentTransform);myDistanceObj.transform.GetChild(0).position = hit.point;Vector3 fwd = Vector3.down; // myDistanceObj.transform.GetChild(0).TransformDirection(Vector3.down);if (Physics.Raycast(myDistanceObj.transform.GetChild(0).position, fwd, out hit1, 1000)){myDistanceObj.transform.GetChild(1).position = hit1.point;}else{Destroy(myDistanceObj.gameObject);}}}}}}
}

场景挂载的示例图如下
在这里插入图片描述

到此距离测量的方法已经结束了,如有其他需要或疑问,请留言评论即可,如需要其他的功能请自行修改添加扩展哦,爱你们么么哒

👉三、壁纸分享

请添加图片描述
请添加图片描述
下一篇文章分享关于面积的测量

👉总结

本次总结的就是测量距离的实现,有需要会继续添加新的
如能帮助到你,就帮忙点个赞吧,三连更好哦,谢谢
你的点赞就是对博主的支持,有问题记得留言评论哦!
不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒

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

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

相关文章

Python中的装饰器链(decorator chain)是什么

在Python中&#xff0c;装饰器是一种高级功能&#xff0c;它允许你在不修改函数或类代码的情况下&#xff0c;为它们添加额外的功能。装饰器通常用于日志记录、性能测量、权限检查等场景。当多个装饰器应用于同一个函数或类时&#xff0c;它们会形成一个装饰器链&#xff08;de…

Go语言中,公司gitlab私有仓库依赖拉取配置

为什么要考虑私有仓库 Go语言目前都已经采用了官方统一的 go modules 来管理依赖&#xff0c;后续也不太可能出现比较乱的生态&#xff0c; 因此了解下如何让这个依赖管理正常工作是非常必要的。 对于Github或者其他公有仓库&#xff0c;依赖管理是非常直接和方便的,设置好GO…

C++ 依赖的C库查看和下载

依赖库查询&#xff1a;ldd 指令 # ldd libcyber.solinux-vdso.so.1 (0x0000ffff86b52000)libopt_proto.so > /home/caros/cyberrt/lib/libopt_proto.so (0x0000ffff84c4a000)libboost_filesystem.so.1.73.0 > /opt/orin/usr/local/lib/libboost_filesystem.so.1.73.0 (…

Java版工程项目管理平台:以源码驱动,引领工程企业数字化转型

在当今数字化时代&#xff0c;随着企业的扩张和业务的增长&#xff0c;传统的工程项目管理方法已显不足。为了提升管理效率、减轻工作负担、增强信息处理的快速性和精确度&#xff0c;工程企业亟需借助数字化技术进行转型升级。本文将向您展示一款基于Spring Cloud、Spring Boo…

SS2D反向传播问题记录【未解决】

使用SS2D写了一个简单的神经网络进行训练&#xff0c;但是训练报错&#xff1a; NotImplementedError: You must implement either the backward or vjp method for your custom autograd.Function to use it with backward mode AD. 环境&#xff1a; CUDA11.8 torch2.0.0 mam…

AI大模型日报#0607:10家国产大模型、GPT-4o挑战高考作文 | OpenAI公开破解GPT-4新方法

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一万物”&#xff08;Yi-Large&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅读&#xf…

TS 系列:使用元祖生成联合类型

需求&#xff1a;有这么个需求&#xff0c;我们有两个数组&#xff0c;一个记录扑克牌花色&#xff0c;一个记录扑克牌点数&#xff0c;需要有一个函数&#xff0c;传递两个值&#xff0c;根据传递的值生成扑克牌&#xff0c;需要我们定义参数的类型检查。 思路&#xff1a;肯…

2024速通python之python高阶技巧

文章目录 一、闭包1.什么是闭包2.优缺点3.nonlocal关键字 二、装饰器1.什么是装饰器2.举例3.传统方式4.装饰器方式5.语法糖写法 三、多线程1.线程参数2.多线程编程 四、网络编程1.Socket服务端编程2.Socket客户端编程 「章节总览」       【2024速通python之python基础…

超过20W个高质量组件的开源PCB库

项目介绍 Celestial Altium Library是由Altium行业专家Mark Harris创建的一个庞大的免费开源数据库库&#xff0c;专为Altium Designer而设计&#xff0c;库中包含超过20万个优质组件 . 特点 高质量数据&#xff1a;Celestial Altium Library注重数据的质量&#xff0c;用户可…

Day14:响应式网页

通过媒体查询、Bootstrap 框架完成腾讯全端网页响应式布局。 一、响应式布局方案 1、什么是响应式布局 它的主要特点是能够使网页根据不同的设备屏幕尺寸&#xff08;如桌面电脑、平板电脑、手机等&#xff09;和分辨率自动调整布局和显示效果&#xff0c;以提供最佳的用户体…

python的plt.axis()、plt.xlim() 和 plt.ylim()函数

坐标轴相关设置1、plt.axis():坐标轴设置 函数 plt.axis(*v, **kwargs) 主要用于设置坐标轴的属性,返回值为当前的坐标轴范围 [xmin, xmax, ymin, ymax],几种调用方式如下: 调用方式 说明 axis() 返回当前的坐标轴范围 [xmin, xmax, ymi…

pytorch构建模型训练数据集

pytorch构建模型训练数据集 pytorch构建模型训练数据集1.AlexNet:1.1.导入必要的库&#xff1a;1.2.数据预处理和增强&#xff1a;1.3.加载数据集&#xff1a;1.4.划分测试集和训练集&#xff1a;1.5.创建数据加载器&#xff1a;1.6.加载AlexNet模型&#xff1a;1.7.修改模型以…

qt qDebug兼容LOGE

目录 普通qDebug用法 qt qDebug兼容LOGE 模板参数2实现 qDebug 实现LOGE一样的用法,这样Android和qt同时支持LOGE打印日志 普通qDebug用法 #include <QApplication> #include <QDebug>int main(int argc, char *argv[]) {QApplication app(argc, argv);int ret…

帝国cms接入腾讯云人脸识别认证代码

利用帝国cms在做一些会员系统的时候&#xff0c;需要做人脸识别认证&#xff0c;之前接入了某api接口&#xff0c;发现身份证识别率真的低&#xff0c;还好充值的少&#xff0c;否则要出问题&#xff0c;后来发现会员注册率降低了不少&#xff0c;最终还是决定使用腾讯云的人脸…

三十五篇:数字化转型的引擎:赋能企业的ERP系统全景

数字化转型的引擎&#xff1a;赋能企业的ERP系统全景 1. 引言 在这个快速变化的数字时代&#xff0c;现代企业面临着前所未有的挑战和机遇。企业资源计划&#xff08;ERP&#xff09;系统&#xff0c;作为数字化转型的核心&#xff0c;扮演着至关重要的角色。它不仅是企业运营…

第二十六章HTML与CSS书写规范

1.HTML书写规范 1.文档类型声明及编码 统一为html5 声明类型。编码统一为utf-8。 2.页面tdk TDK是一个缩写&#xff0c;其中“T”表示为网页定义标题&#xff0c;“D”表示为网页定义描述 description&#xff0c;“K”表示为搜索引擎定义关键词keywords。 1、<title&g…

NFT Insider #133:苏富比将拍卖BAYC系列NFT,Taiko创世NFT系列已上线

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members &#xff08;https://twitter.com/WHALEMembers&#xff09;、BeepCrypto &#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜…

立创·天空星开发板-GD32F407VE-EXTI

本文以 立创天空星开发板-GD32F407VET6-青春版 作为学习的板子&#xff0c;记录学习笔记。 立创天空星开发板-GD32F407VE-EXTI 中断硬件触发中断示例软件触发中断示例 中断 中断分为内部中断和外部中断 外部中断是由外部设备&#xff08;如按键、传感器、通信接口等&#xff09…

rollup.js(入门篇)

前沿 Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xff0c;而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许…

如何在Python中处理时间和日期

在Python中处理时间和日期&#xff0c;我们通常使用内置的datetime模块。这个模块提供了类来操作日期和时间&#xff0c;包括date、time、datetime、timedelta以及tzinfo。以下是datetime模块的一些基本用法&#xff1a; 1. 获取当前日期和时间 python复制代码 from datetime…