using UnityEngine;
using System.Linq;
using System.Collections;
public class AddInvertedMeshCollider : MonoBehaviour
{
public bool removeExistingColliders = true;
public void CreateInvertedMeshCollider()
{
if (removeExistingColliders)
RemoveExistingColliders();
InvertMesh();
gameObject.AddComponent<MeshCollider>();
}
private void RemoveExistingColliders()
{
Collider[] colliders = GetComponents<Collider>();
for (int i = 0; i < colliders.Length; i++)
DestroyImmediate(colliders[i]);
}
private void InvertMesh()
{
Mesh mesh = GetComponent<MeshFilter>().mesh;
mesh.triangles = mesh.triangles.Reverse().ToArray();
}
}
也:
using UnityEngine;
using UnityEditor;
using System.Collections;
[CustomEditor(typeof(AddInvertedMeshCollider))]
public class AddInvertedMeshColliderEditor :Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector();
AddInvertedMeshCollider script = (AddInvertedMeshCollider)target;
if (GUILayout.Button("Create Inverted Mesh Collider"))
script.CreateInvertedMeshCollider();
}
}
理论:对撞机只捕捉到网格的一侧。因此,以某种方式选择了一方。
如何?它是在点法线(Vertex Normals)的方向上选择的。这意味着我们的任务是将对象从里到外翻转以获得相同的多边形,但法线指向另一个方向。
选项1:
理论上,创建一个球体并将比例设置为 -1 可能会起作用。理论上,这只会创建一个内部对撞机。但在实践中,您需要自己检查。
操作原理:点的法线必须随着刻度由里向外翻转。
在评论中,Riot 写道,这不适用于默认原语,但它适用于导入的原语。也许他是对的。但在实践中,我需要检查它:D
选项 2:
也:
代码取自这里: https ://forum.unity.com/threads/can-you-invert-a-sphere-or-box-collider.118733/