1.首先创建一个空物体,然后给物体添加MeshRenderer和MeshFilter组件
2.创建一个默认材质,拖入MeshRenderer组件中,为可视化做准备。
3.创建一个脚本,挂载在空物体上。然后开始编辑代码:
一.生成立方体
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SetMesh : MonoBehaviour
{
public Mesh sphere;
// Start is called before the first frame update
void Start()
{
Mesh mesh=new Mesh();
//正方体
List<Vector3> vertices = new List<Vector3>();
vertices.Add(new Vector3(0, 5, 0));
vertices.Add(new Vector3(0, 5, 5));
vertices.Add(new Vector3(5, 5, 5));
vertices.Add(new Vector3(5, 5, 0));
vertices.Add(new Vector3(0, 0, 0));
vertices.Add(new Vector3(0, 0, 5));
vertices.Add(new Vector3(5, 0, 5));
vertices.Add(new Vector3(5, 0, 0));
mesh.vertices = vertices.ToArray();
mesh.triangles = new int[] {
4,0,3,
3,7,4,
7,3,2,
7,2,6,
6,2,1,
6,1,5,
5,1,0,
5,0,4,
0,1,2,
0,2,3,
5,4,7,
7,6,5,
};
mesh.RecalculateNormals();
List<Vector2> uv = new List<Vector2>();
//uv.Add(new Vector2(0.1f, 0.3f));
//uv.Add(new Vector2(0.9f, 0.3f));
//uv.Add(new Vector2(0.9f, 0.9f));
//uv.Add(new Vector2(0.1f, 0.9f));
uv.Add(new Vector2(0, 0));
uv.Add(new Vector2(1, 0));
uv.Add(new Vector2(1, 1));
uv.Add(new Vector2(0, 1));
uv.Add(new Vector2(0, 0));
uv.Add(new Vector2(1, 0));
uv.Add(new Vector2(1, 1));
uv.Add(new Vector2(0, 1));
mesh.uv = uv.ToArray();
GetComponent<MeshFilter>().mesh = mesh;
GetComponent<MeshCollider>().sharedMesh = mesh;
}
// Update is called once per frame
void Update()
{
}
}
运行效果如图:
二.生成圆
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SetMeshCricle : MonoBehaviour
{
//确认顶点个数
public int n = 20;
//半径
public float r = 2;
// Start is called before the first frame update
void Start()
{
Mesh mesh = new Mesh();
//定义角度
float angle = 2 * Mathf.PI / n;
List<Vector3> vertices = new List<Vector3>();
List<int> triangles = new List<int>();
for (int i = 0; i < n / 2 + 1; i++)
{
float xr = Mathf.Sin(i * angle) * r;
float y = Mathf.Cos(i * angle) * r;
for (int j = 0; j < n; j++)
{
float x = Mathf.Sin(j * angle) * xr;
float z = Mathf.Cos(j * angle) * xr;
vertices.Add(new Vector3(x, y, z));
if (j == n - 1)
{
float x0 = Mathf.Sin(0) * xr;
float z0 = Mathf.Cos(0) * xr;
vertices.Add(new Vector3(x0, y, z0));
}
if (i < n / 2 && j < n)
{
triangles.Add(i * (n + 1) + j);
triangles.Add(i * (n + 1) + j + 1);
triangles.Add((i + 1) * (n + 1) + j);
triangles.Add((i + 1) * (n + 1) + j);
triangles.Add(i * (n + 1) + j + 1);
triangles.Add((i + 1) * (n + 1) + j + 1);
}
}
}
mesh.vertices = vertices.ToArray();
mesh.triangles = triangles.ToArray();
GetComponent<MeshFilter>().mesh = mesh;
GetComponent<MeshCollider>().sharedMesh = mesh;
}
// Update is called once per frame
void Update()
{
}
}
运行效果如图:
三.简易双色球摇奖
1.基于上面生成的球体,创建一些小球位置在球体的上方 ,并且给小球添加刚体,把刚体的碰撞检测改为连续。
不要使用默认的离散,离散碰撞检测有时可能会出现漏检问题,特别是在高速运动或形状变化较大的情况下。
为了解决这个问题,就引入了连续碰撞检测。
连续碰撞检测是基于物体在一段时间内的运动轨迹来进行碰撞检测它可以更准确地检测到高速碰撞或形状变化较大的情况。
创建3D物理材质,
3个属性为动摩擦静摩擦和弹力
并且挂载到所有物体碰撞器上(生成的球体碰撞器也需要)
效果如下: