Commit caf4836d authored by Yuyang's avatar Yuyang

于:碰撞盒插件

parent b4c58b08
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5b71ad40e238046238f9b0c6f33c3791, type: 3}
m_Name: Croissant_Convex 1
m_EditorClassIdentifier:
ConvexMeshes:
- {fileID: 4457146010661494424}
HashOfSourceMeshes: 03b41f8bed051b1839efc72900000000
--- !u!43 &4457146010661494424
Mesh:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Generated convex submesh 1
serializedVersion: 10
m_SubMeshes:
- serializedVersion: 2
firstByte: 0
indexCount: 372
topology: 0
baseVertex: 0
firstVertex: 0
vertexCount: 64
localAABB:
m_Center: {x: -0.00000014901161, y: 0.14319226, z: -0.18690638}
m_Extent: {x: 0.6611483, y: 0.34168425, z: 0.5188817}
m_Shapes:
vertices: []
shapes: []
channels: []
fullWeights: []
m_BindPose: []
m_BoneNameHashes:
m_RootBoneNameHash: 0
m_BonesAABB: []
m_VariableBoneCountWeights:
m_Data:
m_MeshCompression: 0
m_IsReadable: 1
m_KeepVertices: 1
m_KeepIndices: 1
m_IndexFormat: 0
m_IndexBuffer: 3e000c003f00010002000e001500030017000c00150017000a0004001b00180008001b0013000e001c00140006001c00020001001e00010011001e00120002001e0011001d001e000b00190021001b000800230003001500240016000300240015001800240012001a0025001a000700250019000b0026000600190026001c000600260013001c0026001d00110027001f000b00270011001f0027002100050027000b002100270001000e0028001100010028000e00130028001f001100280009000400290004000a0029000a00200029002000100029002500090029001000250029000c0017002a00050021002a0022000c002a00030016002b00170003002b000e0002002c00020012002c0020000e002c00080018002d00180015002d00230008002e00140023002e002d000f002e0008002d002e0005002a002f002a0017002f0016000900300007001a0030001a00160030002500070030000900250030000d001a0031001a00120031001d000d0031001e001d00310012001e0031001c000e0032000e002000320020000a0032000d001d00330017002b0033002f00170033000600140034001900060034002e000f00340014002e00340014001c00350032000a0035001c00320035002100190036001900220036002a002100360022002a0036001a000d00370016001a0037002b00160037000d003300370033002b0037000b001f00380026000b0038001300260038002800130038001f00280038000400090039000900160039001b000400390018001b0039001600240039002400180039000f0022003a00220019003a00190034003a0034000f003a00270005003b001d0027003b0005002f003b0033001d003b002f0033003b00100020003c00250010003c00120025003c002c0012003c0020002c003c000a001b003d00230014003d001b0023003d0035000a003d00140035003d0015000c003e0000002d003e002d0015003e000c0022003f0022000f003f002d0000003f000f002d003f0000003e003f00
m_VertexData:
serializedVersion: 3
m_VertexCount: 64
m_Channels:
- stream: 0
offset: 0
format: 0
dimension: 3
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
- stream: 0
offset: 0
format: 0
dimension: 0
m_DataSize: 768
_typelessdata: 8f61d93eb8fa33be4e11513e1abab0bd24365b3e528b2cbffd68acbdfc87ad3e1fe61dbfd82b0dbfec6c573cfba9973ea361e73ed8dd9f3ef8565cbdc737febe7ed406beced8a4be0f9d093fd8c2a1bdf0e3c0bed756e4be29d6b53e325138bed42b0d3fec6c573cfba9973e42038abcaba6e83e993f14be49d7133f52c98f3e3eaf7cbe46e9513d0143eabda92012bfc505ffbed6b949bee5f4653dfe7926bfbf00bd3d968e76be8e0e843e6c16993ec9de1abf130a143f806938bee9d58abb9477ec3dbc41f83eedf7afbe7d5886befb48bd3ddf7926bf7cd962bef275de3efa38f5beee49863e4447bd3d9c7b26bf0141293fa8ba443cecb66dbe4a7af4be868b1fbea4246f3ea0e716bfc1ec0b3e8c7b373ee2b525bfb5b5e8bd09a69d3cecdedf3e68b82339abf8a93ec05e603e5a4120beb490e0be24d813bfd7c58f3e8aad7cbe9ce7163fc1ec0b3e8c7b373ed888133f552b2b3d8fcdd0bee68b13bf923a2b3d06cad0be141784bec711993ed6d81abf9bbcaebd65ff3dbd8f7827bf2ebc623efb77de3ed93af5be687660beb13520be618ce0be17b5f93e7b414bbe6274c6bcaf23293f02b8783c6125953d02f1dfbe68b82339abf8a93eaf113ebee927f63e622da1be88b8813ed37b8abd1f1b16bf6cc281beea668abd921616bfc507523d3183ef3d87ae34bfebf33d3e072af63e062ea1be52e707bf7dbb45be41eb58bdb42329bfeab7783c6825953d69958a3c5600da3eeafe0dbf417af43e858b1fbea3246f3eddb5253fb3b5e8bd01a69d3c5b3312bf556fe9bd16c98ebeac61e7bed8dd9f3ef3565cbd612f10bf0447723efbbaaabe5c2d103fee4a723e92bdaabe064129bf92ba443cecb66dbe402f123f627ee9bd07ca8ebecc22243fc7d1213ecafd5dbe1a53abbdaa8329be528bcfbe57e725bf5074f43ded12f4bb4c7eae3d5c0b3ebd447a27bf30d2833c0901dd3e186befbde7e2fa3ec45232be884746be149d09bfddc2a1bdf1e3c0bebad24bbd07aef43e2306d6be51e7253f5074f43d4113f4bb3a72d9be7efb33be5012513ebd05ff3ed6b949bee4f4653d
m_CompressedMesh:
m_Vertices:
m_NumItems: 0
m_Range: 0
m_Start: 0
m_Data:
m_BitSize: 0
m_UV:
m_NumItems: 0
m_Range: 0
m_Start: 0
m_Data:
m_BitSize: 0
m_Normals:
m_NumItems: 0
m_Range: 0
m_Start: 0
m_Data:
m_BitSize: 0
m_Tangents:
m_NumItems: 0
m_Range: 0
m_Start: 0
m_Data:
m_BitSize: 0
m_Weights:
m_NumItems: 0
m_Data:
m_BitSize: 0
m_NormalSigns:
m_NumItems: 0
m_Data:
m_BitSize: 0
m_TangentSigns:
m_NumItems: 0
m_Data:
m_BitSize: 0
m_FloatColors:
m_NumItems: 0
m_Range: 0
m_Start: 0
m_Data:
m_BitSize: 0
m_BoneIndices:
m_NumItems: 0
m_Data:
m_BitSize: 0
m_Triangles:
m_NumItems: 0
m_Data:
m_BitSize: 0
m_UVInfo: 0
m_LocalAABB:
m_Center: {x: -0.00000014901161, y: 0.14319226, z: -0.18690638}
m_Extent: {x: 0.6611483, y: 0.34168425, z: 0.5188817}
m_MeshUsageFlags: 0
m_BakedConvexCollisionMesh:
m_BakedTriangleCollisionMesh:
m_MeshMetrics[0]: 1
m_MeshMetrics[1]: 1
m_MeshOptimizationFlags: 1
m_StreamData:
offset: 0
size: 0
path:
fileFormatVersion: 2
guid: 09490013e59bf07479c7efa8006d64aa
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: d970d162964d4b04782b8d4b01d484dd
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 98424242f63b533419612f6af71cc2e1
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 83ff3a498b5eccf4682bf36a84344906
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 8b68bf4b8b59ae04197714be4113b42a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 1c10ec3cceef34faa913151699035980
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 2780a7de32341fd4998b5e9002ddade8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System;
using System.Runtime.InteropServices;
namespace Plawius.NonConvexCollider
{
internal static class Interop
{
[DllImport("libvhacd")]
internal static extern int GetMeshEx(IntPtr points,
int poitns_size,
IntPtr triangles,
int triangles_size,
out IntPtr out_points,
out IntPtr out_triangles,
out IntPtr indexes,
out int indexes_cnt,
Parameters prms);
[DllImport("libvhacd")]
internal static extern int ReleaseMemory(IntPtr ptr);
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: 3af5ff56138210b459ccca6e2f91c626
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
{
"name": "NonConvexColliderRuntimeAPI",
"references": [],
"includePlatforms": [
"Editor",
"macOSStandalone",
"WindowsStandalone32",
"WindowsStandalone64"
],
"excludePlatforms": []
}
\ No newline at end of file
fileFormatVersion: 2
guid: 94a8488fd099d4a77964d39d8fd34eea
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 77e901a517c064e1ea04b8f7825e5bde
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 5f814fff098c14c6d985f7b7ee1e7946
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
isPreloaded: 0
isOverridable: 0
platformData:
- first:
'': Any
second:
enabled: 0
settings:
Exclude Editor: 0
Exclude Linux: 0
Exclude Linux64: 0
Exclude LinuxUniversal: 0
Exclude OSXUniversal: 0
Exclude WebGL: 1
Exclude Win: 0
Exclude Win64: 0
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: OSX
- first:
Facebook: Win
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Facebook: Win64
second:
enabled: 0
settings:
CPU: AnyCPU
- first:
Standalone: Linux
second:
enabled: 1
settings:
CPU: x86
- first:
Standalone: Linux64
second:
enabled: 1
settings:
CPU: x86_64
- first:
Standalone: LinuxUniversal
second:
enabled: 1
settings:
CPU: AnyCPU
- first:
Standalone: OSXUniversal
second:
enabled: 1
settings:
CPU: AnyCPU
- first:
Standalone: Win
second:
enabled: 1
settings:
CPU: AnyCPU
- first:
Standalone: Win64
second:
enabled: 1
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 222076c335ea33b4e9e2e6181eb01d2e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 69a529f5774363e45a28f7fb90549b6e
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
isPreloaded: 0
isOverridable: 0
platformData:
- first:
'': Any
second:
enabled: 0
settings:
Exclude Editor: 0
Exclude Linux: 0
Exclude Linux64: 0
Exclude LinuxUniversal: 0
Exclude OSXIntel: 0
Exclude OSXIntel64: 0
Exclude OSXUniversal: 0
Exclude WebGL: 1
Exclude Win: 0
Exclude Win64: 1
- first:
'': Editor
second:
enabled: 0
settings:
CPU: x86
OS: Windows
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 1
settings:
CPU: x86
DefaultValueInitialized: true
OS: Windows
- first:
Facebook: Win
second:
enabled: 1
settings:
CPU: AnyCPU
- first:
Facebook: Win64
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Linux
second:
enabled: 1
settings:
CPU: x86
- first:
Standalone: Linux64
second:
enabled: 1
settings:
CPU: None
- first:
Standalone: LinuxUniversal
second:
enabled: 1
settings:
CPU: AnyCPU
- first:
Standalone: OSXIntel
second:
enabled: 1
settings:
CPU: AnyCPU
- first:
Standalone: OSXIntel64
second:
enabled: 1
settings:
CPU: None
- first:
Standalone: OSXUniversal
second:
enabled: 1
settings:
CPU: AnyCPU
- first:
Standalone: Win
second:
enabled: 1
settings:
CPU: AnyCPU
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: None
- first:
WebGL: WebGL
second:
enabled: 0
settings: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: ab133570395124afb8d7ad3095c7f236
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: eecc7f2cc84431747a064b0aead65ecf
PluginImporter:
serializedVersion: 2
iconMap: {}
executionOrder: {}
isPreloaded: 0
isOverridable: 0
platformData:
data:
first:
'': Any
second:
enabled: 0
settings:
Exclude Editor: 0
Exclude Linux: 0
Exclude Linux64: 0
Exclude LinuxUniversal: 0
Exclude OSXIntel: 0
Exclude OSXIntel64: 0
Exclude OSXUniversal: 0
Exclude Win: 1
Exclude Win64: 0
data:
first:
'': Editor
second:
enabled: 0
settings:
CPU: x86_64
OS: Windows
data:
first:
Any:
second:
enabled: 1
settings: {}
data:
first:
Editor: Editor
second:
enabled: 1
settings:
CPU: x86_64
DefaultValueInitialized: true
data:
first:
Facebook: Win
second:
enabled: 0
settings:
CPU: None
data:
first:
Facebook: Win64
second:
enabled: 1
settings:
CPU: AnyCPU
data:
first:
Standalone: Linux
second:
enabled: 1
settings:
CPU: None
data:
first:
Standalone: Linux64
second:
enabled: 1
settings:
CPU: x86_64
data:
first:
Standalone: LinuxUniversal
second:
enabled: 1
settings:
CPU: AnyCPU
data:
first:
Standalone: OSXIntel
second:
enabled: 1
settings:
CPU: None
data:
first:
Standalone: OSXIntel64
second:
enabled: 1
settings:
CPU: AnyCPU
data:
first:
Standalone: OSXUniversal
second:
enabled: 1
settings:
CPU: AnyCPU
data:
first:
Standalone: Win
second:
enabled: 0
settings:
CPU: None
data:
first:
Standalone: Win64
second:
enabled: 1
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 04140b4d6f4b845bd93d254ba64530f7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 34b13bbb8d148413db86f38f70430d5f
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 04383708f48794c918b7da67b1062a7e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 1f4b935f50d324d75b25cba457288137
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: b7e54399db70c4d85b30bd9df9f92a7f
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 8
mipmaps:
mipMapMode: 1
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 0
aniso: 1
mipBias: -100
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 2
textureShape: 1
singleChannelComponent: 0
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- serializedVersion: 2
buildTarget: DefaultTexturePlatform
maxTextureSize: 128
resizeAlgorithm: 1
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- serializedVersion: 2
buildTarget: Standalone
maxTextureSize: 128
resizeAlgorithm: 1
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
- serializedVersion: 2
buildTarget: WebGL
maxTextureSize: 128
resizeAlgorithm: 1
textureFormat: -1
textureCompression: 0
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 08cc2eed631c3454a8b96ad8b938e528
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using UnityEditor;
using UnityEngine;
using UnityEngine.Assertions;
using UnityEngine.Rendering;
using Debug = UnityEngine.Debug;
namespace Plawius.NonConvexCollider.Editor
{
static class UnityExtensionsMenus
{
// ----------------
[MenuItem("CONTEXT/Collider/ - NonConvex Collider - Delete all disabled Colliders", true, 1)]
static bool DeleteAllDisabledCollidersValidation(MenuCommand menuCommand)
{
if (menuCommand == null) return false;
var collider = (Collider)menuCommand.context;
if (collider == null) return false;
var gameObject = collider.gameObject;
if (gameObject == null) return false;
return gameObject.GetComponents<Collider>().Any(c => c.enabled == false);
}
[MenuItem("CONTEXT/Collider/ - NonConvex Collider - Delete all disabled Colliders", false, 1)]
static void DeleteAllDisabledColliders(MenuCommand menuCommand)
{
var collider = (Collider)menuCommand.context;
var gameObject = collider.gameObject;
UnityExtensions.DeleteAllDisabledColliders(gameObject);
}
// ----------------
[MenuItem("CONTEXT/Collider/ - NonConvex Collider - Delete all Colliders", true, 1)]
static bool DeleteAllCollidersValidation(MenuCommand menuCommand)
{
if (menuCommand == null) return false;
var collider = (Collider)menuCommand.context;
if (collider == null) return false;
var gameObject = collider.gameObject;
if (gameObject == null) return false;
return gameObject.GetComponents<Collider>().Length > 0;
}
[MenuItem("CONTEXT/Collider/ - NonConvex Collider - Delete all Colliders", false, 1)]
static void DeleteAllColliders(MenuCommand menuCommand)
{
var collider = (Collider)menuCommand.context;
var gameObject = collider.gameObject;
UnityExtensions.DeleteAllColliders(gameObject);
}
// ----------------
[MenuItem("CONTEXT/Collider/ - NonConvex Collider - Delete all Colliders but This", true, 2)]
static bool DeleteAllCollidersButThisValidation(MenuCommand menuCommand)
{
if (menuCommand == null) return false;
var collider = (Collider)menuCommand.context;
if (collider == null) return false;
var gameObject = collider.gameObject;
if (gameObject == null) return false;
return gameObject.GetComponents<Collider>().Any(c => collider != c);
}
[MenuItem("CONTEXT/Collider/ - NonConvex Collider - Delete all Colliders but This", false, 2)]
static void DeleteAllCollidersButThis(MenuCommand menuCommand)
{
var collider = (Collider)menuCommand.context;
var gameObject = collider.gameObject;
using (var _ = new UnityExtensions.UndoGroup("Delete all Colliders but This"))
{
foreach (var c in gameObject.GetComponents<Collider>())
{
if (collider == c) continue;
Undo.DestroyObjectImmediate(c);
}
}
}
// ----------------
[MenuItem("CONTEXT/MeshRenderer/ - NonConvex Collider - Generate NonConvex Collider using Mesh for Rendering", true, 0)]
static bool CreateProperCollidersMeshRendererValidation(MenuCommand menuCommand)
{
if (menuCommand == null) return false;
var renderer = (MeshRenderer)menuCommand.context;
if (renderer == null) return false;
var gameObject = renderer.gameObject;
if (gameObject == null) return false;
var filter = gameObject.GetComponent<MeshFilter>();
if (filter == null) return false;
return filter.sharedMesh != null;
}
[MenuItem("CONTEXT/MeshRenderer/ - NonConvex Collider - Generate NonConvex Collider using Mesh for Rendering", false, 0)]
static void CreateProperCollidersMeshRenderer(MenuCommand menuCommand)
{
var renderer = (MeshRenderer)menuCommand.context;
var gameObject = renderer.gameObject;
var filter = gameObject.GetComponent<MeshFilter>();
UnityExtensions.GenerateConvexMeshes(filter.sharedMesh, gameObject);
}
// ----------------
[MenuItem("CONTEXT/MeshFilter/ - NonConvex Collider - Generate NonConvex Collider using Mesh for Rendering", true, 0)]
static bool CreateProperCollidersMeshFilterValidation(MenuCommand menuCommand)
{
if (menuCommand == null) return false;
var filter = (MeshFilter)menuCommand.context;
if (filter == null) return false;
if (filter.gameObject == null) return false;
return filter.sharedMesh != null;
}
[MenuItem("CONTEXT/MeshFilter/ - NonConvex Collider - Generate NonConvex Collider using Mesh for Rendering", false, 0)]
static void CreateProperCollidersMeshFilter(MenuCommand menuCommand)
{
var filter = (MeshFilter)menuCommand.context;
var gameObject = filter.gameObject;
UnityExtensions.GenerateConvexMeshes(filter.sharedMesh, gameObject);
}
// ----------------
[MenuItem("CONTEXT/MeshCollider/ - NonConvex Collider - Generate NonConvex Collider using this collision mesh", true, 0)]
static bool CreateProperCollidersMeshColliderValidation(MenuCommand menuCommand)
{
if (menuCommand == null) return false;
var collider = (MeshCollider)menuCommand.context;
if (collider == null) return false;
var gameObject = collider.gameObject;
if (gameObject == null) return false;
return collider.sharedMesh != null;
}
[MenuItem("CONTEXT/MeshCollider/ - NonConvex Collider - Generate NonConvex Collider using this collision mesh", false, 0)]
static void CreateProperCollidersMeshCollider(MenuCommand menuCommand)
{
var collider = (MeshCollider)menuCommand.context;
var gameObject = collider.gameObject;
UnityExtensions.GenerateConvexMeshes(collider.sharedMesh, gameObject, collider);
}
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: 456b9f42496c446889b242039ec8e2bb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 585350d1a03be4d7ea82897df24ff44f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
{
"name": "NonConvexEditor",
"references": [
"NonConvexCollider",
"NonConvexColliderRuntimeAPI"
],
"includePlatforms": [
"Editor"
],
"excludePlatforms": []
}
\ No newline at end of file
fileFormatVersion: 2
guid: 980281690de5a4ce18bdad3bdacf3bc0
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
{
"name": "NonConvexCollider",
"references": [
"NonConvexColliderRuntimeAPI"
],
"includePlatforms": [],
"excludePlatforms": []
}
\ No newline at end of file
fileFormatVersion: 2
guid: b88dbd12180db434282b57f451ffc21a
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
using UnityEngine;
using System.Linq;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace Plawius.NonConvexCollider
{
public class NonConvexColliderAsset : ScriptableObject
{
public Mesh[] ConvexMeshes = new Mesh[0];
public long[] HashOfSourceMeshes; // hash of vertices + triangles + vhacd params
public static NonConvexColliderAsset CreateAsset(Mesh[] meshes)
{
var obj = ScriptableObject.CreateInstance<NonConvexColliderAsset>();
obj.ConvexMeshes = meshes;
obj.HashOfSourceMeshes = new long[0];
return obj;
}
#if UNITY_EDITOR
public static NonConvexColliderAsset CreateAsset(string path, Mesh[] meshes, long[] hashes)
{
var obj = ScriptableObject.CreateInstance<NonConvexColliderAsset>();
AssetDatabase.CreateAsset(obj, path);
foreach (var mesh in meshes)
AssetDatabase.AddObjectToAsset(mesh, obj);
obj.ConvexMeshes = meshes;
obj.HashOfSourceMeshes = hashes;
return obj;
}
public bool SameHash(long[] meshHashes)
{
if (HashOfSourceMeshes == null)
HashOfSourceMeshes = new long[0];
if (meshHashes.Length != HashOfSourceMeshes.Length)
return false;
foreach (var h in meshHashes)
{
if (HashOfSourceMeshes.Contains(h) == false)
return false;
}
return true;
}
#endif
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: 5b71ad40e238046238f9b0c6f33c3791
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {fileID: 2800000, guid: a57c63f4c2373d241bee60b80cf5a1a9, type: 3}
userData:
assetBundleName:
assetBundleVariant:
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Assertions;
namespace Plawius.NonConvexCollider
{
[ExecuteInEditMode]
[DisallowMultipleComponent]
public class NonConvexColliderComponent : MonoBehaviour
{
#if UNITY_EDITOR
public Parameters Params = Parameters.Default();
#endif
[SerializeField] private List<MeshCollider> m_colliders = new List<MeshCollider>();
[SerializeField] private bool m_isTrigger = false;
[SerializeField] private PhysicMaterial m_material = null;
private bool m_isDirty = true;
#if UNITY_EDITOR
[SerializeField] private bool m_showColliders = false;
#endif
public List<MeshCollider> ConvexColliders
{
get
{
return m_colliders;
}
}
public bool IsTrigger
{
get { return m_isTrigger; }
set
{
if (m_isTrigger != value)
{
m_isTrigger = value;
m_isDirty = true;
}
}
}
public PhysicMaterial Material
{
get { return m_material; }
set
{
if (m_material != value)
{
m_material = value;
m_isDirty = true;
}
}
}
[SerializeField] private NonConvexColliderAsset m_colliderAsset;
public NonConvexColliderAsset ColliderAsset
{
get
{
return m_colliderAsset;
}
private set
{
m_colliderAsset = value;
}
}
private void OnEnable()
{
SyncState(true);
}
private void OnDisable()
{
SyncState(false);
}
void Update()
{
if (m_isDirty)
{
foreach (var coll in ConvexColliders)
{
coll.isTrigger = IsTrigger;
coll.material = Material;
}
m_isDirty = false;
}
}
#if UNITY_EDITOR
public void SyncState()
{
SyncState(enabled);
}
private void OnValidate()
{
SyncState();
}
#endif
private void SyncState(bool isEnabled)
{
#if UNITY_EDITOR
// Editor only checks
// asset was deleted, m_colliderAsset is missing, ConvexColliders is out of sync
if (ConvexColliders.Count > 0 && m_colliderAsset == null)
{
SetPhysicsCollider(null); // just set to null, this should delete all ConvexColliders
Assert.IsTrue(ConvexColliders.Count == 0);
}
// undo happened. asset is set, ConvexColliders is empty/contains null (out of sync)
if ((ConvexColliders.Count == 0 || ConvexColliders[0] == null) && m_colliderAsset != null)
{
SetPhysicsCollider(m_colliderAsset); // just set to null, this should delete all ConvexColliders
Assert.IsTrue(ConvexColliders.Count != 0);
}
#endif
for (var i = 0; i < ConvexColliders.Count; i++)
{
var coll = ConvexColliders[i];
coll.isTrigger = IsTrigger;
coll.sharedMaterial = Material;
coll.enabled = isEnabled;
coll.convex = true;
coll.sharedMesh = m_colliderAsset.ConvexMeshes[i];
#if UNITY_EDITOR
coll.hideFlags = m_showColliders ? HideFlags.None : HideFlags.HideInInspector | HideFlags.NotEditable;
#endif
}
m_isDirty = false;
}
public void SetPhysicsCollider(NonConvexColliderAsset newColliderAsset)
{
var wasActive = gameObject.activeSelf;
gameObject.SetActive(false);
RemoveAllCollidersFrom(ColliderAsset);
DisableAllColliders();
AddAllCollidersFrom(newColliderAsset);
gameObject.SetActive(wasActive);
}
private void DisableAllColliders()
{
var colliders = GetComponents<Collider>();
foreach (var c in colliders)
c.enabled = false;
}
private void AddAllCollidersFrom(NonConvexColliderAsset colliderAsset)
{
m_colliders.Clear();
if (colliderAsset == null)
return;
for (var i = 0; i < colliderAsset.ConvexMeshes.Length; ++i)
{
var mesh = colliderAsset.ConvexMeshes[i];
var mc = gameObject.AddComponent<MeshCollider>();
mc.sharedMesh = mesh;
mc.convex = true;
mc.isTrigger = IsTrigger;
mc.material = Material;
m_colliders.Add(mc);
}
m_colliderAsset = colliderAsset;
}
private void RemoveAllCollidersFrom(NonConvexColliderAsset colliderAsset)
{
m_colliders.Clear();
if (colliderAsset == null)
return;
var colldiers = GetComponents<MeshCollider>();
for (var i = colldiers.Length - 1; i >= 0; --i)
{
var c = colldiers[i];
if (c.sharedMesh == null || colliderAsset.ConvexMeshes.Contains(c.sharedMesh))
{
#if UNITY_EDITOR
DestroyImmediate(c, true);
#else
Destroy(c);
#endif
}
}
if (m_colliderAsset == colliderAsset)
m_colliderAsset = null;
}
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: 824b6f25573464a1f9fbc2ebe0229e83
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 908b8e33b40dd41d982135eaa391b369
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
using System;
using System.Diagnostics;
using Plawius.NonConvexCollider;
using UnityEngine;
using Debug = UnityEngine.Debug;
public class RuntimeTest : MonoBehaviour
{
void Start()
{
gameObject.AddComponent<Rigidbody>();
var filter = gameObject.AddComponent< MeshFilter >();
var mesh = filter.mesh;
using (var _ = new StopwatchScoped("Generate mesh"))
{
GenerateTorusMesh(mesh);
}
gameObject.AddComponent<MeshRenderer>();
Mesh[] meshes;
using (var _ = new StopwatchScoped("NonConvexCollider generate meshes"))
{
meshes = API.GenerateConvexMeshes(mesh, Parameters.Default());
}
using (var _ = new StopwatchScoped("NonConvexCollider generate add to gameobject"))
{
var colliderAsset = NonConvexColliderAsset.CreateAsset(meshes);
var nonConvex = gameObject.AddComponent<NonConvexColliderComponent>();
nonConvex.SetPhysicsCollider(colliderAsset);
}
}
// -------------------------------------------------------------------------------------------------------
private static void GenerateTorusMesh(Mesh mesh)
{
mesh.Clear();
const float radius1 = 1f;
const float radius2 = .3f;
const int nbRadSeg = 24;
const int nbSides = 18;
#region Vertices
var vertices = new Vector3[(nbRadSeg + 1) * (nbSides + 1)];
const float pi2 = Mathf.PI * 2f;
for (var seg = 0; seg <= nbRadSeg; seg++)
{
var currSeg = seg == nbRadSeg ? 0 : seg;
var t1 = (float) currSeg / nbRadSeg * pi2;
var r1 = new Vector3(Mathf.Cos(t1) * radius1, 0f, Mathf.Sin(t1) * radius1);
for (var side = 0; side <= nbSides; side++)
{
var currSide = side == nbSides ? 0 : side;
var t2 = (float) currSide / nbSides * pi2;
var r2 = Quaternion.AngleAxis(-t1 * Mathf.Rad2Deg, Vector3.up) *
new Vector3(Mathf.Sin(t2) * radius2, Mathf.Cos(t2) * radius2);
vertices[side + seg * (nbSides + 1)] = r1 + r2;
}
}
#endregion
#region Normales
var normales = new Vector3[vertices.Length];
for (var seg = 0; seg <= nbRadSeg; seg++)
{
var currSeg = seg == nbRadSeg ? 0 : seg;
var t1 = (float) currSeg / nbRadSeg * pi2;
var r1 = new Vector3(Mathf.Cos(t1) * radius1, 0f, Mathf.Sin(t1) * radius1);
for (var side = 0; side <= nbSides; side++)
{
normales[side + seg * (nbSides + 1)] = (vertices[side + seg * (nbSides + 1)] - r1).normalized;
}
}
#endregion
#region UVs
var uvs = new Vector2[vertices.Length];
for (var seg = 0; seg <= nbRadSeg; seg++)
for (var side = 0; side <= nbSides; side++)
uvs[side + seg * (nbSides + 1)] = new Vector2((float) seg / nbRadSeg, (float) side / nbSides);
#endregion
#region Triangles
var nbFaces = vertices.Length;
var nbTriangles = nbFaces * 2;
var nbIndexes = nbTriangles * 3;
var triangles = new int[nbIndexes];
var i = 0;
for (var seg = 0; seg <= nbRadSeg; seg++)
{
for (var side = 0; side <= nbSides - 1; side++)
{
var current = side + seg * (nbSides + 1);
var next = side + (seg < (nbRadSeg) ? (seg + 1) * (nbSides + 1) : 0);
if (i < triangles.Length - 6)
{
triangles[i++] = current;
triangles[i++] = next;
triangles[i++] = next + 1;
triangles[i++] = current;
triangles[i++] = next + 1;
triangles[i++] = current + 1;
}
}
}
#endregion
mesh.vertices = vertices;
mesh.normals = normales;
mesh.uv = uvs;
mesh.triangles = triangles;
mesh.RecalculateBounds();
}
// -------------------------------------------------------------------------------------------------------
private class StopwatchScoped : IDisposable
{
private readonly string name;
private readonly Stopwatch stopwatch;
public StopwatchScoped(string name)
{
this.name = name;
stopwatch = Stopwatch.StartNew();
}
public void Dispose()
{
var elapsed = stopwatch.ElapsedMilliseconds;
if (elapsed > 1000)
Debug.LogFormat("[{0}] took {1} seconds", name, elapsed / 1000.0);
else
Debug.LogFormat("[{0}] took {1} msec", name, elapsed);
}
}
}
fileFormatVersion: 2
guid: 0bd5849cdea954e4d9a8a802c8d440f5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
{
"name": "RuntimeTestAssembly",
"references": [
"NonConvexColliderRuntimeAPI",
"NonConvexCollider"
],
"includePlatforms": [
"Editor",
"macOSStandalone",
"WindowsStandalone32",
"WindowsStandalone64"
],
"excludePlatforms": []
}
\ No newline at end of file
fileFormatVersion: 2
guid: a30492b6c20c1488dab8bab54de4e777
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 26682b2a7556c487faa27b9833d1d149
timeCreated: 1552541845
licenseType: Store
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment