unity ugui 画曲线 跟随目标点缩放旋转 曲线终点和目标点保持一致

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;



    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tianyongheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值