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 update
    void Start()
    {
        
    }

    // Update is called once per frame
    void 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 update
    void Start()
    {
        
    }

    // Update is called once per frame
    void 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 update
    void 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 frame
    void 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开发技巧,觉得有用记得一键三连哦。么么哒

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【WP】猿人学_16_js逆向_window蜜罐

https://match.yuanrenxue.cn/match/16 抓包分析 荷载一个加密参数&#xff0c;一个时间戳 时间: 2024-06-07 15:52:31时间戳: 1717746751 1717746751000时间戳和现在对得上&#xff0c;直接生成就行。 追栈 追栈找m的生成位置。 点进去打断点&#xff0c;重新点击其他…

算法导论实战(三)(算法导论习题第二十四章)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;算法启示录 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 第二十四章 24.1-3 24.1-4 2…

【TB作品】MSP430G2553单片机,MSP430 单片机读取 SHT30 传感器并显示数据

使用 MSP430 单片机读取 SHT30 传感器并显示数据 作品功能 本文介绍了如何使用 MSP430 单片机读取 SHT30 温湿度传感器的数据&#xff0c;并通过 OLED 屏幕显示实时的温度和湿度信息。通过此项目&#xff0c;您将学习如何配置 MSP430 的 I2C 接口、读取 SHT30 传感器的数据以…

Linux 中常用的设置、工具和操作

1.设置固定的ip地址步骤 1.1 添加IPADDR“所设置的固定ip地址” TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no" BOOTPROTO"static" DEFROUTE"yes" IPV4_FAILURE_FATAL"no" IPV6INIT"yes" IPV6…

【Vue】作用域插槽

插槽分类 默认插槽&#xff1a;组件内定制一处结构 具名插槽&#xff1a;组件内定制多处结构 插槽只有两种&#xff0c;作用域插槽不属于插槽的一种分类。作用域插槽只是插槽的一个传参语法 作用&#xff1a; 定义slot 插槽的同时, 是可以传值的。给 插槽 上可以 绑定数据&a…

SOA主要协议和规范

Web服务作为实现SOA中服务的最主要手段。首先来了解Web Service相关的标准。它们大多以“WS-”作为名字的前缀&#xff0c;所以统称“WS-*”。Web服务最基本的协议包括UDDI、WSDL和SOAP&#xff0c;通过它们&#xff0c;可以提供直接而又简单的Web Service支持&#xff0c;如图…

外部mysql导入

利用这个命令&#xff1a; mysql -u username -p database_name < file.sql 然后就这样。成功导入。

Rocky Linux安装与基础配置

目录 背景与起源 主要特点 目标用户 发展前景 下载 安装 常用配置命令&#xff1a; 更换镜像源 Rocky Linux 是一个开源的、由社区驱动的操作系统&#xff0c;旨在使用 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源码构建的下游二进制兼容发行版。以下是关于…

vue3 监听器,组合式API的watch用法

watch函数 在组合式 API 中&#xff0c;我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数 watch(ref,callback&#xff08;newValue,oldValue&#xff09;&#xff0c;option:{}) ref:被监听的响应式量&#xff0c;可以是一个 ref (包括计算属性)、一个响应式…

Linux Mint 默认禁用未经验证的 Flatpak 软件包

Linux Mint 默认禁用未经验证的 Flatpak 软件包 Linux Mint 新政策 Linux Mint 项目宣布了一项新政策&#xff0c;即默认禁用那些未经官方验证的 Flatpak 软件包&#xff0c;以增强用户的安全保障。 当用户选择启用未经验证的 Flatpak 软件包时&#xff0c;Linux Mint 的软…

ceph radosgw 原有zone placement信息丢失数据恢复

概述 近期遇到一个故障环境&#xff0c;因为某些原因&#xff0c;导致集群原有zone、zonegroup等信息丢失&#xff08;osd&#xff0c;pool等状态均健康&#xff09;。原有桶和数据无法访问&#xff0c;经过一些列fix后修复&#xff0c; 记录过程 恢复realm和pool相关信息 重…

二轴机器人大米装箱机:技术创新引领智能包装新潮流

在科技日新月异的今天&#xff0c;自动化和智能化已成为各行各业追求高效、精准生产的关键。作为粮食加工行业的重要一环&#xff0c;大米装箱机的技术创新与应用价值日益凸显。其中&#xff0c;二轴机器人大米装箱机以其高效、稳定、智能的特点&#xff0c;成为市场的新宠。星…

删除目录

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 删除目录可以通过使用os模块提供的rmdir()函数实现。通过rmdir()函数删除目录时&#xff0c;只有当要删除的目录为空时才起作用。rmdir()函数的基本语…

【STL源码剖析】priority_queue 优先队列的简单实现

水到绝处是风景 人到绝境是重生 目录 priority_queue的模拟实现 源码剖析&#xff1a; 代码测试&#xff1a; 契子✨ 我们之前不仅讲过 队列queue 还有 双端队列deque 而我们今天所讲的依旧是队列家族的成员 -- 优先队列priority_queue 顾名思义&#xff0c;priority_queue是…

网络实用技术答案

&#xff08; C &#xff09;不属于计算机网络四要素。A. 计算机系统 B. 传输介质C. 用户 D. 网络协议计算机网络中广域网和局域网的分类是以&#xff08; D &#xff09;来划分的。A. 信息交换方式 B&#xff0e;传输控制方法C. 网络使用习惯 D&#xff0e;网络覆盖范围计算机…

蓝桥云课第12届强者挑战赛

第一题&#xff1a;字符串加法 其实本质上就是一个高精度问题&#xff0c;可以使用同余定理的推论 &#xff08;ab&#xff09;%n((a%n)(b%n))%n; #include <iostream> using namespace std; const int mod1e97; int main() {string a,b;cin>>a>>b;ab;int …

CorelDRAW2024最新版本有哪些功能?揭秘设计界最新神器!

“设计”一词最早来源于拉丁语“designare”&#xff0c;意为计划&#xff0c;构思。随着时代的发展&#xff0c;人们将“设计”理解为一种创造性活动&#xff0c;通过这种活动&#xff0c;人们可以创造出新的产品、新的场景以及新的体验。 「CorelDRAW汉化版下载」&#xff0c…

Spring Boot框架基础

文章目录 1 Spring Boot概述2 Spring Boot入门2.1 项目搭建2.2 入门程序 3 数据请求与响应3.1 数据请求3.2 数据响应 4 分层解耦4.1 三层架构4.2 控制反转4.3 依赖注入 5 参考资料 1 Spring Boot概述 Spring是Java EE编程领域的一个轻量级开源框架&#xff0c;是为了解决企业级…

AI日报|文生语音大模型国内外均有突破,Pika完成6亿新融资,视频大模型也不远了!

文章推荐 AI搜索哪家强&#xff1f;16款产品实战测评&#xff0c;效率飙升秘籍&#xff01; AI日报&#xff5c;智谱AI再降价&#xff0c;同时开源9B系列模型&#xff1b;国内外气象大模型竞逐升级 字节推出文本到语音模型家族Seed-TTS&#xff1a;擅长情感表达&#xff0c;…

前端 JS 经典:打印对象的 bug

1. 问题 相信这个 console 打印语句的 bug&#xff0c;其实小伙伴们是遇到过的&#xff0c;就是你有一个对象&#xff0c;通过 console&#xff0c;打印一次&#xff0c;然后经过一些处理&#xff0c;再通过 console 打印&#xff0c;发现两次打印的结果是一样的&#xff0c;第…