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.pswp.cn/web/24167.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24167.shtml
英文地址,請注明出處:http://en.pswp.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…