系列文章目录
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开发技巧,觉得有用记得一键三连哦。么么哒