【自走棋】曲线箭头
<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();
}
}
}
浙公网安备 33010602011771号