Unity自定义点连接
最近遇到个需求,N个点。有个起点,每个点可以向N个点发射一个线段,然后可以依次发射至N个点,一开始想到树结构,写了一版发现不对,树结构父节点只能有一个,我的需求可能有多个,所以放弃了树结构。
上个图看效果吧。废话不多说。
上代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class NoodSTransform : MonoBehaviour
{
public List<GameObject> TargetObj;
public List<GameObject> EndPos;
GameObject obj;
public GameObject[] next;
Material mt;
Tweener _tw =null;
// Start is called before the first frame update
void Start()
{
mt = Resources.Load<Material>("line");
if (TargetObj.Count <= 0)
{
for (int i = 0; i < EndPos.Count; i++)
{
obj = new GameObject();
obj.AddComponent<LineRenderer>().material = mt;
obj.transform.position = this.transform.position;
obj.transform.parent = this.transform;
TargetObj.Add(obj);
}
}
else
{
Repos();
}
}
public void Repos()
{
for (int i = 0; i < EndPos.Count; i++)
{
TargetObj[i].transform.position = this.transform.position;
TargetObj[i].GetComponent<LineRenderer>().SetPosition(0, this.transform.position);
TargetObj[i].GetComponent<LineRenderer>().SetPosition(1, this.transform.position);
}
}
void FixedUpdate()
{
for (int i = 0; i < TargetObj.Count; i++)
{
TargetObj[i].GetComponent<LineRenderer>().SetPosition(0, this.transform.position);
TargetObj[i].GetComponent<LineRenderer>().SetPosition(1, TargetObj[i].transform.position);
}
}
public void MoveFuc()
{
_tw?.Kill();
for (int i = 0; i < TargetObj.Count; i++)
{
_tw = TargetObj[i].transform.DOMove(EndPos[i].transform.position, 3).OnComplete(
() =>
{
if (next != null)
{
for (int j = 0; j < next.Length; j++)
{
next[j].GetComponent<NoodSTransform>().MoveFuc();
}
}
}
);
}
}
}
大概说一下,EndPos需要你手动赋值,
告诉这个点要向几个点发射线。Next也需要手动赋值,
告诉下一个要发射线的点是谁就可以了。
点移动用了DoTween插件,没有需要手动导入一下。
你也可以改成UnityTransform里面的移动,但是需要手动做判断是否移动到终点。用距离判断就可以。
还有启动代码
---------------------------------------------------------------------------------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NoodStart : MonoBehaviour
{
public GameObject[] Noods;
// Start is called before the first frame update
void Start()
{
}
private void OnGUI()
{
if (GUI.Button(new Rect(10, 100, 100, 30), "Start"))
{
Noods[0].GetComponent<NoodSTransform>().MoveFuc();
}
if (GUI.Button(new Rect(10, 200, 100, 30), "Reset"))
{
Reset();
}
}
private void Reset()
{
for (int i = 0; i < Noods.Length; i++)
{
Noods[i].GetComponent<NoodSTransform>().Repos();
}
}
}
Noods 可以作为所有点的父物体。直接遍历赋值就可以了。