Unity - MeshEditor(十二) 自定义赛道

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神码编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值