- UI用
- 效果图
- UI代码示例
- 挂载示例
- 世界坐标用
- 挂载示例
- 效果图
- 世界坐标代码示例
我们分两种情况,一种是UI上连线,一种是世界坐标下连线。
UI用 效果图 UI代码示例public class DrawLine : MonoBehaviour{ [Header("Point")] public RectTransform startPoint;//起始点,UI用 public RectTransform endPoint;//终点,UI用 public GameObject linePrefab;//一个空物体下挂一个SpriteRender就行了 public float lineWidth;//线的宽度 private GameObject m_line;//线的实例 private RectTransform m_rect; private RectTransform m_lineRect; private void Awake() { m_rect = GetComponent挂载示例 世界坐标用 挂载示例(); } private void Start() { m_line = CreateLine(m_rect.anchoredPosition, endPoint.anchoredPosition); //下方UI要加,世界坐标下不需要 //不明白函数意思看文档,作用是防止线段遮挡视野(层级不同可能会遮挡) m_line.transform.SetAsFirstSibling(); } private void Update() { DrawStraightLine(m_line, m_rect.anchoredPosition, endPoint.anchoredPosition); } /// /// 创建一条两点之间的线 /// /// 起始点 /// 结束点 public GameObject CreateLine(Vector2 startPoint, Vector2 endPoint) { GameObject line = Instantiate(linePrefab, transform.parent); m_lineRect = line.GetComponent(); return line; } //划线功能 private void DrawStraightLine(GameObject line, Vector2 a, Vector2 b) { float distance = Vector2.Distance(a, b); //求距离 float angle = Vector2.SignedAngle(a - b, Vector2.left); //求夹角 line.GetComponent ().anchoredPosition = (a + b) / 2; line.GetComponent ().sizeDelta = new Vector2(distance, lineWidth); //长度,宽度 line.transform.localRotation = Quaternion.AngleAxis(-angle, Vector3.forward); }}
简单一点的方法是直接用Unity自带的Line Renderer
在一个游戏对象上挂载Line Renderer
public class LineRendererText : MonoBehaviour{ public Transform startPoint; public Transform endPoint; private LineRenderer m_lineRenderer; private void Awake() { m_lineRenderer = GetComponent(); } private void Update() { m_lineRenderer.SetPosition(0, startPoint.position); m_lineRenderer.SetPosition(1, endPoint.position); }}