unity 画曲线 两种方式
一是生成点,由点组成线,比较消耗内存
点组成曲线的Demo 下载地址:https://download.csdn.net/download/tianyongheng/10423694
1.新建Panel
2.在Panel 下新建 Image命名为 line,width=0,height=0;x,y=0;
3.在line 下新建 image 命名为linePointEnd,
4. 在canvas下新建image,命名target;新建image,命名为point
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {
public Transform point;
public Transform lineEndPoint;
public Transform lineRoot;
public Transform target;
public List<Transform> listLine = new List<Transform>();
float distance = 1;
// Use this for initialization
void Start () {
DrawLine();
}
// Update is called once per frame
void Update () {
ComputeZoom();
}
private void ComputeZoom()
{
float zoomFactor = Vector3.Distance(lineRoot.localPosition, lineEndPoint.localPosition) / distance;
if (listLine.Count > 0)
{
Vector3 v = (listLine[listLine.Count - 1].localPosition - lineRoot.localPosition);
Vector3 v2 = lineEndPoint.localPosition - lineRoot.localPosition;
lineRoot.localRotation = Quaternion.FromToRotation(v, v2);
}
lineRoot.localScale = new Vector3(zoomFactor, zoomFactor, 1);
}
void DrawLine()
{
lineEndPoint = point;
listLine.Clear();
//设置缩放系数
distance = Vector3.Distance(lineRoot.localPosition, lineEndPoint.localPosition);
Vector3[] pos = null;
if (distance > 300)
{
pos = CusCurve.GetCrvePaths(new Vector3[] { lineRoot.localPosition, lineEndPoint.GetComponent<RectTransform>().anchoredPosition3D }, 0.5f, 100, 8, 2);
}
else
{
pos = CusCurve.GetCrvePaths(new Vector3[] { lineRoot.localPosition, lineEndPoint.GetComponent<RectTransform>().anchoredPosition3D }, 8, 2);
}
for (int i = 0; i < pos.Length; i++)
{
// Transform t = PoolMapNotManager.Instance.GetPoint(data.isTimeout==0?new Color(48,197,220,255)/255:ExtendColor.ColorRed);
Transform t = Instantiate<Transform>(point);
t.SetParent(lineRoot);
t.localScale = Vector3.one;
t.GetComponent<RectTransform>().anchoredPosition3D = pos[i];
listLine.Add(t);
}
}
}
二是用曲线图片方式解决
曲线图片Demo 下载地址
https://download.csdn.net/download/tianyongheng/10416443
采用第二种:
1.新建 Panel 锚点拉伸全屏
2.新建Panel 命名为note锚点设置中心 width =0;height=0;
3.新建Panel 命名为lineRoot 锚点设置为中心 width =0;height=0;
4.在lineRoot 下新建image 锚点设置左下角,将曲线图片添加给Image组件, 点击 SetNativeSize
5.在lineRoot 下新建image 命名为lineEndPoint设置锚点中心,将lineEndPoint拖动到曲线终点重合
6.在note节点下新建Image 命名为target设置锚点中心,将target位置设置任意
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {
public Transform line;
public Transform target;
public Transform lineEnd;
private Vector3 lastpos;
private float distance = 1;
// Use this for initialization
void Start () {
distance = Vector3.Distance(line.localPosition, lineEnd.localPosition);
Debug.Log("distance:" + distance);
}
void Compute()
{
float zoomFactor = Vector3.Distance(line.localPosition, target.localPosition) / distance;
Debug.Log("zoomFactor:" + zoomFactor);
Vector2 a = lineEnd.localPosition - line.localPosition;
Vector2 b = target.localPosition - line.localPosition;
line.localRotation = Quaternion.FromToRotation(a, b);
line.localScale = new Vector3(zoomFactor, zoomFactor, 1);
}
// Update is called once per frame
void Update () {
Compute();
lastpos = target.position;
}
}