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(); 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 list = new List(); 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 list2 = new List(); 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.mesh = new Mesh(); _meshFilter.sharedMesh.vertices = _vertices; _meshFilter.sharedMesh.triangles = _triangles; _meshFilter.sharedMesh.RecalculateNormals(); } }