本来想写给自己的游戏用的自定义赛道,但是好像不太适用。先留存一下,后面可能会再使用,同时也可以通过这个demo也可以做一些其他的效果,比如,拖尾刀痕、瀑布水流等,最最后还是为demo做个简单的记录。
首先看看基本的赛道
我们也可以通过拖动不路径 ,来重新应用 生成路径
然后在编辑器中,点击一下RoadCreator的Apply,就可以重新生成道路。当然也可以设置道路的宽度。
除了用来自定义赛道外,可以通过shader来做水流效果,我这里只做了一个简单的示例。实际使用可以多叠几层纹理,每层速度随机,效果杠杠。
还可以通过简单人物武器所移动的路径,计算自定义模型的顶点数据,就可以实现拖尾刀痕效果,这里就没有去具体实现,可以看后面有机会再来实现一下。
这里就直接给出整个模型绘制的脚本,功能其实很简单,就不再详解
using UnityEngine;
public class RoadCreator : MonoBehaviour {
public Transform[] _PathPoints;
[SerializeField]
private float _RoadWidth = 2.0f;
#if UNITY_EDITOR
[SerializeField]
private bool _Apply = false;
private void OnValidate()
{
_Apply = false;
MakePathPoints();
CreateRoadMesh(GetComponent<MeshFilter>());
// AddMeshCollider(GetComponent<MeshFilter>());
}
#endif
void MakePathPoints()
{
if (_PathPoints.Length < 2)
return;
for (int i = 0; i < _PathPoints.Length; i++)
{
if (i == 0)
_PathPoints[i].forward = (_PathPoints[i + 1].position - _PathPoints[i].position).normalized;
else if (i == (_PathPoints.Length - 1))
_PathPoints[i].forward = (_PathPoints[i].position - _PathPoints[i-1].position).normalized;
else
_PathPoints[i].forward = (_PathPoints[i+1].position - _PathPoints[i - 1].position).normalized;
}
}
void CreateRoadMesh(MeshFilter _meshFilter)
{
int _pointNums = _PathPoints.Length-1;
Vector3[] _vertices = new Vector3[_PathPoints .Length* 4];
Vector2[] _uv = new Vector2[_PathPoints.Length * 4];
int[] _triangle = new int[_PathPoints.Length * 6];
float _halRoadfWidth = _RoadWidth * 0.5f;
for (int i = 0; i < _pointNums; i++)
{
//计算顶点位置
_vertices[i * 4 + 0] = _PathPoints[i].position + _PathPoints[i].right * _halRoadfWidth;
_vertices[i * 4 + 1] = _PathPoints[i+1].position - _PathPoints[i+1].right * _halRoadfWidth;
_vertices[i * 4 + 2] = _PathPoints[i+1].position + _PathPoints[i+1].right * _halRoadfWidth;
_vertices[i * 4 + 3] = _PathPoints[i].position - _PathPoints[i].right * _halRoadfWidth;
//计算uv位置
_uv[i * 4 + 0] = new Vector2(0.0f, 0.0f);
_uv[i * 4 + 1] = new Vector2(1.0f, 1.0f);
_uv[i * 4 + 2] = new Vector2(1.0f, 0.0f);
_uv[i * 4 + 3] = new Vector2(0.0f, 1.0f);
}
int _verticeIndex = 0;
for (int i = 0; i < _pointNums; i++)
{
// 第一个三角形
_triangle[_verticeIndex++] = i * 4 + 0;
_triangle[_verticeIndex++] = i * 4 + 1;
_triangle[_verticeIndex++] = i * 4 + 2;
// 第二个三角形
_triangle[_verticeIndex++] = i*4+1;
_triangle[_verticeIndex++] = i*4+0;
_triangle[_verticeIndex++] = i*4+3;
}
Mesh _newMesh = new Mesh();
_newMesh.vertices = _vertices;
_newMesh.uv = _uv;
_newMesh.triangles = _triangle;
#if UNITY_EDITOR
_meshFilter.sharedMesh = _newMesh;
#else
_meshFilter.mesh = _newMesh;
#endif
}
void AddMeshCollider(MeshFilter _meshFilter)
{
MeshCollider _meshCollider = _meshFilter.GetComponent<MeshCollider>();
if (_meshCollider == null)
_meshCollider = _meshFilter.gameObject.AddComponent<MeshCollider>();
}
#if UNITY_EDITOR
private void OnDrawGizmos()
{
if (_PathPoints == null)
return;
for (int i = 1; i < _PathPoints.Length; i++)
{
Gizmos.color = Color.green;
Gizmos.DrawLine(_PathPoints[i-1].position, _PathPoints[i].position);
}
}
#endif
}
然后在场景中,添加多个Transform赋值给RoadCreator来确定道路生成的路径,当然具体使用可以根据自己的需求再进行更改