unity抛物线的制作和根据位置生成路径
一.unity抛物线的制作
先上抛物线的效果图
1.1 抛物线的高度可以设置(设置完高度抛物线弧度是不一样的)
1.2 代码示例:
下面是代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SeletParabola : MonoBehaviour
{
public GameObject startPoint; //起点
public GameObject endPoint; //终点
public int lineSegmentNum = 50;
public float heightFloat = 0.5f; //抛物线的高度
private LineRenderer lineRenderer;
private List<Vector3> listLines = new List<Vector3>();
private Material material;
private float aa;
void Start()
{
lineRenderer = GetComponent<LineRenderer>();
material = lineRenderer.material;
lineRenderer.positionCount = lineSegmentNum;
DrawParabola();
}
void DrawParabola()
{
listLines.Clear();
Vector3 start = startPoint.transform.position;
Vector3 end = endPoint.transform.position;
float step = 1f / lineSegmentNum;
for (int i = 1; i <= lineSegmentNum; i++)
{
float t = step * i;
Vector3 lineposition = CalculateParabola(start, end, t, heightFloat);
listLines.Add(lineposition);
//lineRenderer.SetPosition(i - 1, lineposition);
}
lineRenderer.SetPositions(listLines.ToArray());
}
public Vector3 CalculateParabola(Vector3 start, Vector3 end, float t, float heigh)
{
Vector3 height = Vector3.up * (end - start).magnitude * heigh;
Vector3 midPoint = (start + end) * 0.5f + height;
Vector3 P0 = start;
Vector3 P1 = midPoint;
Vector3 P2 = end;
float u = 1 - t;
float tt = t * t;
float uu = u * u;
Vector3 p = uu * P0;
p += 2 * u * t * P1;
p += tt * P2;
return p;
}
private void Update()
{
aa += Time.deltaTime;
material.SetTextureOffset("_MainTex", new Vector2(-aa, 0));
}
}
1.3 下面是材质球所用到的贴图
复制使用即可
1.4 最后运行测试即可
效果如下
unity两点之间的抛物线
二.unity根据位置生成路径
2.1 创建空物体,给空物体加上LineRenderer组件,然后创建一个新的材质球给lineRenderer
材质球需要的贴图如下
2.2 效果如下图
2.3 代码示例
直接上代码自己测试即可(代码不多,需要其他功能效果请自行扩展)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PathTool : MonoBehaviour
{
public LineRenderer lineRenderer; //线预制体
public Material lineMaterial; //线的材质球
private float oaa;
private LineRenderer linshiObj;
public List<Transform> pathTransforms = new List<Transform>(); //所有的位置点
// Start is called before the first frame update
void Start()
{
List<Vector3> ookok = new List<Vector3>();
for (int i = 0; i < pathTransforms.Count; i++)
{
ookok.Add(pathTransforms[i].position);
}
PathCreate(ookok);
}
public void PathCreate(List <Vector3>paths)
{
if (linshiObj==null)
{
linshiObj = Instantiate(lineRenderer);
}
linshiObj.gameObject.SetActive(true);
linshiObj.SetVertexCount(paths.Count);
linshiObj.SetPositions(paths.ToArray());
linshiObj.transform.position = lineRenderer.GetPosition(0);
}
public void LineClose(bool bol)
{
linshiObj.gameObject.SetActive(bol);
}
// Update is called once per frame
void Update()
{
if (oaa <100)
{
oaa += Time.deltaTime;
lineMaterial.SetTextureOffset("_MainTex", new Vector2(-oaa, 0));
}
else
{
oaa = 0;
}
}
}
2.4 最后效果如下
根据位置生成路径
三.总结
以上就是抛物线的制作,和根据位置生成路径的方法,如需其他功能请自行添加
如果用的着的话,可以三连哦