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
- unity
- Unity
- unity
- Unity
- Unity
- Unity
- Unity-----
- unity
- Unity
- unity
- unity
- Unity
- Unity
- Unity
- Unity
- unity
- Unity
- unity
- 《深入理解mybatis原理》 MyBatis的架构设计以及实例分析
- NYOJ 贪心算法题目汇总(一)
- Java中Comparable与Comparator的区别
- Learning to learn by gradient descent by gradient descent
- Linux struct itimerval用法
- Unity
- div+css 制作网页
- Hadoop YARN介绍
- smarty模板变量调节器
- centos 配置ftps 服务
- CCF-CSP-2015-9-2 日期计算
- 实现有头结点的单链表的简单操作
- 留言板中的问题
- 【面试题】剑指Offer-19-二叉树的镜像