├── ConvexHull ├── ConvexHull.cs ├── ConvexHull.cs.meta ├── ConvexHull.prefab ├── ConvexHull.prefab.meta ├── ConvexHullTest.cs ├── ConvexHullTest.cs.meta ├── TestScene.unity └── TestScene.unity.meta ├── Preview.gif └── README.md /ConvexHull/ConvexHull.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using UnityEngine; 5 | 6 | namespace Hont 7 | { 8 | public class ConvexHull : MonoBehaviour 9 | { 10 | public Transform[] pointsArray; 11 | public float height = 4; 12 | 13 | 14 | public bool IsInRange(Vector3 comparePoint) 15 | { 16 | comparePoint = transform.worldToLocalMatrix.MultiplyPoint3x4(comparePoint); 17 | 18 | var flag = true; 19 | flag &= comparePoint.y <= height; 20 | flag &= comparePoint.y >= -height; 21 | flag &= IsConcaveContain2D(pointsArray, comparePoint); 22 | 23 | if (flag) 24 | return true; 25 | 26 | return false; 27 | } 28 | 29 | bool IsConcaveContain2D(Transform[] points, Vector3 compare) 30 | { 31 | const float VIRTUAL_RAYCAST_LEN = 100000; 32 | 33 | var comparePoint = (points[1].localPosition + points[0].localPosition) * 0.5f; 34 | var originPoint = compare; 35 | comparePoint += (comparePoint - originPoint).normalized * VIRTUAL_RAYCAST_LEN; 36 | 37 | int count = 0; 38 | for (int i = 0; i < points.Length; i++) 39 | { 40 | var a = points[i % points.Length]; 41 | var b = points[(i + 1) % points.Length]; 42 | 43 | var r = IsLineSegmentIntersection(a.localPosition, b.localPosition, originPoint, comparePoint); 44 | 45 | if (r) count++; 46 | } 47 | 48 | return count % 2 == 1; 49 | } 50 | 51 | bool IsLineSegmentIntersection(Vector3 a, Vector3 b, Vector3 c, Vector3 d) 52 | { 53 | var crossA = Mathf.Sign(Vector3.Cross(d - c, a - c).y); 54 | var crossB = Mathf.Sign(Vector3.Cross(d - c, b - c).y); 55 | 56 | if (Mathf.Approximately(crossA, crossB)) return false; 57 | 58 | var crossC = Mathf.Sign(Vector3.Cross(b - a, c - a).y); 59 | var crossD = Mathf.Sign(Vector3.Cross(b - a, d - a).y); 60 | 61 | if (Mathf.Approximately(crossC, crossD)) return false; 62 | 63 | return true; 64 | } 65 | 66 | #if UNITY_EDITOR 67 | void OnDrawGizmos() 68 | { 69 | if (pointsArray == null) return; 70 | 71 | var cacheMatrix = UnityEditor.Handles.matrix; 72 | UnityEditor.Handles.matrix = transform.localToWorldMatrix; 73 | 74 | Action drawPoints = () => 75 | { 76 | for (int i = 0; i < pointsArray.Length; i++) 77 | { 78 | var a = pointsArray[i]; 79 | var b = pointsArray[(i + 1) % pointsArray.Length]; 80 | 81 | if (a == null) continue; 82 | if (b == null) continue; 83 | 84 | var minA = a.localPosition; 85 | var minB = b.localPosition; 86 | 87 | var maxA = a.localPosition; 88 | var maxB = b.localPosition; 89 | 90 | minA.y = -height; 91 | minB.y = -height; 92 | 93 | maxA.y = height; 94 | maxB.y = height; 95 | 96 | UnityEditor.Handles.DrawAAPolyLine(minA, minB); 97 | UnityEditor.Handles.DrawAAPolyLine(maxA, maxB); 98 | 99 | UnityEditor.Handles.DrawAAPolyLine(minA, maxA); 100 | UnityEditor.Handles.DrawAAPolyLine(minB, maxB); 101 | } 102 | }; 103 | 104 | UnityEditor.Handles.zTest = UnityEngine.Rendering.CompareFunction.Less; 105 | drawPoints(); 106 | UnityEditor.Handles.zTest = UnityEngine.Rendering.CompareFunction.GreaterEqual; 107 | var cacheColor = UnityEditor.Handles.color; 108 | UnityEditor.Handles.color = new Color(0.3f, 0.3f, 0.3f, 0.7f); 109 | drawPoints(); 110 | UnityEditor.Handles.color = cacheColor; 111 | 112 | UnityEditor.Handles.matrix = cacheMatrix; 113 | } 114 | #endif 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /ConvexHull/ConvexHull.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b3d9eb310d7df0442ad11b1caa91d8d6 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /ConvexHull/ConvexHull.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1001 &100100000 4 | Prefab: 5 | m_ObjectHideFlags: 1 6 | serializedVersion: 2 7 | m_Modification: 8 | m_TransformParent: {fileID: 0} 9 | m_Modifications: [] 10 | m_RemovedComponents: 11 | - {fileID: 0} 12 | m_ParentPrefab: {fileID: 0} 13 | m_RootGameObject: {fileID: 1990543880091306} 14 | m_IsPrefabParent: 0 15 | --- !u!1 &1010363779116210 16 | GameObject: 17 | m_ObjectHideFlags: 0 18 | m_PrefabParentObject: {fileID: 0} 19 | m_PrefabInternal: {fileID: 100100000} 20 | serializedVersion: 5 21 | m_Component: 22 | - component: {fileID: 4196523989004390} 23 | m_Layer: 0 24 | m_Name: P0 (2) 25 | m_TagString: Untagged 26 | m_Icon: {fileID: 0} 27 | m_NavMeshLayer: 0 28 | m_StaticEditorFlags: 0 29 | m_IsActive: 1 30 | --- !u!1 &1339346543885580 31 | GameObject: 32 | m_ObjectHideFlags: 0 33 | m_PrefabParentObject: {fileID: 0} 34 | m_PrefabInternal: {fileID: 100100000} 35 | serializedVersion: 5 36 | m_Component: 37 | - component: {fileID: 4407766571179380} 38 | m_Layer: 0 39 | m_Name: P0 (4) 40 | m_TagString: Untagged 41 | m_Icon: {fileID: 0} 42 | m_NavMeshLayer: 0 43 | m_StaticEditorFlags: 0 44 | m_IsActive: 1 45 | --- !u!1 &1361001023208242 46 | GameObject: 47 | m_ObjectHideFlags: 0 48 | m_PrefabParentObject: {fileID: 0} 49 | m_PrefabInternal: {fileID: 100100000} 50 | serializedVersion: 5 51 | m_Component: 52 | - component: {fileID: 4686145529775278} 53 | m_Layer: 0 54 | m_Name: P0 (1) 55 | m_TagString: Untagged 56 | m_Icon: {fileID: 0} 57 | m_NavMeshLayer: 0 58 | m_StaticEditorFlags: 0 59 | m_IsActive: 1 60 | --- !u!1 &1396481917875142 61 | GameObject: 62 | m_ObjectHideFlags: 0 63 | m_PrefabParentObject: {fileID: 0} 64 | m_PrefabInternal: {fileID: 100100000} 65 | serializedVersion: 5 66 | m_Component: 67 | - component: {fileID: 4564448258363588} 68 | m_Layer: 0 69 | m_Name: P0 (5) 70 | m_TagString: Untagged 71 | m_Icon: {fileID: 0} 72 | m_NavMeshLayer: 0 73 | m_StaticEditorFlags: 0 74 | m_IsActive: 1 75 | --- !u!1 &1901230341551410 76 | GameObject: 77 | m_ObjectHideFlags: 0 78 | m_PrefabParentObject: {fileID: 0} 79 | m_PrefabInternal: {fileID: 100100000} 80 | serializedVersion: 5 81 | m_Component: 82 | - component: {fileID: 4492608867375848} 83 | m_Layer: 0 84 | m_Name: P0 (3) 85 | m_TagString: Untagged 86 | m_Icon: {fileID: 0} 87 | m_NavMeshLayer: 0 88 | m_StaticEditorFlags: 0 89 | m_IsActive: 1 90 | --- !u!1 &1932301174342326 91 | GameObject: 92 | m_ObjectHideFlags: 0 93 | m_PrefabParentObject: {fileID: 0} 94 | m_PrefabInternal: {fileID: 100100000} 95 | serializedVersion: 5 96 | m_Component: 97 | - component: {fileID: 4922273558124864} 98 | m_Layer: 0 99 | m_Name: P0 100 | m_TagString: Untagged 101 | m_Icon: {fileID: 0} 102 | m_NavMeshLayer: 0 103 | m_StaticEditorFlags: 0 104 | m_IsActive: 1 105 | --- !u!1 &1990543880091306 106 | GameObject: 107 | m_ObjectHideFlags: 0 108 | m_PrefabParentObject: {fileID: 0} 109 | m_PrefabInternal: {fileID: 100100000} 110 | serializedVersion: 5 111 | m_Component: 112 | - component: {fileID: 4352976797656450} 113 | m_Layer: 0 114 | m_Name: ConvexHull 115 | m_TagString: Untagged 116 | m_Icon: {fileID: 0} 117 | m_NavMeshLayer: 0 118 | m_StaticEditorFlags: 0 119 | m_IsActive: 1 120 | --- !u!4 &4196523989004390 121 | Transform: 122 | m_ObjectHideFlags: 1 123 | m_PrefabParentObject: {fileID: 0} 124 | m_PrefabInternal: {fileID: 100100000} 125 | m_GameObject: {fileID: 1010363779116210} 126 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 127 | m_LocalPosition: {x: 1.67, y: 0, z: 1.88} 128 | m_LocalScale: {x: 1, y: 1, z: 1} 129 | m_Children: [] 130 | m_Father: {fileID: 4352976797656450} 131 | m_RootOrder: 2 132 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 133 | --- !u!4 &4352976797656450 134 | Transform: 135 | m_ObjectHideFlags: 1 136 | m_PrefabParentObject: {fileID: 0} 137 | m_PrefabInternal: {fileID: 100100000} 138 | m_GameObject: {fileID: 1990543880091306} 139 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 140 | m_LocalPosition: {x: -10.115441, y: -0.69703174, z: -8.694135} 141 | m_LocalScale: {x: 1, y: 1, z: 1} 142 | m_Children: 143 | - {fileID: 4922273558124864} 144 | - {fileID: 4686145529775278} 145 | - {fileID: 4196523989004390} 146 | - {fileID: 4492608867375848} 147 | - {fileID: 4407766571179380} 148 | - {fileID: 4564448258363588} 149 | m_Father: {fileID: 0} 150 | m_RootOrder: 0 151 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 152 | --- !u!4 &4407766571179380 153 | Transform: 154 | m_ObjectHideFlags: 1 155 | m_PrefabParentObject: {fileID: 0} 156 | m_PrefabInternal: {fileID: 100100000} 157 | m_GameObject: {fileID: 1339346543885580} 158 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 159 | m_LocalPosition: {x: 3.01, y: 0, z: -1.79} 160 | m_LocalScale: {x: 1, y: 1, z: 1} 161 | m_Children: [] 162 | m_Father: {fileID: 4352976797656450} 163 | m_RootOrder: 4 164 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 165 | --- !u!4 &4492608867375848 166 | Transform: 167 | m_ObjectHideFlags: 1 168 | m_PrefabParentObject: {fileID: 0} 169 | m_PrefabInternal: {fileID: 100100000} 170 | m_GameObject: {fileID: 1901230341551410} 171 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 172 | m_LocalPosition: {x: 2.86, y: 0, z: 0.38} 173 | m_LocalScale: {x: 1, y: 1, z: 1} 174 | m_Children: [] 175 | m_Father: {fileID: 4352976797656450} 176 | m_RootOrder: 3 177 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 178 | --- !u!4 &4564448258363588 179 | Transform: 180 | m_ObjectHideFlags: 1 181 | m_PrefabParentObject: {fileID: 0} 182 | m_PrefabInternal: {fileID: 100100000} 183 | m_GameObject: {fileID: 1396481917875142} 184 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 185 | m_LocalPosition: {x: 0, y: 0, z: -1.83} 186 | m_LocalScale: {x: 1, y: 1, z: 1} 187 | m_Children: [] 188 | m_Father: {fileID: 4352976797656450} 189 | m_RootOrder: 5 190 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 191 | --- !u!4 &4686145529775278 192 | Transform: 193 | m_ObjectHideFlags: 1 194 | m_PrefabParentObject: {fileID: 0} 195 | m_PrefabInternal: {fileID: 100100000} 196 | m_GameObject: {fileID: 1361001023208242} 197 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 198 | m_LocalPosition: {x: 0.24, y: 0, z: 1.75} 199 | m_LocalScale: {x: 1, y: 1, z: 1} 200 | m_Children: [] 201 | m_Father: {fileID: 4352976797656450} 202 | m_RootOrder: 1 203 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 204 | --- !u!4 &4922273558124864 205 | Transform: 206 | m_ObjectHideFlags: 1 207 | m_PrefabParentObject: {fileID: 0} 208 | m_PrefabInternal: {fileID: 100100000} 209 | m_GameObject: {fileID: 1932301174342326} 210 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 211 | m_LocalPosition: {x: 0, y: 0, z: 0} 212 | m_LocalScale: {x: 1, y: 1, z: 1} 213 | m_Children: [] 214 | m_Father: {fileID: 4352976797656450} 215 | m_RootOrder: 0 216 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 217 | -------------------------------------------------------------------------------- /ConvexHull/ConvexHull.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8eb671c382820d84db8806b889962aa8 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 100100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /ConvexHull/ConvexHullTest.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | namespace Hont 6 | { 7 | public class ConvexHullTest : MonoBehaviour 8 | { 9 | public ConvexHull convexCull; 10 | 11 | 12 | void Update() 13 | { 14 | var mat = GetComponent().material; 15 | if (convexCull.IsInRange(transform.position)) 16 | mat.color = Color.red; 17 | else 18 | mat.color = Color.white; 19 | } 20 | } 21 | } 22 | 23 | -------------------------------------------------------------------------------- /ConvexHull/ConvexHullTest.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 17f1c2e8bc75ed0419387a3ce7d27d15 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /ConvexHull/TestScene.unity: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!29 &1 4 | OcclusionCullingSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_OcclusionBakeSettings: 8 | smallestOccluder: 5 9 | smallestHole: 0.25 10 | backfaceThreshold: 100 11 | m_SceneGUID: 00000000000000000000000000000000 12 | m_OcclusionCullingData: {fileID: 0} 13 | --- !u!104 &2 14 | RenderSettings: 15 | m_ObjectHideFlags: 0 16 | serializedVersion: 8 17 | m_Fog: 0 18 | m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} 19 | m_FogMode: 3 20 | m_FogDensity: 0.01 21 | m_LinearFogStart: 0 22 | m_LinearFogEnd: 300 23 | m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} 24 | m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} 25 | m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} 26 | m_AmbientIntensity: 1 27 | m_AmbientMode: 0 28 | m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} 29 | m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} 30 | m_HaloStrength: 0.5 31 | m_FlareStrength: 1 32 | m_FlareFadeSpeed: 3 33 | m_HaloTexture: {fileID: 0} 34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} 35 | m_DefaultReflectionMode: 0 36 | m_DefaultReflectionResolution: 128 37 | m_ReflectionBounces: 1 38 | m_ReflectionIntensity: 1 39 | m_CustomReflection: {fileID: 0} 40 | m_Sun: {fileID: 0} 41 | m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1} 42 | --- !u!157 &3 43 | LightmapSettings: 44 | m_ObjectHideFlags: 0 45 | serializedVersion: 11 46 | m_GIWorkflowMode: 0 47 | m_GISettings: 48 | serializedVersion: 2 49 | m_BounceScale: 1 50 | m_IndirectOutputScale: 1 51 | m_AlbedoBoost: 1 52 | m_TemporalCoherenceThreshold: 1 53 | m_EnvironmentLightingMode: 0 54 | m_EnableBakedLightmaps: 1 55 | m_EnableRealtimeLightmaps: 1 56 | m_LightmapEditorSettings: 57 | serializedVersion: 9 58 | m_Resolution: 2 59 | m_BakeResolution: 40 60 | m_TextureWidth: 1024 61 | m_TextureHeight: 1024 62 | m_AO: 0 63 | m_AOMaxDistance: 1 64 | m_CompAOExponent: 1 65 | m_CompAOExponentDirect: 0 66 | m_Padding: 2 67 | m_LightmapParameters: {fileID: 0} 68 | m_LightmapsBakeMode: 1 69 | m_TextureCompression: 1 70 | m_FinalGather: 0 71 | m_FinalGatherFiltering: 1 72 | m_FinalGatherRayCount: 256 73 | m_ReflectionCompression: 2 74 | m_MixedBakeMode: 2 75 | m_BakeBackend: 1 76 | m_PVRSampling: 1 77 | m_PVRDirectSampleCount: 32 78 | m_PVRSampleCount: 500 79 | m_PVRBounces: 2 80 | m_PVRFiltering: 0 81 | m_PVRFilteringMode: 1 82 | m_PVRCulling: 1 83 | m_PVRFilteringGaussRadiusDirect: 1 84 | m_PVRFilteringGaussRadiusIndirect: 5 85 | m_PVRFilteringGaussRadiusAO: 2 86 | m_PVRFilteringAtrousColorSigma: 1 87 | m_PVRFilteringAtrousNormalSigma: 1 88 | m_PVRFilteringAtrousPositionSigma: 1 89 | m_LightingDataAsset: {fileID: 0} 90 | m_UseShadowmask: 1 91 | --- !u!196 &4 92 | NavMeshSettings: 93 | serializedVersion: 2 94 | m_ObjectHideFlags: 0 95 | m_BuildSettings: 96 | serializedVersion: 2 97 | agentTypeID: 0 98 | agentRadius: 0.5 99 | agentHeight: 2 100 | agentSlope: 45 101 | agentClimb: 0.4 102 | ledgeDropHeight: 0 103 | maxJumpAcrossDistance: 0 104 | minRegionArea: 2 105 | manualCellSize: 0 106 | cellSize: 0.16666667 107 | manualTileSize: 0 108 | tileSize: 256 109 | accuratePlacement: 0 110 | m_NavMeshData: {fileID: 0} 111 | --- !u!1 &136311635 112 | GameObject: 113 | m_ObjectHideFlags: 0 114 | m_PrefabParentObject: {fileID: 0} 115 | m_PrefabInternal: {fileID: 0} 116 | serializedVersion: 5 117 | m_Component: 118 | - component: {fileID: 136311636} 119 | m_Layer: 0 120 | m_Name: p0 121 | m_TagString: Untagged 122 | m_Icon: {fileID: 0} 123 | m_NavMeshLayer: 0 124 | m_StaticEditorFlags: 0 125 | m_IsActive: 1 126 | --- !u!4 &136311636 127 | Transform: 128 | m_ObjectHideFlags: 0 129 | m_PrefabParentObject: {fileID: 0} 130 | m_PrefabInternal: {fileID: 0} 131 | m_GameObject: {fileID: 136311635} 132 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 133 | m_LocalPosition: {x: 0, y: 0, z: 0} 134 | m_LocalScale: {x: 1, y: 1, z: 1} 135 | m_Children: [] 136 | m_Father: {fileID: 349279012} 137 | m_RootOrder: 0 138 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 139 | --- !u!1 &274724978 140 | GameObject: 141 | m_ObjectHideFlags: 0 142 | m_PrefabParentObject: {fileID: 0} 143 | m_PrefabInternal: {fileID: 0} 144 | serializedVersion: 5 145 | m_Component: 146 | - component: {fileID: 274724980} 147 | - component: {fileID: 274724979} 148 | m_Layer: 0 149 | m_Name: Directional Light 150 | m_TagString: Untagged 151 | m_Icon: {fileID: 0} 152 | m_NavMeshLayer: 0 153 | m_StaticEditorFlags: 0 154 | m_IsActive: 1 155 | --- !u!108 &274724979 156 | Light: 157 | m_ObjectHideFlags: 0 158 | m_PrefabParentObject: {fileID: 0} 159 | m_PrefabInternal: {fileID: 0} 160 | m_GameObject: {fileID: 274724978} 161 | m_Enabled: 1 162 | serializedVersion: 8 163 | m_Type: 1 164 | m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} 165 | m_Intensity: 1 166 | m_Range: 10 167 | m_SpotAngle: 30 168 | m_CookieSize: 10 169 | m_Shadows: 170 | m_Type: 2 171 | m_Resolution: -1 172 | m_CustomResolution: -1 173 | m_Strength: 1 174 | m_Bias: 0.05 175 | m_NormalBias: 0.4 176 | m_NearPlane: 0.2 177 | m_Cookie: {fileID: 0} 178 | m_DrawHalo: 0 179 | m_Flare: {fileID: 0} 180 | m_RenderMode: 0 181 | m_CullingMask: 182 | serializedVersion: 2 183 | m_Bits: 4294967295 184 | m_Lightmapping: 4 185 | m_AreaSize: {x: 1, y: 1} 186 | m_BounceIntensity: 1 187 | m_ColorTemperature: 6570 188 | m_UseColorTemperature: 0 189 | m_ShadowRadius: 0 190 | m_ShadowAngle: 0 191 | --- !u!4 &274724980 192 | Transform: 193 | m_ObjectHideFlags: 0 194 | m_PrefabParentObject: {fileID: 0} 195 | m_PrefabInternal: {fileID: 0} 196 | m_GameObject: {fileID: 274724978} 197 | m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} 198 | m_LocalPosition: {x: 0, y: 3, z: 0} 199 | m_LocalScale: {x: 1, y: 1, z: 1} 200 | m_Children: [] 201 | m_Father: {fileID: 0} 202 | m_RootOrder: 1 203 | m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} 204 | --- !u!1 &349279010 205 | GameObject: 206 | m_ObjectHideFlags: 0 207 | m_PrefabParentObject: {fileID: 0} 208 | m_PrefabInternal: {fileID: 0} 209 | serializedVersion: 5 210 | m_Component: 211 | - component: {fileID: 349279012} 212 | - component: {fileID: 349279011} 213 | m_Layer: 0 214 | m_Name: ConvexHull 215 | m_TagString: Untagged 216 | m_Icon: {fileID: 0} 217 | m_NavMeshLayer: 0 218 | m_StaticEditorFlags: 0 219 | m_IsActive: 1 220 | --- !u!114 &349279011 221 | MonoBehaviour: 222 | m_ObjectHideFlags: 0 223 | m_PrefabParentObject: {fileID: 0} 224 | m_PrefabInternal: {fileID: 0} 225 | m_GameObject: {fileID: 349279010} 226 | m_Enabled: 1 227 | m_EditorHideFlags: 0 228 | m_Script: {fileID: 11500000, guid: b3d9eb310d7df0442ad11b1caa91d8d6, type: 3} 229 | m_Name: 230 | m_EditorClassIdentifier: 231 | pointsArray: 232 | - {fileID: 136311636} 233 | - {fileID: 1158223492} 234 | - {fileID: 929177237} 235 | - {fileID: 791855316} 236 | - {fileID: 556633800} 237 | - {fileID: 1638033277} 238 | height: 4 239 | --- !u!4 &349279012 240 | Transform: 241 | m_ObjectHideFlags: 0 242 | m_PrefabParentObject: {fileID: 0} 243 | m_PrefabInternal: {fileID: 0} 244 | m_GameObject: {fileID: 349279010} 245 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 246 | m_LocalPosition: {x: -11.611096, y: -0.43170074, z: -9.546851} 247 | m_LocalScale: {x: 1, y: 1, z: 1} 248 | m_Children: 249 | - {fileID: 136311636} 250 | - {fileID: 1158223492} 251 | - {fileID: 929177237} 252 | - {fileID: 791855316} 253 | - {fileID: 556633800} 254 | - {fileID: 1638033277} 255 | m_Father: {fileID: 0} 256 | m_RootOrder: 3 257 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 258 | --- !u!1 &556633799 259 | GameObject: 260 | m_ObjectHideFlags: 0 261 | m_PrefabParentObject: {fileID: 0} 262 | m_PrefabInternal: {fileID: 0} 263 | serializedVersion: 5 264 | m_Component: 265 | - component: {fileID: 556633800} 266 | m_Layer: 0 267 | m_Name: p0 (4) 268 | m_TagString: Untagged 269 | m_Icon: {fileID: 0} 270 | m_NavMeshLayer: 0 271 | m_StaticEditorFlags: 0 272 | m_IsActive: 1 273 | --- !u!4 &556633800 274 | Transform: 275 | m_ObjectHideFlags: 0 276 | m_PrefabParentObject: {fileID: 0} 277 | m_PrefabInternal: {fileID: 0} 278 | m_GameObject: {fileID: 556633799} 279 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 280 | m_LocalPosition: {x: -2.72, y: 0, z: -0.13} 281 | m_LocalScale: {x: 1, y: 1, z: 1} 282 | m_Children: [] 283 | m_Father: {fileID: 349279012} 284 | m_RootOrder: 4 285 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 286 | --- !u!1 &782461703 287 | GameObject: 288 | m_ObjectHideFlags: 0 289 | m_PrefabParentObject: {fileID: 0} 290 | m_PrefabInternal: {fileID: 0} 291 | serializedVersion: 5 292 | m_Component: 293 | - component: {fileID: 782461706} 294 | - component: {fileID: 782461705} 295 | - component: {fileID: 782461704} 296 | m_Layer: 0 297 | m_Name: Main Camera 298 | m_TagString: MainCamera 299 | m_Icon: {fileID: 0} 300 | m_NavMeshLayer: 0 301 | m_StaticEditorFlags: 0 302 | m_IsActive: 1 303 | --- !u!81 &782461704 304 | AudioListener: 305 | m_ObjectHideFlags: 0 306 | m_PrefabParentObject: {fileID: 0} 307 | m_PrefabInternal: {fileID: 0} 308 | m_GameObject: {fileID: 782461703} 309 | m_Enabled: 1 310 | --- !u!20 &782461705 311 | Camera: 312 | m_ObjectHideFlags: 0 313 | m_PrefabParentObject: {fileID: 0} 314 | m_PrefabInternal: {fileID: 0} 315 | m_GameObject: {fileID: 782461703} 316 | m_Enabled: 1 317 | serializedVersion: 2 318 | m_ClearFlags: 1 319 | m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} 320 | m_NormalizedViewPortRect: 321 | serializedVersion: 2 322 | x: 0 323 | y: 0 324 | width: 1 325 | height: 1 326 | near clip plane: 0.3 327 | far clip plane: 1000 328 | field of view: 60 329 | orthographic: 0 330 | orthographic size: 5 331 | m_Depth: -1 332 | m_CullingMask: 333 | serializedVersion: 2 334 | m_Bits: 4294967295 335 | m_RenderingPath: -1 336 | m_TargetTexture: {fileID: 0} 337 | m_TargetDisplay: 0 338 | m_TargetEye: 3 339 | m_HDR: 1 340 | m_AllowMSAA: 1 341 | m_ForceIntoRT: 0 342 | m_OcclusionCulling: 1 343 | m_StereoConvergence: 10 344 | m_StereoSeparation: 0.022 345 | m_StereoMirrorMode: 0 346 | --- !u!4 &782461706 347 | Transform: 348 | m_ObjectHideFlags: 0 349 | m_PrefabParentObject: {fileID: 0} 350 | m_PrefabInternal: {fileID: 0} 351 | m_GameObject: {fileID: 782461703} 352 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 353 | m_LocalPosition: {x: 0, y: 1, z: -10} 354 | m_LocalScale: {x: 1, y: 1, z: 1} 355 | m_Children: [] 356 | m_Father: {fileID: 0} 357 | m_RootOrder: 0 358 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 359 | --- !u!1 &791855315 360 | GameObject: 361 | m_ObjectHideFlags: 0 362 | m_PrefabParentObject: {fileID: 0} 363 | m_PrefabInternal: {fileID: 0} 364 | serializedVersion: 5 365 | m_Component: 366 | - component: {fileID: 791855316} 367 | m_Layer: 0 368 | m_Name: p0 (3) 369 | m_TagString: Untagged 370 | m_Icon: {fileID: 0} 371 | m_NavMeshLayer: 0 372 | m_StaticEditorFlags: 0 373 | m_IsActive: 1 374 | --- !u!4 &791855316 375 | Transform: 376 | m_ObjectHideFlags: 0 377 | m_PrefabParentObject: {fileID: 0} 378 | m_PrefabInternal: {fileID: 0} 379 | m_GameObject: {fileID: 791855315} 380 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 381 | m_LocalPosition: {x: 0.85, y: 0, z: -2.29} 382 | m_LocalScale: {x: 1, y: 1, z: 1} 383 | m_Children: [] 384 | m_Father: {fileID: 349279012} 385 | m_RootOrder: 3 386 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 387 | --- !u!1 &929177236 388 | GameObject: 389 | m_ObjectHideFlags: 0 390 | m_PrefabParentObject: {fileID: 0} 391 | m_PrefabInternal: {fileID: 0} 392 | serializedVersion: 5 393 | m_Component: 394 | - component: {fileID: 929177237} 395 | m_Layer: 0 396 | m_Name: p0 (2) 397 | m_TagString: Untagged 398 | m_Icon: {fileID: 0} 399 | m_NavMeshLayer: 0 400 | m_StaticEditorFlags: 0 401 | m_IsActive: 1 402 | --- !u!4 &929177237 403 | Transform: 404 | m_ObjectHideFlags: 0 405 | m_PrefabParentObject: {fileID: 0} 406 | m_PrefabInternal: {fileID: 0} 407 | m_GameObject: {fileID: 929177236} 408 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 409 | m_LocalPosition: {x: 4.4, y: 0, z: 0.33} 410 | m_LocalScale: {x: 1, y: 1, z: 1} 411 | m_Children: [] 412 | m_Father: {fileID: 349279012} 413 | m_RootOrder: 2 414 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 415 | --- !u!1 &1153719259 416 | GameObject: 417 | m_ObjectHideFlags: 0 418 | m_PrefabParentObject: {fileID: 0} 419 | m_PrefabInternal: {fileID: 0} 420 | serializedVersion: 5 421 | m_Component: 422 | - component: {fileID: 1153719263} 423 | - component: {fileID: 1153719262} 424 | - component: {fileID: 1153719261} 425 | - component: {fileID: 1153719260} 426 | - component: {fileID: 1153719264} 427 | m_Layer: 0 428 | m_Name: Cube 429 | m_TagString: Untagged 430 | m_Icon: {fileID: 0} 431 | m_NavMeshLayer: 0 432 | m_StaticEditorFlags: 0 433 | m_IsActive: 1 434 | --- !u!65 &1153719260 435 | BoxCollider: 436 | m_ObjectHideFlags: 0 437 | m_PrefabParentObject: {fileID: 0} 438 | m_PrefabInternal: {fileID: 0} 439 | m_GameObject: {fileID: 1153719259} 440 | m_Material: {fileID: 0} 441 | m_IsTrigger: 0 442 | m_Enabled: 1 443 | serializedVersion: 2 444 | m_Size: {x: 1, y: 1, z: 1} 445 | m_Center: {x: 0, y: 0, z: 0} 446 | --- !u!23 &1153719261 447 | MeshRenderer: 448 | m_ObjectHideFlags: 0 449 | m_PrefabParentObject: {fileID: 0} 450 | m_PrefabInternal: {fileID: 0} 451 | m_GameObject: {fileID: 1153719259} 452 | m_Enabled: 1 453 | m_CastShadows: 1 454 | m_ReceiveShadows: 1 455 | m_MotionVectors: 1 456 | m_LightProbeUsage: 1 457 | m_ReflectionProbeUsage: 1 458 | m_Materials: 459 | - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} 460 | m_StaticBatchInfo: 461 | firstSubMesh: 0 462 | subMeshCount: 0 463 | m_StaticBatchRoot: {fileID: 0} 464 | m_ProbeAnchor: {fileID: 0} 465 | m_LightProbeVolumeOverride: {fileID: 0} 466 | m_ScaleInLightmap: 1 467 | m_PreserveUVs: 0 468 | m_IgnoreNormalsForChartDetection: 0 469 | m_ImportantGI: 0 470 | m_SelectedEditorRenderState: 3 471 | m_MinimumChartSize: 4 472 | m_AutoUVMaxDistance: 0.5 473 | m_AutoUVMaxAngle: 89 474 | m_LightmapParameters: {fileID: 0} 475 | m_SortingLayerID: 0 476 | m_SortingLayer: 0 477 | m_SortingOrder: 0 478 | --- !u!33 &1153719262 479 | MeshFilter: 480 | m_ObjectHideFlags: 0 481 | m_PrefabParentObject: {fileID: 0} 482 | m_PrefabInternal: {fileID: 0} 483 | m_GameObject: {fileID: 1153719259} 484 | m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} 485 | --- !u!4 &1153719263 486 | Transform: 487 | m_ObjectHideFlags: 0 488 | m_PrefabParentObject: {fileID: 0} 489 | m_PrefabInternal: {fileID: 0} 490 | m_GameObject: {fileID: 1153719259} 491 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 492 | m_LocalPosition: {x: -9.81, y: -2.259259, z: -10.5} 493 | m_LocalScale: {x: 1, y: 1, z: 1} 494 | m_Children: [] 495 | m_Father: {fileID: 0} 496 | m_RootOrder: 2 497 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 498 | --- !u!114 &1153719264 499 | MonoBehaviour: 500 | m_ObjectHideFlags: 0 501 | m_PrefabParentObject: {fileID: 0} 502 | m_PrefabInternal: {fileID: 0} 503 | m_GameObject: {fileID: 1153719259} 504 | m_Enabled: 1 505 | m_EditorHideFlags: 0 506 | m_Script: {fileID: 11500000, guid: 17f1c2e8bc75ed0419387a3ce7d27d15, type: 3} 507 | m_Name: 508 | m_EditorClassIdentifier: 509 | convexCull: {fileID: 349279011} 510 | --- !u!1 &1158223491 511 | GameObject: 512 | m_ObjectHideFlags: 0 513 | m_PrefabParentObject: {fileID: 0} 514 | m_PrefabInternal: {fileID: 0} 515 | serializedVersion: 5 516 | m_Component: 517 | - component: {fileID: 1158223492} 518 | m_Layer: 0 519 | m_Name: p0 (1) 520 | m_TagString: Untagged 521 | m_Icon: {fileID: 0} 522 | m_NavMeshLayer: 0 523 | m_StaticEditorFlags: 0 524 | m_IsActive: 1 525 | --- !u!4 &1158223492 526 | Transform: 527 | m_ObjectHideFlags: 0 528 | m_PrefabParentObject: {fileID: 0} 529 | m_PrefabInternal: {fileID: 0} 530 | m_GameObject: {fileID: 1158223491} 531 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 532 | m_LocalPosition: {x: 1.99, y: 0, z: 2.55} 533 | m_LocalScale: {x: 1, y: 1, z: 1} 534 | m_Children: [] 535 | m_Father: {fileID: 349279012} 536 | m_RootOrder: 1 537 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 538 | --- !u!1 &1638033276 539 | GameObject: 540 | m_ObjectHideFlags: 0 541 | m_PrefabParentObject: {fileID: 0} 542 | m_PrefabInternal: {fileID: 0} 543 | serializedVersion: 5 544 | m_Component: 545 | - component: {fileID: 1638033277} 546 | m_Layer: 0 547 | m_Name: p0 (5) 548 | m_TagString: Untagged 549 | m_Icon: {fileID: 0} 550 | m_NavMeshLayer: 0 551 | m_StaticEditorFlags: 0 552 | m_IsActive: 1 553 | --- !u!4 &1638033277 554 | Transform: 555 | m_ObjectHideFlags: 0 556 | m_PrefabParentObject: {fileID: 0} 557 | m_PrefabInternal: {fileID: 0} 558 | m_GameObject: {fileID: 1638033276} 559 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 560 | m_LocalPosition: {x: 0, y: 0, z: 0} 561 | m_LocalScale: {x: 1, y: 1, z: 1} 562 | m_Children: [] 563 | m_Father: {fileID: 349279012} 564 | m_RootOrder: 5 565 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 566 | -------------------------------------------------------------------------------- /ConvexHull/TestScene.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4c32d938a00d58b4bae162aaede1c998 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hont127/Unity3D-ConvexHull/bff5ed8cef2fab324510bf8e6e0924999ed81cd0/Preview.gif -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Unity3D-ConvexHull 2 | Easy Unity3d ConvexHull range detecter 3 | 一个简单的unity凸/凹包范围检测器,可以用作场景事件碰撞等 4 | 5 | ```C# 6 | if (convexHull.IsInRange(transform.position)) //do something.. 7 | ``` 8 | 9 | ![](https://github.com/hont127/Unity3D-ConvexCull/blob/master/Preview.gif) 10 | --------------------------------------------------------------------------------