目录
在开始前,先来看效果演示:
圆柱体代表的角色——田伯光,在正六边形组成的地板上奔跑,地面悬于空中,沿途所接触到的正六边形组成的地砖开始逐渐消失,而他能够站稳脚跟的地方逐渐减少。此时的田伯光想起了梅西:心里慌的一批!可站立的范围越来越小,突然,他脚底踩空,跌了下去。
演示使用的Unity版本为Tuanjie 1.0.0,团结引擎是Unity中国的引擎研发团队基于Unity 2022 LTS版本为中国开发者定制的引擎,使用功能上没有太多区别,国际版的Unity也可同样操作。
接下来我来试试要让田伯光在正六边形组成的地板上一路奔袭并使其掉落需要几个步骤:
1.在Unity中创建正六边形
田伯光不明白地砖为什么是正六边形的,但我就是想要正六边形!于是我在Unity中创建了一个名叫HexCreator的脚本,用来创建正六边形地砖。
using UnityEngine;
using UnityEditor;
public class HexCreator : EditorWindow
{
[MenuItem("Tools/Hexagon/Create a Hexagon")]
public static void Create()
{
Mesh mesh = new Mesh();
Vector3[] vertices = new Vector3[6];
int[] triangles = new int[12] { 0, 1, 2, 2, 3, 0, 0, 3, 4, 4, 5, 0 };
float radius = 1f; //正六边形外接圆的半径
for (int i = 0; i < 6; i++)
{//设置正六边形的顶点位置
float angle = i * Mathf.PI / 3;
vertices[i] = new Vector3(radius * Mathf.Sin(angle), 0f, radius * Mathf.Cos(angle));
}
mesh.vertices = vertices;
mesh.triangles = triangles;
string meshAssetPath = "Assets/Hexagon/Prefabs/HexagonMesh.asset";
AssetDatabase.CreateAsset(mesh, meshAssetPath);
Mesh saveMesh=AssetDatabase.LoadAssetAtPath<Mesh>(meshAssetPath);
GameObject go = new GameObject("Hexagon");
go.AddComponent<MeshFilter>();
go.GetComponent<MeshFilter>().sharedMesh = saveMesh;
Material material = new Material(Shader.Find("Standard"));
material.color = Color.black;
string matAssetPath = "Assets/Hexagon/Prefabs/HexagonMat.asset";
AssetDatabase.CreateAsset(material, matAssetPath);
Material saveMat = (Material)AssetDatabase.LoadAssetAtPath<Material>(matAssetPath);
MeshRenderer renderer = go.AddComponent<MeshRenderer>();
renderer.sharedMaterial = saveMat;
go.AddComponent<MeshCollider>();
//将设置好的正六边形Prefab保存到路径
PrefabUtility.SaveAsPrefabAsset(go, "Assets/Hexagon/Prefabs/Hexagon.prefab");
DestroyImmediate(go);//将创建在Hierarchy窗口的正六边形对象立即销毁,如果不销毁可以将本行去除
}
}
要使用这个脚本,需要在Unity中创建名为Editor的文件夹,将其放在该文件夹下。然后,我想让田伯光明白正六边形地砖是怎么创建出来的。为什么要让他明白?因为他是采花大盗,我想折腾他一下。
HexCreator:
HexCreator脚本是一个用于创建正六边形游戏对象Prefab的工具类,它定义了一个继承自EditorWindow的类HexCreator。当用户点击菜单栏中的"Tools/Hexagon/Create a Hexagon"选项时,会调用Create静态方法来执行以下步骤:
1.创建Mesh: 初始化一个新的Mesh对象,这是Unity中用于存储3D几何形状数据的组件。
2.定义顶点: 创建一个包含6个顶点的Vector3数组,用于表示正六边形的六个角。循环遍历数组,根据正六边形的数学特性计算每个顶点在三维空间中的坐标(绕Z轴旋转正六边形)。
3.定义三角面片: 创建一个int数组,用于指定这些顶点如何组成两个三角形(一个正六边形由六个三角形组成,此处简化为两个连续的三角形序列)。
4.构建Mesh: 将顶点和三角形数据赋值给新建的Mesh对象。
5.保存Mesh资源: 将创建好的Mesh对象作为资产保存到项目的特定路径下,并加载回内存以便后续使用。
6.创建GameObject: 创建一个新的游戏