Unity

来源:互联网 发布:鼎峰网络 编辑:程序博客网 时间:2024/05/01 21:40

本来想写给自己的游戏用的自定义赛道,但是好像不太适用。先留存一下,后面可能会再使用,同时也可以通过这个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来确定道路生成的路径,当然具体使用可以根据自己的需求再进行更改


1 0