1using System.Collections.Generic;
3using System.Threading.Tasks;
4using NaughtyAttributes;
14 private const string ColliderObjectPrefix =
"TEG_";
15 [SerializeField]
private float _divisionUnitLength = 1;
16 private int callbacks;
17 private int totalCallbacks;
30 var colliderObjectName = $
"{ColliderObjectPrefix}{gameObject.name}";
31 RemoveOldColliders(colliderObjectName);
33 var meshCollider = gameObject.AddComponent<MeshCollider>();
34 var bounds = meshCollider.bounds;
36 Vector3[] gridPositions;
37 int xDivisionCount, yDivisionCount, zDivisionCount;
38 BoundsDivider.Divide(bounds, _divisionUnitLength, out gridPositions, out xDivisionCount,
39 out yDivisionCount, out zDivisionCount);
41 var tmpColliders =
new Collider[1];
42 var positionCount = gridPositions.Length;
43 var hasColliderPosition =
new bool[xDivisionCount * yDivisionCount * zDivisionCount];
44 for (var i = 0; i < positionCount; i++)
46 var position = gridPositions[i];
47 if (Physics.OverlapSphereNonAlloc(position, _divisionUnitLength / 2f, tmpColliders) == 0)
continue;
49 hasColliderPosition[i] =
true;
52 var colliderObject =
new GameObject(colliderObjectName);
53 colliderObject.transform.SetParent(transform);
54 var numberofcollidersnow = 0;
56 while (hasColliderPosition.Any(p => p))
60 var combineCountMax =
int.MinValue;
61 var xCombineEdgeCount = 0;
62 var yCombineEdgeCount = 0;
63 var zCombineEdgeCount = 0;
64 for (var i = 0; i < positionCount; i++)
66 if (!hasColliderPosition[i])
continue;
70 while (checkIndex >= 0 && checkIndex < positionCount && hasColliderPosition[checkIndex])
72 checkIndex += zDivisionCount * yDivisionCount;
75 if (checkIndex % (zDivisionCount * yDivisionCount) == 0)
break;
80 while (checkIndex >= 0 && checkIndex < positionCount && hasColliderPosition[checkIndex])
82 checkIndex += zDivisionCount;
85 if (checkIndex % (zDivisionCount * yDivisionCount) / zDivisionCount == 0)
break;
90 while (checkIndex >= 0 && checkIndex < positionCount && hasColliderPosition[checkIndex])
95 if (checkIndex % zDivisionCount == 0)
break;
102 for (var x = 1; x <= xEdgeCount; x++)
103 for (var y = 1; y <= yEdgeCount; y++)
104 for (var z = 1; z <= zEdgeCount; z++)
106 if (!IsValidCubes(hasColliderPosition, i, x, y, z, yDivisionCount, zDivisionCount))
continue;
108 var count = x * y * z;
109 if (count < c)
continue;
117 xEdgeCount = resultX;
118 yEdgeCount = resultY;
119 zEdgeCount = resultZ;
121 var margeCount = xEdgeCount * yEdgeCount * zEdgeCount;
122 if (margeCount <= combineCountMax)
continue;
125 xCombineEdgeCount = xEdgeCount;
126 yCombineEdgeCount = yEdgeCount;
127 zCombineEdgeCount = zEdgeCount;
128 combineCountMax = margeCount;
131 for (var x = 0; x < xCombineEdgeCount; x++)
132 for (var y = 0; y < yCombineEdgeCount; y++)
133 for (var z = 0; z < zCombineEdgeCount; z++)
135 var index = combineIndex + zDivisionCount * yDivisionCount * x + zDivisionCount * y + z;
136 hasColliderPosition[index] =
false;
141 collider.center = gridPositions[combineIndex] +
142 new Vector3(xCombineEdgeCount, yCombineEdgeCount, zCombineEdgeCount) *
143 _divisionUnitLength / 2f - Vector3.one * _divisionUnitLength / 2f;
144 collider.size =
new Vector3(xCombineEdgeCount, yCombineEdgeCount, zCombineEdgeCount) *
146 collider.OnTriggered.AddListener(
Callback);
147 numberofcollidersnow++;
149 if (numberofcollidersnow >= 31)
152 colliderObject =
new GameObject(colliderObjectName + $
"_{newGoNum}");
153 colliderObject.transform.SetParent(transform);
154 numberofcollidersnow = 0;
159 DestroyImmediate(meshCollider);
161 Destroy(meshCollider);
168 var colliderObjectName = $
"{ColliderObjectPrefix}{gameObject.name}";
169 RemoveOldColliders(colliderObjectName);
171 var backupScale = transform.localScale;
173 var meshCollider = gameObject.AddComponent<MeshCollider>();
174 meshCollider.convex =
true;
175 MeshCollider meshCollider2 =
null;
176 var bounds = meshCollider.bounds;
180 Debug.Log(
"smallestSide: " + smallestSide);
181 if (1.5f / smallestSide > 1)
183 Debug.Log(
"scaling to: " + 1.5f / smallestSide);
184 transform.localScale *= 1.5f / smallestSide;
185 meshCollider2 = gameObject.AddComponent<MeshCollider>();
186 meshCollider2.convex =
true;
187 bounds = meshCollider2.bounds;
190 Vector3[] gridPositions;
191 int xDivisionCount, yDivisionCount, zDivisionCount;
192 BoundsDivider.Divide(bounds, _divisionUnitLength, out gridPositions, out xDivisionCount,
193 out yDivisionCount, out zDivisionCount);
195 var tmpColliders =
new Collider[1];
196 var positionCount = gridPositions.Length;
197 var hasColliderPosition =
new bool[xDivisionCount * yDivisionCount * zDivisionCount];
198 for (var i = 0; i < positionCount; i++)
200 var position = gridPositions[i];
201 if (Physics.OverlapSphereNonAlloc(position, _divisionUnitLength / 2f, tmpColliders) == 0)
continue;
203 hasColliderPosition[i] =
true;
206 var colliderObject =
new GameObject(colliderObjectName);
207 colliderObject.transform.SetParent(transform);
208 var numberofcollidersnow = 0;
210 var retList =
new List<GameObject>();
211 retList.Add(colliderObject);
212 while (hasColliderPosition.Any(p => p))
214 var combineIndex = 0;
215 var combineCountMax =
int.MinValue;
216 var xCombineEdgeCount = 0;
217 var yCombineEdgeCount = 0;
218 var zCombineEdgeCount = 0;
219 for (var i = 0; i < positionCount; i++)
221 if (!hasColliderPosition[i])
continue;
225 while (checkIndex >= 0 && checkIndex < positionCount && hasColliderPosition[checkIndex])
227 checkIndex += zDivisionCount * yDivisionCount;
230 if (checkIndex % (zDivisionCount * yDivisionCount) == 0)
break;
235 while (checkIndex >= 0 && checkIndex < positionCount && hasColliderPosition[checkIndex])
237 checkIndex += zDivisionCount;
240 if (checkIndex % (zDivisionCount * yDivisionCount) / zDivisionCount == 0)
break;
245 while (checkIndex >= 0 && checkIndex < positionCount && hasColliderPosition[checkIndex])
250 if (checkIndex % zDivisionCount == 0)
break;
257 for (var x = 1; x <= xEdgeCount; x++)
258 for (var y = 1; y <= yEdgeCount; y++)
259 for (var z = 1; z <= zEdgeCount; z++)
261 if (!IsValidCubes(hasColliderPosition, i, x, y, z, yDivisionCount, zDivisionCount))
continue;
263 var count = x * y * z;
264 if (count < c)
continue;
272 xEdgeCount = resultX;
273 yEdgeCount = resultY;
274 zEdgeCount = resultZ;
276 var margeCount = xEdgeCount * yEdgeCount * zEdgeCount;
277 if (margeCount <= combineCountMax)
continue;
280 xCombineEdgeCount = xEdgeCount;
281 yCombineEdgeCount = yEdgeCount;
282 zCombineEdgeCount = zEdgeCount;
283 combineCountMax = margeCount;
286 for (var x = 0; x < xCombineEdgeCount; x++)
287 for (var y = 0; y < yCombineEdgeCount; y++)
288 for (var z = 0; z < zCombineEdgeCount; z++)
290 var index = combineIndex + zDivisionCount * yDivisionCount * x + zDivisionCount * y + z;
291 hasColliderPosition[index] =
false;
296 collider.center = gridPositions[combineIndex] +
297 new Vector3(xCombineEdgeCount, yCombineEdgeCount, zCombineEdgeCount) *
298 _divisionUnitLength / 2f - Vector3.one * _divisionUnitLength / 2f;
299 collider.size =
new Vector3(xCombineEdgeCount, yCombineEdgeCount, zCombineEdgeCount) *
301 collider.OnTriggered.AddListener(
Callback);
302 numberofcollidersnow++;
304 if (numberofcollidersnow >= 31)
307 colliderObject =
new GameObject(colliderObjectName + $
"_{newGoNum}");
308 colliderObject.transform.SetParent(transform);
309 numberofcollidersnow = 0;
310 retList.Add(colliderObject);
314 transform.localScale = backupScale;
317 DestroyImmediate(meshCollider);
318 if (meshCollider2 !=
null) DestroyImmediate(meshCollider2);
320 Destroy(meshCollider);
321 if (meshCollider2 !=
null) Destroy(meshCollider2);
322 return retList.ToArray();
329 Debug.Log(
"callback fired!");
330 sender.enabled =
false;
334 Debug.Log(
"callback Finished!");
336 RemoveOldColliders($
"{ColliderObjectPrefix}{gameObject.name}");
342 void RemoveOldColliders(
string colliderObjectName)
344 var child = transform.Find(colliderObjectName);
348 if (!EditorApplication.isPlaying) DestroyImmediate(child.gameObject);
350 Destroy(child.gameObject);
356 child = transform.Find(colliderObjectName +
"_" + i);
360 if (!EditorApplication.isPlaying) DestroyImmediate(child.gameObject);
362 Destroy(child.gameObject);
372 bool IsValidCubes(
bool[] hasCollider,
int index,
int xEdgeCount,
int yEdgeCount,
int zEdgeCount,
int yDivisionCount,
375 for (var x = 0; x < xEdgeCount; x++)
376 for (var y = 0; y < yEdgeCount; y++)
377 for (var z = 0; z < zEdgeCount; z++)
379 var i = index + x * yDivisionCount * zDivisionCount + y * zDivisionCount + z;
380 if (hasCollider[i])
continue;
UnityEngine.UI.Button Button
static float SmallestAxis(Vector3 v)
void Callback(Collider other, BoxColliderExtended sender)
GameObject[] GenerateThreadLocking()