【自走棋】曲线箭头

<1>效果:

<2>思路:

使用贝塞尔曲线和LineRender

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO.Compression;

public class CurveTest : MonoBehaviour
{

    public float height = 4;
    [SerializeField]
    private Vector3 P0;
    [SerializeField]
    private Vector3 P1;
    [SerializeField]
    private Vector3 P2 = Vector3.zero;
    [SerializeField]
    private LineRenderer lineRenderer;

    private float useTime = 0;
    private float interval = 0;
    private int pointNum = 0;
    private List<Vector3> lst = new List<Vector3>();

    private GameObject start;
    private GameObject end;

    private void reset()
    {
        useTime = 0;
        float val = (P2 - P0).magnitude;
        pointNum = Mathf.FloorToInt(val)+1;
        interval = 1.0f / pointNum;
        lst.Clear();
        Vector3 p = (P0 + P2) * 0.5f;
        P1 = p + Vector3.up* pointNum/2;
    }

    private void showLine()
    {
        //从0开始 num+1
        Vector3 pos0 = getPosByTime(useTime);
        lst.Add(pos0);
        for (int i = 1; i <= pointNum; i++)
        {
            useTime += interval;
            Vector3 pos = getPosByTime(useTime);
            lst.Add(pos);
        }
        //策略:根据P0-P2的距离 计算应该有多少个间隔
        lineRenderer.SetVertexCount(lst.Count);
        for (int i = 0; i < lst.Count; i++)
        {
            lineRenderer.SetPosition(i, lst[i]);
        }
        lineRenderer.material.SetTextureScale("_MainTex", new Vector2(  (int)(lst.Count * 0.9), 1));
        setStartEnd();
    }

    private void setStartEnd()
    {
        if (start == null) start = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        start.transform.localScale = Vector3.one * 0.3f;
        if (end == null) end = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        end.transform.localScale = Vector3.one * 0.3f;
        start.transform.position = P0;
        end.transform.position = P2;
    }

    /// <summary>
    /// 通过时间点获取时间
    /// </summary>
    /// <param name="useTime"></param>
    /// <returns></returns>
    private Vector3 getPosByTime(float useTime)
    {
        return (1 - useTime) * (1 - useTime) * P0 + 2 * useTime * (1 - useTime) * P1 + useTime * useTime * P2;
    }

    void OnGUI()
    {
        if (GUILayout.Button("重置", GUILayout.Width(100), GUILayout.Height(100)))
        {
            reset();
            showLine();
        }
    }

}

  

posted on 2019-05-07 14:48  tianjiuwan  阅读(618)  评论(0编辑  收藏  举报