Unity3d如何使用LineRenderer画线
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,这篇文章主要介绍Unity3d如何使用LineRenderer画线,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!LineRenderer线渲染器主要是用于在3D中渲染线段,虽然
千家信息网最后更新 2025年12月02日Unity3d如何使用LineRenderer画线
这篇文章主要介绍Unity3d如何使用LineRenderer画线,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
LineRenderer线渲染器主要是用于在3D中渲染线段,虽然我们也可以使用GL图像库来渲染线段,但是使用LineRenderer我们可以对线段进行更多的操作,例如:设置颜色,宽度等。在这里要注意LineRenderer渲染出的线段的两个端点是3D世界中的点,即他是属于世界坐标(World Point)中的。
LineRenderer是以组件形成存在的,首先我们新建一个空的Game Object,然后我们选择"Component→Effects→Line Renderer",即可为其添加LineRenderer组件了。
其实我们也可以通过脚本来为其添加LineRenderer组件:
LineRenderer lineRenderer = gameObject.AddComponent();
获取LineRenderer组件:
lineRenderer = GetComponent();
【 案例】根据鼠标左击的位置,来持续绘制线段
首先我们在场景中新建一个空的 GameObject,并Reset一下。然后将Script1脚本添加给他。
using UnityEngine; using System.Collections; using System.Collections.Generic; //[RequireComponent(typeof(LineRenderer))] public class DrawLine : MonoBehaviour { private LineRenderer line; private bool isMousePressed; private List pointsList; private Vector3 mousePos; //private Vector3 m_DownCamPos; //private Vector3 m_mouseDownStartPos; //主相机节点下 // Structure for line points struct myLine { public Vector3 StartPoint; public Vector3 EndPoint; }; // ----------------------------------- void Awake() { _Init(); } private void _Init() { if (m_init) return; m_init = true; // Create line renderer component and set its property //line = this.GetComponent(); line = gameObject.AddComponent(); line.material = new Material(Shader.Find("Particles/Additive")); line.SetVertexCount(0); line.SetWidth(0.1f, 0.1f); line.SetColors(Color.green, Color.green); line.useWorldSpace = true; isMousePressed = false; pointsList = new List(); line.sortingLayerName = "Ignore Raycast"; line.sortingOrder = 999; // renderer.material.SetTextureOffset( //m_mainCam = this.GetComponent(); } bool m_init = false; //Camera m_mainCam; // ----------------------------------- void Update() { // If mouse button down, remove old line and set its color to green if (Input.GetMouseButtonDown(1)) { isMousePressed = true; line.SetVertexCount(0); pointsList.RemoveRange(0, pointsList.Count); line.SetColors(Color.green, Color.green); //m_DownCamPos = Camera.main.transform.position; //m_mouseDownStartPos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane + 1f)); } else if (Input.GetMouseButtonUp(1)) { isMousePressed = false; } //if (Input.GetMouseButton(0) || Input.GetMouseButton(1) || Input.GetMouseButton(2)) { // Vector3 crelpos = Camera.main.transform.position; // for (int i = 0; i < pointsList.Count; i++) { // line.SetPosition(i, crelpos + pointsList[i]); // //line.SetPosition(pointsList.Count - 1, (Vector3)pointsList[pointsList.Count - 1]); // } //} // Drawing line when mouse is moving(presses) if (isMousePressed) { Vector3 crelpos = Camera.main.transform.position; //将鼠标点击的屏幕坐标转换为世界坐标,然后存储到position中 mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane + 1f)); Vector3 offsetpos = mousePos - crelpos; //Vector3 hitp = Vector3.zero; //bool ok = GetRayCastZero2DPlanePoint(Camera.main, Camera.main.transform.TransformPoint(0f, 0f, Camera.main.nearClipPlane + 1f).z, out hitp); //mousePos = hitp; if (!pointsList.Contains(offsetpos)) { pointsList.Add(offsetpos); line.SetVertexCount(pointsList.Count); for (int i = 0; i < pointsList.Count; i++) { line.SetPosition(i, crelpos + pointsList[i]); //line.SetPosition(pointsList.Count - 1, (Vector3)pointsList[pointsList.Count - 1]); } if (isLineCollide()) { isMousePressed = false; line.SetColors(Color.red, Color.red); } } } } // ----------------------------------- // Following method checks is currentLine(line drawn by last two points) collided with line // ----------------------------------- private bool isLineCollide() { if (pointsList.Count < 2) return false; int TotalLines = pointsList.Count - 1; myLine[] lines = new myLine[TotalLines]; if (TotalLines > 1) { for (int i = 0; i < TotalLines; i++) { lines[i].StartPoint = (Vector3)pointsList[i]; lines[i].EndPoint = (Vector3)pointsList[i + 1]; } } for (int i = 0; i < TotalLines - 1; i++) { myLine currentLine; currentLine.StartPoint = (Vector3)pointsList[pointsList.Count - 2]; currentLine.EndPoint = (Vector3)pointsList[pointsList.Count - 1]; if (isLinesIntersect(lines[i], currentLine)) return true; } return false; } // ----------------------------------- // Following method checks whether given two points are same or not // ----------------------------------- private bool checkPoints(Vector3 pointA, Vector3 pointB) { return (pointA.x == pointB.x && pointA.y == pointB.y); } // ----------------------------------- // Following method checks whether given two line intersect or not // ----------------------------------- private bool isLinesIntersect(myLine L1, myLine L2) { if (checkPoints(L1.StartPoint, L2.StartPoint) || checkPoints(L1.StartPoint, L2.EndPoint) || checkPoints(L1.EndPoint, L2.StartPoint) || checkPoints(L1.EndPoint, L2.EndPoint)) return false; return ((Mathf.Max(L1.StartPoint.x, L1.EndPoint.x) >= Mathf.Min(L2.StartPoint.x, L2.EndPoint.x)) && (Mathf.Max(L2.StartPoint.x, L2.EndPoint.x) >= Mathf.Min(L1.StartPoint.x, L1.EndPoint.x)) && (Mathf.Max(L1.StartPoint.y, L1.EndPoint.y) >= Mathf.Min(L2.StartPoint.y, L2.EndPoint.y)) && (Mathf.Max(L2.StartPoint.y, L2.EndPoint.y) >= Mathf.Min(L1.StartPoint.y, L1.EndPoint.y)) ); } } 以上是"Unity3d如何使用LineRenderer画线"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
线段
组件
世界
坐标
内容
更多
篇文章
脚本
鼠标
两个
价值
位置
兴趣
可以通过
图像
场景
宽度
小伙
小伙伴
屏幕
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器高限制状态
无法访问打印服务器
软件开发阶段的产品配置
乐视手机连接不了服务器
学习网络安全的必要性
软件开发创业有前景吗
负责信息网络安全
怎样查看电脑数据库实例名
asp数据库操作类
进入某个数据库
海康威视网络安全书
中尧软件开发公司
网络技术中级考试真题
南方农村不动产数据库软件
玉溪新华互联网科技怎么选
浪潮服务器维修报价表
安卓系统软件开发 书
对于数据库中数据的理解
计算机网络技术有哪些种类
建筑物理仿真软件开发
更新mongodb数据库优化
禁止服务器传mac地址
网络技术培训介绍
厦门岱山互联网科技有限公司
乐视手机连接不了服务器
网络安全鹏程学校
港南区委网络技术管理中心
以下对象属于数据库的是
软件开发公司会计账务处理培训
服务器安全安骑士