173 lines
4.6 KiB
C#
173 lines
4.6 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
[ExecuteInEditMode]
|
|
public class CharacterCapsule : MonoBehaviour
|
|
{
|
|
private CharacterController _character;
|
|
|
|
private MeshFilter _meshFilter;
|
|
|
|
private float _height;
|
|
|
|
private float _radius;
|
|
|
|
[Range(4f, 32f)]
|
|
public int SubdivisionsU;
|
|
|
|
[Range(4f, 32f)]
|
|
public int SubdivisionsV;
|
|
|
|
private int _subdivisionU;
|
|
|
|
private int _subdivisionV;
|
|
|
|
private Vector3[] _vertices;
|
|
|
|
private int[] _triangles;
|
|
|
|
private void Update()
|
|
{
|
|
if (_character == null)
|
|
{
|
|
_character = GetComponentInParent<CharacterController>();
|
|
if (_character == null)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
if (_height == _character.height && _radius == _character.radius && _subdivisionU == SubdivisionsU && _subdivisionV == SubdivisionsV)
|
|
{
|
|
return;
|
|
}
|
|
_height = _character.height;
|
|
_radius = _character.radius;
|
|
_subdivisionU = SubdivisionsU;
|
|
_subdivisionV = SubdivisionsV;
|
|
List<Vector3> list = new List<Vector3>();
|
|
Vector3 vector = new Vector3(1f, 0f, 0f);
|
|
Vector3 vector2 = new Vector3(0f, _height / 2f - _radius, 0f);
|
|
Vector3 vector3 = new Vector3(0f, _radius - _height / 2f, 0f);
|
|
list.Add(new Vector3(0f, _height / 2f, 0f));
|
|
for (int num = SubdivisionsU - 1; num >= 0; num--)
|
|
{
|
|
float num2 = (float)num / (float)SubdivisionsU;
|
|
for (int i = 0; i < SubdivisionsV; i++)
|
|
{
|
|
float num3 = (float)i / (float)SubdivisionsV;
|
|
Quaternion quaternion = Quaternion.Euler(0f, num3 * 360f, num2 * 90f);
|
|
Vector3 vector4 = quaternion * vector;
|
|
vector4 *= _radius;
|
|
Vector3 item = vector4 + vector2;
|
|
list.Add(item);
|
|
}
|
|
}
|
|
for (int j = 0; j < SubdivisionsU; j++)
|
|
{
|
|
float num4 = (float)j / (float)SubdivisionsU;
|
|
for (int k = 0; k < SubdivisionsV; k++)
|
|
{
|
|
float num5 = (float)k / (float)SubdivisionsV;
|
|
Quaternion quaternion2 = Quaternion.Euler(0f, num5 * 360f + 180f, num4 * 90f);
|
|
Vector3 vector5 = quaternion2 * vector;
|
|
vector5 *= _radius;
|
|
Vector3 item2 = vector3 - vector5;
|
|
list.Add(item2);
|
|
}
|
|
}
|
|
list.Add(new Vector3(0f, (0f - _height) / 2f, 0f));
|
|
List<int> list2 = new List<int>();
|
|
int item3;
|
|
for (int l = 0; l < SubdivisionsV; l++)
|
|
{
|
|
item3 = 0;
|
|
list2.Add(item3);
|
|
list2.Add(l);
|
|
list2.Add(l + 1);
|
|
}
|
|
list2.Add(0);
|
|
list2.Add(SubdivisionsV);
|
|
list2.Add(1);
|
|
int num6;
|
|
for (int m = 0; m < SubdivisionsU - 1; m++)
|
|
{
|
|
num6 = m * SubdivisionsV + 1;
|
|
for (int n = 0; n < SubdivisionsV - 1; n++)
|
|
{
|
|
item3 = num6 + n;
|
|
list2.Add(item3);
|
|
list2.Add(item3 + SubdivisionsV);
|
|
list2.Add(item3 + 1);
|
|
list2.Add(item3 + 1);
|
|
list2.Add(item3 + SubdivisionsV);
|
|
list2.Add(item3 + SubdivisionsV + 1);
|
|
}
|
|
item3 = num6 + SubdivisionsV - 1;
|
|
list2.Add(item3);
|
|
list2.Add(item3 + SubdivisionsV);
|
|
list2.Add(item3 + 1 - SubdivisionsV);
|
|
list2.Add(item3 + 1 - SubdivisionsV);
|
|
list2.Add(item3 + SubdivisionsV);
|
|
list2.Add(item3 + 1);
|
|
}
|
|
num6 = (SubdivisionsU - 1) * SubdivisionsV + 1;
|
|
for (int num7 = 0; num7 < SubdivisionsV - 1; num7++)
|
|
{
|
|
item3 = num6 + num7;
|
|
list2.Add(item3);
|
|
list2.Add(item3 + SubdivisionsV);
|
|
list2.Add(item3 + 1);
|
|
list2.Add(item3 + 1);
|
|
list2.Add(item3 + SubdivisionsV);
|
|
list2.Add(item3 + SubdivisionsV + 1);
|
|
}
|
|
item3 = num6 + SubdivisionsV - 1;
|
|
list2.Add(item3);
|
|
list2.Add(item3 + SubdivisionsV);
|
|
list2.Add(item3 + 1 - SubdivisionsV);
|
|
list2.Add(item3 + 1 - SubdivisionsV);
|
|
list2.Add(item3 + SubdivisionsV);
|
|
list2.Add(item3 + 1);
|
|
for (int num8 = 0; num8 < SubdivisionsU - 1; num8++)
|
|
{
|
|
num6 = num8 * SubdivisionsV + SubdivisionsU * SubdivisionsV + 1;
|
|
for (int num9 = 0; num9 < SubdivisionsV - 1; num9++)
|
|
{
|
|
item3 = num6 + num9;
|
|
list2.Add(item3);
|
|
list2.Add(item3 + SubdivisionsV);
|
|
list2.Add(item3 + 1);
|
|
list2.Add(item3 + 1);
|
|
list2.Add(item3 + SubdivisionsV);
|
|
list2.Add(item3 + SubdivisionsV + 1);
|
|
}
|
|
item3 = num6 + SubdivisionsV - 1;
|
|
list2.Add(item3);
|
|
list2.Add(item3 + SubdivisionsV);
|
|
list2.Add(item3 + 1 - SubdivisionsV);
|
|
list2.Add(item3 + 1 - SubdivisionsV);
|
|
list2.Add(item3 + SubdivisionsV);
|
|
list2.Add(item3 + 1);
|
|
}
|
|
int num10 = list.Count - 1;
|
|
int num11 = num10 - SubdivisionsV;
|
|
for (int num12 = 0; num12 < SubdivisionsV; num12++)
|
|
{
|
|
item3 = 0;
|
|
list2.Add(num10);
|
|
list2.Add(num11 + num12 + 1);
|
|
list2.Add(num11 + num12);
|
|
}
|
|
list2.Add(num10);
|
|
list2.Add(num11);
|
|
list2.Add(num10 - 1);
|
|
_vertices = list.ToArray();
|
|
_triangles = list2.ToArray();
|
|
_meshFilter = base.gameObject.GetComponent<MeshFilter>();
|
|
_meshFilter.mesh = new Mesh();
|
|
_meshFilter.sharedMesh.vertices = _vertices;
|
|
_meshFilter.sharedMesh.triangles = _triangles;
|
|
_meshFilter.sharedMesh.RecalculateNormals();
|
|
}
|
|
}
|