├── .gitignore ├── Assets ├── Materials.meta ├── Materials │ ├── BlueStripeMat.mat │ ├── BlueStripeMat.mat.meta │ ├── RedStripeMat.mat │ ├── RedStripeMat.mat.meta │ ├── TestTexMat.mat │ ├── TestTexMat.mat.meta │ ├── Textures.meta │ ├── Textures │ │ ├── BlueStripe.png │ │ ├── BlueStripe.png.meta │ │ ├── ColorTex.png │ │ ├── ColorTex.png.meta │ │ ├── RedStripe.png │ │ ├── RedStripe.png.meta │ │ ├── YellowStripe.png │ │ └── YellowStripe.png.meta │ ├── YellowStripeMat.mat │ └── YellowStripeMat.mat.meta ├── Resources.meta ├── Resources │ ├── Prefabs.meta │ └── Prefabs │ │ ├── Box.prefab │ │ ├── Box.prefab.meta │ │ ├── Capsule.prefab │ │ ├── Capsule.prefab.meta │ │ ├── Cylinder.prefab │ │ ├── Cylinder.prefab.meta │ │ ├── Grid.prefab │ │ ├── Grid.prefab.meta │ │ ├── Polygon.prefab │ │ ├── Polygon.prefab.meta │ │ ├── Polyhedron.prefab │ │ ├── Polyhedron.prefab.meta │ │ ├── Sphere.prefab │ │ ├── Sphere.prefab.meta │ │ ├── Torus.prefab │ │ └── Torus.prefab.meta ├── Scenes.meta ├── Scenes │ ├── SampleScene.unity │ └── SampleScene.unity.meta ├── Scripts.meta └── Scripts │ ├── 2D.meta │ ├── 2D │ ├── Polygon.cs │ ├── Polygon.cs.meta │ ├── PolygonBuilder.cs │ └── PolygonBuilder.cs.meta │ ├── 3D.meta │ ├── 3D │ ├── Box.meta │ ├── Box │ │ ├── Box.cs │ │ ├── Box.cs.meta │ │ ├── BoxBuilder.cs │ │ └── BoxBuilder.cs.meta │ ├── Capsule.meta │ ├── Capsule │ │ ├── Capsule.cs │ │ ├── Capsule.cs.meta │ │ ├── CapsuleBuilder.cs │ │ └── CapsuleBuilder.cs.meta │ ├── Cylinder.meta │ ├── Cylinder │ │ ├── Cylinder.cs │ │ ├── Cylinder.cs.meta │ │ ├── CylinderBuilder.cs │ │ └── CylinderBuilder.cs.meta │ ├── Datas.meta │ ├── Datas │ │ ├── MeshData.cs │ │ ├── MeshData.cs.meta │ │ ├── SolidType.cs │ │ ├── SolidType.cs.meta │ │ ├── TriangleFace.cs │ │ └── TriangleFace.cs.meta │ ├── Grid.meta │ ├── Grid │ │ ├── Grid.cs │ │ ├── Grid.cs.meta │ │ ├── GridBuilder.cs │ │ └── GridBuilder.cs.meta │ ├── Polyhedron.meta │ ├── Polyhedron │ │ ├── Platonics.meta │ │ ├── Platonics │ │ │ ├── Dodecahedron.cs │ │ │ ├── Dodecahedron.cs.meta │ │ │ ├── IPlatonicSolid.cs │ │ │ ├── IPlatonicSolid.cs.meta │ │ │ ├── Icosahedron.cs │ │ │ ├── Icosahedron.cs.meta │ │ │ ├── Octahedron.cs │ │ │ ├── Octahedron.cs.meta │ │ │ ├── Tetrahedron.cs │ │ │ └── Tetrahedron.cs.meta │ │ ├── Polyhedron.cs │ │ ├── Polyhedron.cs.meta │ │ ├── PolyhedronBuilder.cs │ │ └── PolyhedronBuilder.cs.meta │ ├── Sphere.meta │ ├── Sphere │ │ ├── Sphere.cs │ │ ├── Sphere.cs.meta │ │ ├── SphereBuilder.cs │ │ └── SphereBuilder.cs.meta │ ├── Torus.meta │ ├── Torus │ │ ├── Torus.cs │ │ ├── Torus.cs.meta │ │ ├── TorusBuilder.cs │ │ └── TorusBuilder.cs.meta │ ├── Utilities.meta │ └── Utilities │ │ ├── UvModifier.cs │ │ └── UvModifier.cs.meta │ ├── PrimitiveBase.cs │ ├── PrimitiveBase.cs.meta │ ├── PrimitiveCommon.cs │ ├── PrimitiveCommon.cs.meta │ ├── PrimitiveManager.cs │ └── PrimitiveManager.cs.meta ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # This .gitignore file should be placed at the root of your Unity project directory 2 | # 3 | # Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore 4 | # 5 | /[Ll]ibrary/ 6 | /[Tt]emp/ 7 | /[Oo]bj/ 8 | /[Bb]uild/ 9 | /[Bb]uilds/ 10 | /[Ll]ogs/ 11 | /[Mm]emoryCaptures/ 12 | 13 | # Asset meta data should only be ignored when the corresponding asset is also ignored 14 | !/[Aa]ssets/**/*.meta 15 | 16 | # Uncomment this line if you wish to ignore the asset store tools plugin 17 | # /[Aa]ssets/AssetStoreTools* 18 | 19 | # Autogenerated Jetbrains Rider plugin 20 | [Aa]ssets/Plugins/Editor/JetBrains* 21 | 22 | # Visual Studio cache directory 23 | .vs/ 24 | 25 | # Gradle cache directory 26 | .gradle/ 27 | 28 | # Autogenerated VS/MD/Consulo solution and project files 29 | ExportedObj/ 30 | .consulo/ 31 | *.csproj 32 | *.unityproj 33 | *.sln 34 | *.suo 35 | *.tmp 36 | *.user 37 | *.userprefs 38 | *.pidb 39 | *.booproj 40 | *.svd 41 | *.pdb 42 | *.mdb 43 | *.opendb 44 | *.VC.db 45 | 46 | # Unity3D generated meta files 47 | *.pidb.meta 48 | *.pdb.meta 49 | *.mdb.meta 50 | 51 | # Unity3D generated file on crash reports 52 | sysinfo.txt 53 | 54 | # Builds 55 | *.apk 56 | *.unitypackage 57 | 58 | # Crashlytics generated file 59 | crashlytics-build.properties 60 | 61 | .vscode/ 62 | UserSettings/ 63 | ProjectSettings/ 64 | Packages/ 65 | Logs/ 66 | 67 | .DS_Store 68 | 69 | Assets/Fantasy\ Skybox\ FREE/ 70 | Assets/Fantasy\ Skybox\ FREE.meta 71 | 72 | Assets/Scenes/PlayGround.unity 73 | Assets/Scenes/PlayGround.unity.meta -------------------------------------------------------------------------------- /Assets/Materials.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 38f172a24df354524a80309fd94c23fb 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Materials/BlueStripeMat.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 6 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: BlueStripeMat 11 | m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} 12 | m_ShaderKeywords: _EMISSION 13 | m_LightmapFlags: 0 14 | m_EnableInstancingVariants: 0 15 | m_DoubleSidedGI: 0 16 | m_CustomRenderQueue: -1 17 | stringTagMap: {} 18 | disabledShaderPasses: [] 19 | m_SavedProperties: 20 | serializedVersion: 3 21 | m_TexEnvs: 22 | - _BumpMap: 23 | m_Texture: {fileID: 0} 24 | m_Scale: {x: 1, y: 1} 25 | m_Offset: {x: 0, y: 0} 26 | - _DetailAlbedoMap: 27 | m_Texture: {fileID: 0} 28 | m_Scale: {x: 1, y: 1} 29 | m_Offset: {x: 0, y: 0} 30 | - _DetailMask: 31 | m_Texture: {fileID: 0} 32 | m_Scale: {x: 1, y: 1} 33 | m_Offset: {x: 0, y: 0} 34 | - _DetailNormalMap: 35 | m_Texture: {fileID: 0} 36 | m_Scale: {x: 1, y: 1} 37 | m_Offset: {x: 0, y: 0} 38 | - _EmissionMap: 39 | m_Texture: {fileID: 0} 40 | m_Scale: {x: 1, y: 1} 41 | m_Offset: {x: 0, y: 0} 42 | - _MainTex: 43 | m_Texture: {fileID: 2800000, guid: fee0d0f89d7504435939d2843dc00cf7, type: 3} 44 | m_Scale: {x: 1, y: 1} 45 | m_Offset: {x: 0, y: 0} 46 | - _MetallicGlossMap: 47 | m_Texture: {fileID: 0} 48 | m_Scale: {x: 1, y: 1} 49 | m_Offset: {x: 0, y: 0} 50 | - _OcclusionMap: 51 | m_Texture: {fileID: 0} 52 | m_Scale: {x: 1, y: 1} 53 | m_Offset: {x: 0, y: 0} 54 | - _ParallaxMap: 55 | m_Texture: {fileID: 0} 56 | m_Scale: {x: 1, y: 1} 57 | m_Offset: {x: 0, y: 0} 58 | m_Floats: 59 | - _BlendOp: 0 60 | - _BumpScale: 1 61 | - _CameraFadingEnabled: 0 62 | - _CameraFarFadeDistance: 2 63 | - _CameraNearFadeDistance: 1 64 | - _ColorMode: 0 65 | - _Cull: 2 66 | - _Cutoff: 0.5 67 | - _DetailNormalMapScale: 1 68 | - _DistortionBlend: 0.5 69 | - _DistortionEnabled: 0 70 | - _DistortionStrength: 1 71 | - _DistortionStrengthScaled: 0 72 | - _DstBlend: 0 73 | - _EmissionEnabled: 0 74 | - _FlipbookMode: 0 75 | - _GlossMapScale: 1 76 | - _Glossiness: 0.5 77 | - _GlossyReflections: 1 78 | - _LightingEnabled: 0 79 | - _Metallic: 0 80 | - _Mode: 0 81 | - _OcclusionStrength: 1 82 | - _Parallax: 0.02 83 | - _SmoothnessTextureChannel: 0 84 | - _SoftParticlesEnabled: 0 85 | - _SoftParticlesFarFadeDistance: 1 86 | - _SoftParticlesNearFadeDistance: 0 87 | - _SpecularHighlights: 1 88 | - _SrcBlend: 1 89 | - _UVSec: 0 90 | - _ZWrite: 1 91 | m_Colors: 92 | - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0} 93 | - _Color: {r: 1, g: 1, b: 1, a: 1} 94 | - _ColorAddSubDiff: {r: 0, g: 0, b: 0, a: 0} 95 | - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} 96 | - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} 97 | m_BuildTextureStacks: [] 98 | -------------------------------------------------------------------------------- /Assets/Materials/BlueStripeMat.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 38617acc607854180bc788f670fb2176 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Materials/RedStripeMat.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 6 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: RedStripeMat 11 | m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} 12 | m_ShaderKeywords: _EMISSION 13 | m_LightmapFlags: 0 14 | m_EnableInstancingVariants: 0 15 | m_DoubleSidedGI: 0 16 | m_CustomRenderQueue: -1 17 | stringTagMap: {} 18 | disabledShaderPasses: [] 19 | m_SavedProperties: 20 | serializedVersion: 3 21 | m_TexEnvs: 22 | - _BumpMap: 23 | m_Texture: {fileID: 0} 24 | m_Scale: {x: 1, y: 1} 25 | m_Offset: {x: 0, y: 0} 26 | - _DetailAlbedoMap: 27 | m_Texture: {fileID: 0} 28 | m_Scale: {x: 1, y: 1} 29 | m_Offset: {x: 0, y: 0} 30 | - _DetailMask: 31 | m_Texture: {fileID: 0} 32 | m_Scale: {x: 1, y: 1} 33 | m_Offset: {x: 0, y: 0} 34 | - _DetailNormalMap: 35 | m_Texture: {fileID: 0} 36 | m_Scale: {x: 1, y: 1} 37 | m_Offset: {x: 0, y: 0} 38 | - _EmissionMap: 39 | m_Texture: {fileID: 0} 40 | m_Scale: {x: 1, y: 1} 41 | m_Offset: {x: 0, y: 0} 42 | - _MainTex: 43 | m_Texture: {fileID: 2800000, guid: f38c00e5c57a444b0961f5e3994f8d16, type: 3} 44 | m_Scale: {x: 1, y: 1} 45 | m_Offset: {x: 0, y: 0} 46 | - _MetallicGlossMap: 47 | m_Texture: {fileID: 0} 48 | m_Scale: {x: 1, y: 1} 49 | m_Offset: {x: 0, y: 0} 50 | - _OcclusionMap: 51 | m_Texture: {fileID: 0} 52 | m_Scale: {x: 1, y: 1} 53 | m_Offset: {x: 0, y: 0} 54 | - _ParallaxMap: 55 | m_Texture: {fileID: 0} 56 | m_Scale: {x: 1, y: 1} 57 | m_Offset: {x: 0, y: 0} 58 | m_Floats: 59 | - _BlendOp: 0 60 | - _BumpScale: 1 61 | - _CameraFadingEnabled: 0 62 | - _CameraFarFadeDistance: 2 63 | - _CameraNearFadeDistance: 1 64 | - _ColorMode: 0 65 | - _Cull: 2 66 | - _Cutoff: 0.5 67 | - _DetailNormalMapScale: 1 68 | - _DistortionBlend: 0.5 69 | - _DistortionEnabled: 0 70 | - _DistortionStrength: 1 71 | - _DistortionStrengthScaled: 0 72 | - _DstBlend: 0 73 | - _EmissionEnabled: 0 74 | - _FlipbookMode: 0 75 | - _GlossMapScale: 1 76 | - _Glossiness: 0.5 77 | - _GlossyReflections: 1 78 | - _LightingEnabled: 0 79 | - _Metallic: 0 80 | - _Mode: 0 81 | - _OcclusionStrength: 1 82 | - _Parallax: 0.02 83 | - _SmoothnessTextureChannel: 0 84 | - _SoftParticlesEnabled: 0 85 | - _SoftParticlesFarFadeDistance: 1 86 | - _SoftParticlesNearFadeDistance: 0 87 | - _SpecularHighlights: 1 88 | - _SrcBlend: 1 89 | - _UVSec: 0 90 | - _ZWrite: 1 91 | m_Colors: 92 | - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0} 93 | - _Color: {r: 1, g: 1, b: 1, a: 1} 94 | - _ColorAddSubDiff: {r: 0, g: 0, b: 0, a: 0} 95 | - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} 96 | - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} 97 | m_BuildTextureStacks: [] 98 | -------------------------------------------------------------------------------- /Assets/Materials/RedStripeMat.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 55413634fc741478c973caf5556c8e63 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Materials/TestTexMat.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 6 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: TestTexMat 11 | m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} 12 | m_ShaderKeywords: 13 | m_LightmapFlags: 4 14 | m_EnableInstancingVariants: 0 15 | m_DoubleSidedGI: 0 16 | m_CustomRenderQueue: -1 17 | stringTagMap: {} 18 | disabledShaderPasses: [] 19 | m_SavedProperties: 20 | serializedVersion: 3 21 | m_TexEnvs: 22 | - _BumpMap: 23 | m_Texture: {fileID: 0} 24 | m_Scale: {x: 1, y: 1} 25 | m_Offset: {x: 0, y: 0} 26 | - _DetailAlbedoMap: 27 | m_Texture: {fileID: 0} 28 | m_Scale: {x: 1, y: 1} 29 | m_Offset: {x: 0, y: 0} 30 | - _DetailMask: 31 | m_Texture: {fileID: 0} 32 | m_Scale: {x: 1, y: 1} 33 | m_Offset: {x: 0, y: 0} 34 | - _DetailNormalMap: 35 | m_Texture: {fileID: 0} 36 | m_Scale: {x: 1, y: 1} 37 | m_Offset: {x: 0, y: 0} 38 | - _EmissionMap: 39 | m_Texture: {fileID: 0} 40 | m_Scale: {x: 1, y: 1} 41 | m_Offset: {x: 0, y: 0} 42 | - _MainTex: 43 | m_Texture: {fileID: 2800000, guid: 1531f99fd8b6b46b8a00837ae4e3d7a7, type: 3} 44 | m_Scale: {x: 1, y: 1} 45 | m_Offset: {x: 0, y: 0} 46 | - _MetallicGlossMap: 47 | m_Texture: {fileID: 0} 48 | m_Scale: {x: 1, y: 1} 49 | m_Offset: {x: 0, y: 0} 50 | - _OcclusionMap: 51 | m_Texture: {fileID: 0} 52 | m_Scale: {x: 1, y: 1} 53 | m_Offset: {x: 0, y: 0} 54 | - _ParallaxMap: 55 | m_Texture: {fileID: 0} 56 | m_Scale: {x: 1, y: 1} 57 | m_Offset: {x: 0, y: 0} 58 | m_Floats: 59 | - _BumpScale: 1 60 | - _Cutoff: 0.5 61 | - _DetailNormalMapScale: 1 62 | - _DstBlend: 0 63 | - _GlossMapScale: 1 64 | - _Glossiness: 0.5 65 | - _GlossyReflections: 1 66 | - _Metallic: 0 67 | - _Mode: 0 68 | - _OcclusionStrength: 1 69 | - _Parallax: 0.02 70 | - _SmoothnessTextureChannel: 0 71 | - _SpecularHighlights: 1 72 | - _SrcBlend: 1 73 | - _UVSec: 0 74 | - _ZWrite: 1 75 | m_Colors: 76 | - _Color: {r: 1, g: 1, b: 1, a: 1} 77 | - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} 78 | m_BuildTextureStacks: [] 79 | -------------------------------------------------------------------------------- /Assets/Materials/TestTexMat.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 34d378e0ce91949eba29b06e76ad5e3a 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Materials/Textures.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5ab7af0850a52480294146cb3a418217 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Materials/Textures/BlueStripe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogrew/Unity-ProceduralPrimitives/17e2e04c061e627e13b839fddce2b81b53976163/Assets/Materials/Textures/BlueStripe.png -------------------------------------------------------------------------------- /Assets/Materials/Textures/BlueStripe.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fee0d0f89d7504435939d2843dc00cf7 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | vTOnly: 0 27 | grayScaleToAlpha: 0 28 | generateCubemap: 6 29 | cubemapConvolution: 0 30 | seamlessCubemap: 0 31 | textureFormat: 1 32 | maxTextureSize: 2048 33 | textureSettings: 34 | serializedVersion: 2 35 | filterMode: 1 36 | aniso: 1 37 | mipBias: 0 38 | wrapU: 0 39 | wrapV: 0 40 | wrapW: 0 41 | nPOTScale: 1 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 0 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 0 54 | spriteTessellationDetail: -1 55 | textureType: 0 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | flipbookRows: 1 59 | flipbookColumns: 1 60 | maxTextureSizeSet: 0 61 | compressionQualitySet: 0 62 | textureFormatSet: 0 63 | ignorePngGamma: 0 64 | applyGammaDecoding: 0 65 | platformSettings: 66 | - serializedVersion: 3 67 | buildTarget: DefaultTexturePlatform 68 | maxTextureSize: 2048 69 | resizeAlgorithm: 0 70 | textureFormat: -1 71 | textureCompression: 1 72 | compressionQuality: 50 73 | crunchedCompression: 0 74 | allowsAlphaSplitting: 0 75 | overridden: 0 76 | androidETC2FallbackOverride: 0 77 | forceMaximumCompressionQuality_BC6H_BC7: 0 78 | spriteSheet: 79 | serializedVersion: 2 80 | sprites: [] 81 | outline: [] 82 | physicsShape: [] 83 | bones: [] 84 | spriteID: 85 | internalID: 0 86 | vertices: [] 87 | indices: 88 | edges: [] 89 | weights: [] 90 | secondaryTextures: [] 91 | spritePackingTag: 92 | pSDRemoveMatte: 0 93 | pSDShowRemoveMatteOption: 0 94 | userData: 95 | assetBundleName: 96 | assetBundleVariant: 97 | -------------------------------------------------------------------------------- /Assets/Materials/Textures/ColorTex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogrew/Unity-ProceduralPrimitives/17e2e04c061e627e13b839fddce2b81b53976163/Assets/Materials/Textures/ColorTex.png -------------------------------------------------------------------------------- /Assets/Materials/Textures/ColorTex.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1531f99fd8b6b46b8a00837ae4e3d7a7 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | vTOnly: 0 27 | grayScaleToAlpha: 0 28 | generateCubemap: 6 29 | cubemapConvolution: 0 30 | seamlessCubemap: 0 31 | textureFormat: 1 32 | maxTextureSize: 2048 33 | textureSettings: 34 | serializedVersion: 2 35 | filterMode: 1 36 | aniso: 1 37 | mipBias: 0 38 | wrapU: 0 39 | wrapV: 0 40 | wrapW: 0 41 | nPOTScale: 1 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 0 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 0 54 | spriteTessellationDetail: -1 55 | textureType: 0 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | flipbookRows: 1 59 | flipbookColumns: 1 60 | maxTextureSizeSet: 0 61 | compressionQualitySet: 0 62 | textureFormatSet: 0 63 | ignorePngGamma: 0 64 | applyGammaDecoding: 0 65 | platformSettings: 66 | - serializedVersion: 3 67 | buildTarget: DefaultTexturePlatform 68 | maxTextureSize: 1024 69 | resizeAlgorithm: 0 70 | textureFormat: -1 71 | textureCompression: 1 72 | compressionQuality: 50 73 | crunchedCompression: 0 74 | allowsAlphaSplitting: 0 75 | overridden: 0 76 | androidETC2FallbackOverride: 0 77 | forceMaximumCompressionQuality_BC6H_BC7: 0 78 | - serializedVersion: 3 79 | buildTarget: Standalone 80 | maxTextureSize: 1024 81 | resizeAlgorithm: 0 82 | textureFormat: -1 83 | textureCompression: 1 84 | compressionQuality: 50 85 | crunchedCompression: 0 86 | allowsAlphaSplitting: 0 87 | overridden: 0 88 | androidETC2FallbackOverride: 0 89 | forceMaximumCompressionQuality_BC6H_BC7: 0 90 | - serializedVersion: 3 91 | buildTarget: iPhone 92 | maxTextureSize: 1024 93 | resizeAlgorithm: 0 94 | textureFormat: -1 95 | textureCompression: 1 96 | compressionQuality: 50 97 | crunchedCompression: 0 98 | allowsAlphaSplitting: 0 99 | overridden: 0 100 | androidETC2FallbackOverride: 0 101 | forceMaximumCompressionQuality_BC6H_BC7: 0 102 | - serializedVersion: 3 103 | buildTarget: Android 104 | maxTextureSize: 1024 105 | resizeAlgorithm: 0 106 | textureFormat: -1 107 | textureCompression: 1 108 | compressionQuality: 50 109 | crunchedCompression: 0 110 | allowsAlphaSplitting: 0 111 | overridden: 0 112 | androidETC2FallbackOverride: 0 113 | forceMaximumCompressionQuality_BC6H_BC7: 0 114 | spriteSheet: 115 | serializedVersion: 2 116 | sprites: [] 117 | outline: [] 118 | physicsShape: [] 119 | bones: [] 120 | spriteID: 121 | internalID: 0 122 | vertices: [] 123 | indices: 124 | edges: [] 125 | weights: [] 126 | secondaryTextures: [] 127 | spritePackingTag: 128 | pSDRemoveMatte: 0 129 | pSDShowRemoveMatteOption: 0 130 | userData: 131 | assetBundleName: 132 | assetBundleVariant: 133 | -------------------------------------------------------------------------------- /Assets/Materials/Textures/RedStripe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogrew/Unity-ProceduralPrimitives/17e2e04c061e627e13b839fddce2b81b53976163/Assets/Materials/Textures/RedStripe.png -------------------------------------------------------------------------------- /Assets/Materials/Textures/RedStripe.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f38c00e5c57a444b0961f5e3994f8d16 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | vTOnly: 0 27 | grayScaleToAlpha: 0 28 | generateCubemap: 6 29 | cubemapConvolution: 0 30 | seamlessCubemap: 0 31 | textureFormat: 1 32 | maxTextureSize: 2048 33 | textureSettings: 34 | serializedVersion: 2 35 | filterMode: 1 36 | aniso: 1 37 | mipBias: 0 38 | wrapU: 0 39 | wrapV: 0 40 | wrapW: 0 41 | nPOTScale: 1 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 0 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 0 54 | spriteTessellationDetail: -1 55 | textureType: 0 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | flipbookRows: 1 59 | flipbookColumns: 1 60 | maxTextureSizeSet: 0 61 | compressionQualitySet: 0 62 | textureFormatSet: 0 63 | ignorePngGamma: 0 64 | applyGammaDecoding: 0 65 | platformSettings: 66 | - serializedVersion: 3 67 | buildTarget: DefaultTexturePlatform 68 | maxTextureSize: 2048 69 | resizeAlgorithm: 0 70 | textureFormat: -1 71 | textureCompression: 1 72 | compressionQuality: 50 73 | crunchedCompression: 0 74 | allowsAlphaSplitting: 0 75 | overridden: 0 76 | androidETC2FallbackOverride: 0 77 | forceMaximumCompressionQuality_BC6H_BC7: 0 78 | spriteSheet: 79 | serializedVersion: 2 80 | sprites: [] 81 | outline: [] 82 | physicsShape: [] 83 | bones: [] 84 | spriteID: 85 | internalID: 0 86 | vertices: [] 87 | indices: 88 | edges: [] 89 | weights: [] 90 | secondaryTextures: [] 91 | spritePackingTag: 92 | pSDRemoveMatte: 0 93 | pSDShowRemoveMatteOption: 0 94 | userData: 95 | assetBundleName: 96 | assetBundleVariant: 97 | -------------------------------------------------------------------------------- /Assets/Materials/Textures/YellowStripe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ogrew/Unity-ProceduralPrimitives/17e2e04c061e627e13b839fddce2b81b53976163/Assets/Materials/Textures/YellowStripe.png -------------------------------------------------------------------------------- /Assets/Materials/Textures/YellowStripe.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 539307fea372c47bdbe0c141e92a4eef 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | vTOnly: 0 27 | grayScaleToAlpha: 0 28 | generateCubemap: 6 29 | cubemapConvolution: 0 30 | seamlessCubemap: 0 31 | textureFormat: 1 32 | maxTextureSize: 2048 33 | textureSettings: 34 | serializedVersion: 2 35 | filterMode: 1 36 | aniso: 1 37 | mipBias: 0 38 | wrapU: 0 39 | wrapV: 0 40 | wrapW: 0 41 | nPOTScale: 1 42 | lightmap: 0 43 | compressionQuality: 50 44 | spriteMode: 0 45 | spriteExtrude: 1 46 | spriteMeshType: 1 47 | alignment: 0 48 | spritePivot: {x: 0.5, y: 0.5} 49 | spritePixelsToUnits: 100 50 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 51 | spriteGenerateFallbackPhysicsShape: 1 52 | alphaUsage: 1 53 | alphaIsTransparency: 0 54 | spriteTessellationDetail: -1 55 | textureType: 0 56 | textureShape: 1 57 | singleChannelComponent: 0 58 | flipbookRows: 1 59 | flipbookColumns: 1 60 | maxTextureSizeSet: 0 61 | compressionQualitySet: 0 62 | textureFormatSet: 0 63 | ignorePngGamma: 0 64 | applyGammaDecoding: 0 65 | platformSettings: 66 | - serializedVersion: 3 67 | buildTarget: DefaultTexturePlatform 68 | maxTextureSize: 2048 69 | resizeAlgorithm: 0 70 | textureFormat: -1 71 | textureCompression: 1 72 | compressionQuality: 50 73 | crunchedCompression: 0 74 | allowsAlphaSplitting: 0 75 | overridden: 0 76 | androidETC2FallbackOverride: 0 77 | forceMaximumCompressionQuality_BC6H_BC7: 0 78 | spriteSheet: 79 | serializedVersion: 2 80 | sprites: [] 81 | outline: [] 82 | physicsShape: [] 83 | bones: [] 84 | spriteID: 85 | internalID: 0 86 | vertices: [] 87 | indices: 88 | edges: [] 89 | weights: [] 90 | secondaryTextures: [] 91 | spritePackingTag: 92 | pSDRemoveMatte: 0 93 | pSDShowRemoveMatteOption: 0 94 | userData: 95 | assetBundleName: 96 | assetBundleVariant: 97 | -------------------------------------------------------------------------------- /Assets/Materials/YellowStripeMat.mat: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!21 &2100000 4 | Material: 5 | serializedVersion: 6 6 | m_ObjectHideFlags: 0 7 | m_CorrespondingSourceObject: {fileID: 0} 8 | m_PrefabInstance: {fileID: 0} 9 | m_PrefabAsset: {fileID: 0} 10 | m_Name: YellowStripeMat 11 | m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} 12 | m_ShaderKeywords: _EMISSION 13 | m_LightmapFlags: 0 14 | m_EnableInstancingVariants: 0 15 | m_DoubleSidedGI: 0 16 | m_CustomRenderQueue: -1 17 | stringTagMap: {} 18 | disabledShaderPasses: [] 19 | m_SavedProperties: 20 | serializedVersion: 3 21 | m_TexEnvs: 22 | - _BumpMap: 23 | m_Texture: {fileID: 0} 24 | m_Scale: {x: 1, y: 1} 25 | m_Offset: {x: 0, y: 0} 26 | - _DetailAlbedoMap: 27 | m_Texture: {fileID: 0} 28 | m_Scale: {x: 1, y: 1} 29 | m_Offset: {x: 0, y: 0} 30 | - _DetailMask: 31 | m_Texture: {fileID: 0} 32 | m_Scale: {x: 1, y: 1} 33 | m_Offset: {x: 0, y: 0} 34 | - _DetailNormalMap: 35 | m_Texture: {fileID: 0} 36 | m_Scale: {x: 1, y: 1} 37 | m_Offset: {x: 0, y: 0} 38 | - _EmissionMap: 39 | m_Texture: {fileID: 0} 40 | m_Scale: {x: 1, y: 1} 41 | m_Offset: {x: 0, y: 0} 42 | - _MainTex: 43 | m_Texture: {fileID: 2800000, guid: 539307fea372c47bdbe0c141e92a4eef, type: 3} 44 | m_Scale: {x: 1, y: 1} 45 | m_Offset: {x: 0, y: 0} 46 | - _MetallicGlossMap: 47 | m_Texture: {fileID: 0} 48 | m_Scale: {x: 1, y: 1} 49 | m_Offset: {x: 0, y: 0} 50 | - _OcclusionMap: 51 | m_Texture: {fileID: 0} 52 | m_Scale: {x: 1, y: 1} 53 | m_Offset: {x: 0, y: 0} 54 | - _ParallaxMap: 55 | m_Texture: {fileID: 0} 56 | m_Scale: {x: 1, y: 1} 57 | m_Offset: {x: 0, y: 0} 58 | m_Floats: 59 | - _BlendOp: 0 60 | - _BumpScale: 1 61 | - _CameraFadingEnabled: 0 62 | - _CameraFarFadeDistance: 2 63 | - _CameraNearFadeDistance: 1 64 | - _ColorMode: 0 65 | - _Cull: 2 66 | - _Cutoff: 0.5 67 | - _DetailNormalMapScale: 1 68 | - _DistortionBlend: 0.5 69 | - _DistortionEnabled: 0 70 | - _DistortionStrength: 1 71 | - _DistortionStrengthScaled: 0 72 | - _DstBlend: 0 73 | - _EmissionEnabled: 0 74 | - _FlipbookMode: 0 75 | - _GlossMapScale: 1 76 | - _Glossiness: 0.5 77 | - _GlossyReflections: 1 78 | - _LightingEnabled: 0 79 | - _Metallic: 0 80 | - _Mode: 0 81 | - _OcclusionStrength: 1 82 | - _Parallax: 0.02 83 | - _SmoothnessTextureChannel: 0 84 | - _SoftParticlesEnabled: 0 85 | - _SoftParticlesFarFadeDistance: 1 86 | - _SoftParticlesNearFadeDistance: 0 87 | - _SpecularHighlights: 1 88 | - _SrcBlend: 1 89 | - _UVSec: 0 90 | - _ZWrite: 1 91 | m_Colors: 92 | - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0} 93 | - _Color: {r: 1, g: 1, b: 1, a: 1} 94 | - _ColorAddSubDiff: {r: 0, g: 0, b: 0, a: 0} 95 | - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} 96 | - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} 97 | m_BuildTextureStacks: [] 98 | -------------------------------------------------------------------------------- /Assets/Materials/YellowStripeMat.mat.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3f08bf94c216642afbc7e356c9647450 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 2100000 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Resources.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9281e445577d34c6781d04b3b93b968b 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8e60f75f04fac4631a2503ea2363bb3c 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Box.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &8331174169484721037 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 8331174169484721073} 12 | - component: {fileID: 8331174169484721072} 13 | - component: {fileID: 8331174169484721075} 14 | - component: {fileID: 8331174169484721074} 15 | m_Layer: 0 16 | m_Name: Box 17 | m_TagString: Untagged 18 | m_Icon: {fileID: 0} 19 | m_NavMeshLayer: 0 20 | m_StaticEditorFlags: 0 21 | m_IsActive: 1 22 | --- !u!4 &8331174169484721073 23 | Transform: 24 | m_ObjectHideFlags: 0 25 | m_CorrespondingSourceObject: {fileID: 0} 26 | m_PrefabInstance: {fileID: 0} 27 | m_PrefabAsset: {fileID: 0} 28 | m_GameObject: {fileID: 8331174169484721037} 29 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 30 | m_LocalPosition: {x: 0, y: 0, z: 0} 31 | m_LocalScale: {x: 1, y: 1, z: 1} 32 | m_Children: [] 33 | m_Father: {fileID: 0} 34 | m_RootOrder: 0 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | --- !u!33 &8331174169484721072 37 | MeshFilter: 38 | m_ObjectHideFlags: 0 39 | m_CorrespondingSourceObject: {fileID: 0} 40 | m_PrefabInstance: {fileID: 0} 41 | m_PrefabAsset: {fileID: 0} 42 | m_GameObject: {fileID: 8331174169484721037} 43 | m_Mesh: {fileID: 0} 44 | --- !u!23 &8331174169484721075 45 | MeshRenderer: 46 | m_ObjectHideFlags: 0 47 | m_CorrespondingSourceObject: {fileID: 0} 48 | m_PrefabInstance: {fileID: 0} 49 | m_PrefabAsset: {fileID: 0} 50 | m_GameObject: {fileID: 8331174169484721037} 51 | m_Enabled: 1 52 | m_CastShadows: 1 53 | m_ReceiveShadows: 1 54 | m_DynamicOccludee: 1 55 | m_MotionVectors: 1 56 | m_LightProbeUsage: 1 57 | m_ReflectionProbeUsage: 1 58 | m_RayTracingMode: 2 59 | m_RayTraceProcedural: 0 60 | m_RenderingLayerMask: 1 61 | m_RendererPriority: 0 62 | m_Materials: 63 | - {fileID: 0} 64 | m_StaticBatchInfo: 65 | firstSubMesh: 0 66 | subMeshCount: 0 67 | m_StaticBatchRoot: {fileID: 0} 68 | m_ProbeAnchor: {fileID: 0} 69 | m_LightProbeVolumeOverride: {fileID: 0} 70 | m_ScaleInLightmap: 1 71 | m_ReceiveGI: 1 72 | m_PreserveUVs: 0 73 | m_IgnoreNormalsForChartDetection: 0 74 | m_ImportantGI: 0 75 | m_StitchLightmapSeams: 1 76 | m_SelectedEditorRenderState: 3 77 | m_MinimumChartSize: 4 78 | m_AutoUVMaxDistance: 0.5 79 | m_AutoUVMaxAngle: 89 80 | m_LightmapParameters: {fileID: 0} 81 | m_SortingLayerID: 0 82 | m_SortingLayer: 0 83 | m_SortingOrder: 0 84 | m_AdditionalVertexStreams: {fileID: 0} 85 | --- !u!114 &8331174169484721074 86 | MonoBehaviour: 87 | m_ObjectHideFlags: 0 88 | m_CorrespondingSourceObject: {fileID: 0} 89 | m_PrefabInstance: {fileID: 0} 90 | m_PrefabAsset: {fileID: 0} 91 | m_GameObject: {fileID: 8331174169484721037} 92 | m_Enabled: 1 93 | m_EditorHideFlags: 0 94 | m_Script: {fileID: 11500000, guid: a503595a5ad3149bc81299478862c2c5, type: 3} 95 | m_Name: 96 | m_EditorClassIdentifier: 97 | _width: 1 98 | _height: 1 99 | _depth: 1 100 | _segments: 1 101 | _material: {fileID: 2100000, guid: 34d378e0ce91949eba29b06e76ad5e3a, type: 2} 102 | _filter: {fileID: 8331174169484721072} 103 | _renderer: {fileID: 8331174169484721075} 104 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Box.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: eb26ef52106d442b1bee68af54d2c23f 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Capsule.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &2591662288808477190 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 2591662288808477186} 12 | - component: {fileID: 2591662288808477187} 13 | - component: {fileID: 2591662288808477184} 14 | - component: {fileID: 2591662288808477185} 15 | m_Layer: 0 16 | m_Name: Capsule 17 | m_TagString: Untagged 18 | m_Icon: {fileID: 0} 19 | m_NavMeshLayer: 0 20 | m_StaticEditorFlags: 0 21 | m_IsActive: 1 22 | --- !u!4 &2591662288808477186 23 | Transform: 24 | m_ObjectHideFlags: 0 25 | m_CorrespondingSourceObject: {fileID: 0} 26 | m_PrefabInstance: {fileID: 0} 27 | m_PrefabAsset: {fileID: 0} 28 | m_GameObject: {fileID: 2591662288808477190} 29 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 30 | m_LocalPosition: {x: 0, y: 0, z: 0} 31 | m_LocalScale: {x: 1, y: 1, z: 1} 32 | m_Children: [] 33 | m_Father: {fileID: 0} 34 | m_RootOrder: 0 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | --- !u!33 &2591662288808477187 37 | MeshFilter: 38 | m_ObjectHideFlags: 0 39 | m_CorrespondingSourceObject: {fileID: 0} 40 | m_PrefabInstance: {fileID: 0} 41 | m_PrefabAsset: {fileID: 0} 42 | m_GameObject: {fileID: 2591662288808477190} 43 | m_Mesh: {fileID: 0} 44 | --- !u!23 &2591662288808477184 45 | MeshRenderer: 46 | m_ObjectHideFlags: 0 47 | m_CorrespondingSourceObject: {fileID: 0} 48 | m_PrefabInstance: {fileID: 0} 49 | m_PrefabAsset: {fileID: 0} 50 | m_GameObject: {fileID: 2591662288808477190} 51 | m_Enabled: 1 52 | m_CastShadows: 1 53 | m_ReceiveShadows: 1 54 | m_DynamicOccludee: 1 55 | m_MotionVectors: 1 56 | m_LightProbeUsage: 1 57 | m_ReflectionProbeUsage: 1 58 | m_RayTracingMode: 2 59 | m_RayTraceProcedural: 0 60 | m_RenderingLayerMask: 1 61 | m_RendererPriority: 0 62 | m_Materials: 63 | - {fileID: 0} 64 | m_StaticBatchInfo: 65 | firstSubMesh: 0 66 | subMeshCount: 0 67 | m_StaticBatchRoot: {fileID: 0} 68 | m_ProbeAnchor: {fileID: 0} 69 | m_LightProbeVolumeOverride: {fileID: 0} 70 | m_ScaleInLightmap: 1 71 | m_ReceiveGI: 1 72 | m_PreserveUVs: 0 73 | m_IgnoreNormalsForChartDetection: 0 74 | m_ImportantGI: 0 75 | m_StitchLightmapSeams: 1 76 | m_SelectedEditorRenderState: 3 77 | m_MinimumChartSize: 4 78 | m_AutoUVMaxDistance: 0.5 79 | m_AutoUVMaxAngle: 89 80 | m_LightmapParameters: {fileID: 0} 81 | m_SortingLayerID: 0 82 | m_SortingLayer: 0 83 | m_SortingOrder: 0 84 | m_AdditionalVertexStreams: {fileID: 0} 85 | --- !u!114 &2591662288808477185 86 | MonoBehaviour: 87 | m_ObjectHideFlags: 0 88 | m_CorrespondingSourceObject: {fileID: 0} 89 | m_PrefabInstance: {fileID: 0} 90 | m_PrefabAsset: {fileID: 0} 91 | m_GameObject: {fileID: 2591662288808477190} 92 | m_Enabled: 1 93 | m_EditorHideFlags: 0 94 | m_Script: {fileID: 11500000, guid: 605918de6b0d94f65853daf409d38399, type: 3} 95 | m_Name: 96 | m_EditorClassIdentifier: 97 | _radius: 0.5 98 | _height: 1 99 | _latitudes: 16 100 | _longitudes: 32 101 | _rings: 2 102 | _material: {fileID: 2100000, guid: 34d378e0ce91949eba29b06e76ad5e3a, type: 2} 103 | _filter: {fileID: 2591662288808477187} 104 | _renderer: {fileID: 2591662288808477184} 105 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Capsule.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5bb26c795d0a64c059686ba10103928d 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Cylinder.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &7075336000680819660 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 7075336000680819648} 12 | - component: {fileID: 7075336000680819663} 13 | - component: {fileID: 7075336000680819662} 14 | - component: {fileID: 7075336000680819661} 15 | m_Layer: 0 16 | m_Name: Cylinder 17 | m_TagString: Untagged 18 | m_Icon: {fileID: 0} 19 | m_NavMeshLayer: 0 20 | m_StaticEditorFlags: 0 21 | m_IsActive: 1 22 | --- !u!4 &7075336000680819648 23 | Transform: 24 | m_ObjectHideFlags: 0 25 | m_CorrespondingSourceObject: {fileID: 0} 26 | m_PrefabInstance: {fileID: 0} 27 | m_PrefabAsset: {fileID: 0} 28 | m_GameObject: {fileID: 7075336000680819660} 29 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 30 | m_LocalPosition: {x: 0, y: 0, z: 0} 31 | m_LocalScale: {x: 1, y: 1, z: 1} 32 | m_Children: [] 33 | m_Father: {fileID: 0} 34 | m_RootOrder: 0 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | --- !u!33 &7075336000680819663 37 | MeshFilter: 38 | m_ObjectHideFlags: 0 39 | m_CorrespondingSourceObject: {fileID: 0} 40 | m_PrefabInstance: {fileID: 0} 41 | m_PrefabAsset: {fileID: 0} 42 | m_GameObject: {fileID: 7075336000680819660} 43 | m_Mesh: {fileID: 0} 44 | --- !u!23 &7075336000680819662 45 | MeshRenderer: 46 | m_ObjectHideFlags: 0 47 | m_CorrespondingSourceObject: {fileID: 0} 48 | m_PrefabInstance: {fileID: 0} 49 | m_PrefabAsset: {fileID: 0} 50 | m_GameObject: {fileID: 7075336000680819660} 51 | m_Enabled: 1 52 | m_CastShadows: 1 53 | m_ReceiveShadows: 1 54 | m_DynamicOccludee: 1 55 | m_MotionVectors: 1 56 | m_LightProbeUsage: 1 57 | m_ReflectionProbeUsage: 1 58 | m_RayTracingMode: 2 59 | m_RayTraceProcedural: 0 60 | m_RenderingLayerMask: 1 61 | m_RendererPriority: 0 62 | m_Materials: 63 | - {fileID: 0} 64 | m_StaticBatchInfo: 65 | firstSubMesh: 0 66 | subMeshCount: 0 67 | m_StaticBatchRoot: {fileID: 0} 68 | m_ProbeAnchor: {fileID: 0} 69 | m_LightProbeVolumeOverride: {fileID: 0} 70 | m_ScaleInLightmap: 1 71 | m_ReceiveGI: 1 72 | m_PreserveUVs: 0 73 | m_IgnoreNormalsForChartDetection: 0 74 | m_ImportantGI: 0 75 | m_StitchLightmapSeams: 1 76 | m_SelectedEditorRenderState: 3 77 | m_MinimumChartSize: 4 78 | m_AutoUVMaxDistance: 0.5 79 | m_AutoUVMaxAngle: 89 80 | m_LightmapParameters: {fileID: 0} 81 | m_SortingLayerID: 0 82 | m_SortingLayer: 0 83 | m_SortingOrder: 0 84 | m_AdditionalVertexStreams: {fileID: 0} 85 | --- !u!114 &7075336000680819661 86 | MonoBehaviour: 87 | m_ObjectHideFlags: 0 88 | m_CorrespondingSourceObject: {fileID: 0} 89 | m_PrefabInstance: {fileID: 0} 90 | m_PrefabAsset: {fileID: 0} 91 | m_GameObject: {fileID: 7075336000680819660} 92 | m_Enabled: 1 93 | m_EditorHideFlags: 0 94 | m_Script: {fileID: 11500000, guid: cfdf7990b08bc4406b6a536501f2a4cc, type: 3} 95 | m_Name: 96 | m_EditorClassIdentifier: 97 | _radialSegments: 24 98 | _heightSegments: 24 99 | _size1: 0.5 100 | _size2: 0.5 101 | _height: 1 102 | _endCap: 1 103 | _filter: {fileID: 7075336000680819663} 104 | _renderer: {fileID: 7075336000680819662} 105 | _material: {fileID: 2100000, guid: 34d378e0ce91949eba29b06e76ad5e3a, type: 2} 106 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Cylinder.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 90809d69b33634b89aa200ed5eef4b9b 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Grid.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &3455946681752948676 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 3455946681752948728} 12 | - component: {fileID: 3455946681752948729} 13 | - component: {fileID: 3455946681752948678} 14 | - component: {fileID: 3455946681752948679} 15 | m_Layer: 0 16 | m_Name: Grid 17 | m_TagString: Untagged 18 | m_Icon: {fileID: 0} 19 | m_NavMeshLayer: 0 20 | m_StaticEditorFlags: 0 21 | m_IsActive: 1 22 | --- !u!4 &3455946681752948728 23 | Transform: 24 | m_ObjectHideFlags: 0 25 | m_CorrespondingSourceObject: {fileID: 0} 26 | m_PrefabInstance: {fileID: 0} 27 | m_PrefabAsset: {fileID: 0} 28 | m_GameObject: {fileID: 3455946681752948676} 29 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 30 | m_LocalPosition: {x: 0, y: 0, z: 0} 31 | m_LocalScale: {x: 1, y: 1, z: 1} 32 | m_Children: [] 33 | m_Father: {fileID: 0} 34 | m_RootOrder: 0 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | --- !u!33 &3455946681752948729 37 | MeshFilter: 38 | m_ObjectHideFlags: 0 39 | m_CorrespondingSourceObject: {fileID: 0} 40 | m_PrefabInstance: {fileID: 0} 41 | m_PrefabAsset: {fileID: 0} 42 | m_GameObject: {fileID: 3455946681752948676} 43 | m_Mesh: {fileID: 0} 44 | --- !u!23 &3455946681752948678 45 | MeshRenderer: 46 | m_ObjectHideFlags: 0 47 | m_CorrespondingSourceObject: {fileID: 0} 48 | m_PrefabInstance: {fileID: 0} 49 | m_PrefabAsset: {fileID: 0} 50 | m_GameObject: {fileID: 3455946681752948676} 51 | m_Enabled: 1 52 | m_CastShadows: 1 53 | m_ReceiveShadows: 1 54 | m_DynamicOccludee: 1 55 | m_MotionVectors: 1 56 | m_LightProbeUsage: 1 57 | m_ReflectionProbeUsage: 1 58 | m_RayTracingMode: 2 59 | m_RayTraceProcedural: 0 60 | m_RenderingLayerMask: 1 61 | m_RendererPriority: 0 62 | m_Materials: 63 | - {fileID: 0} 64 | m_StaticBatchInfo: 65 | firstSubMesh: 0 66 | subMeshCount: 0 67 | m_StaticBatchRoot: {fileID: 0} 68 | m_ProbeAnchor: {fileID: 0} 69 | m_LightProbeVolumeOverride: {fileID: 0} 70 | m_ScaleInLightmap: 1 71 | m_ReceiveGI: 1 72 | m_PreserveUVs: 0 73 | m_IgnoreNormalsForChartDetection: 0 74 | m_ImportantGI: 0 75 | m_StitchLightmapSeams: 1 76 | m_SelectedEditorRenderState: 3 77 | m_MinimumChartSize: 4 78 | m_AutoUVMaxDistance: 0.5 79 | m_AutoUVMaxAngle: 89 80 | m_LightmapParameters: {fileID: 0} 81 | m_SortingLayerID: 0 82 | m_SortingLayer: 0 83 | m_SortingOrder: 0 84 | m_AdditionalVertexStreams: {fileID: 0} 85 | --- !u!114 &3455946681752948679 86 | MonoBehaviour: 87 | m_ObjectHideFlags: 0 88 | m_CorrespondingSourceObject: {fileID: 0} 89 | m_PrefabInstance: {fileID: 0} 90 | m_PrefabAsset: {fileID: 0} 91 | m_GameObject: {fileID: 3455946681752948676} 92 | m_Enabled: 1 93 | m_EditorHideFlags: 0 94 | m_Script: {fileID: 11500000, guid: 3cb1ee165e8e94ff9ada82a323a9913b, type: 3} 95 | m_Name: 96 | m_EditorClassIdentifier: 97 | _scale: {x: 1, y: 1, z: 1} 98 | _rotation: {x: 0, y: 0, z: 0} 99 | _width: 1 100 | _height: 1 101 | _divisionX: 15 102 | _divisionY: 15 103 | _isBackVisible: 1 104 | _filter: {fileID: 3455946681752948729} 105 | _renderer: {fileID: 3455946681752948678} 106 | _material: {fileID: 2100000, guid: 34d378e0ce91949eba29b06e76ad5e3a, type: 2} 107 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Grid.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0e5cb743e926f4f3faab72499cb28edf 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Polygon.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &1596951227613384183 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 1596951227613384179} 12 | - component: {fileID: 1596951227613384176} 13 | - component: {fileID: 1596951227613384177} 14 | - component: {fileID: 1596951227613384182} 15 | m_Layer: 0 16 | m_Name: Polygon 17 | m_TagString: Untagged 18 | m_Icon: {fileID: 0} 19 | m_NavMeshLayer: 0 20 | m_StaticEditorFlags: 0 21 | m_IsActive: 1 22 | --- !u!4 &1596951227613384179 23 | Transform: 24 | m_ObjectHideFlags: 0 25 | m_CorrespondingSourceObject: {fileID: 0} 26 | m_PrefabInstance: {fileID: 0} 27 | m_PrefabAsset: {fileID: 0} 28 | m_GameObject: {fileID: 1596951227613384183} 29 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 30 | m_LocalPosition: {x: 0, y: 0, z: 0} 31 | m_LocalScale: {x: 1, y: 1, z: 1} 32 | m_Children: [] 33 | m_Father: {fileID: 0} 34 | m_RootOrder: 0 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | --- !u!33 &1596951227613384176 37 | MeshFilter: 38 | m_ObjectHideFlags: 0 39 | m_CorrespondingSourceObject: {fileID: 0} 40 | m_PrefabInstance: {fileID: 0} 41 | m_PrefabAsset: {fileID: 0} 42 | m_GameObject: {fileID: 1596951227613384183} 43 | m_Mesh: {fileID: 0} 44 | --- !u!23 &1596951227613384177 45 | MeshRenderer: 46 | m_ObjectHideFlags: 0 47 | m_CorrespondingSourceObject: {fileID: 0} 48 | m_PrefabInstance: {fileID: 0} 49 | m_PrefabAsset: {fileID: 0} 50 | m_GameObject: {fileID: 1596951227613384183} 51 | m_Enabled: 1 52 | m_CastShadows: 1 53 | m_ReceiveShadows: 1 54 | m_DynamicOccludee: 1 55 | m_MotionVectors: 1 56 | m_LightProbeUsage: 1 57 | m_ReflectionProbeUsage: 1 58 | m_RayTracingMode: 2 59 | m_RayTraceProcedural: 0 60 | m_RenderingLayerMask: 1 61 | m_RendererPriority: 0 62 | m_Materials: 63 | - {fileID: 0} 64 | m_StaticBatchInfo: 65 | firstSubMesh: 0 66 | subMeshCount: 0 67 | m_StaticBatchRoot: {fileID: 0} 68 | m_ProbeAnchor: {fileID: 0} 69 | m_LightProbeVolumeOverride: {fileID: 0} 70 | m_ScaleInLightmap: 1 71 | m_ReceiveGI: 1 72 | m_PreserveUVs: 0 73 | m_IgnoreNormalsForChartDetection: 0 74 | m_ImportantGI: 0 75 | m_StitchLightmapSeams: 1 76 | m_SelectedEditorRenderState: 3 77 | m_MinimumChartSize: 4 78 | m_AutoUVMaxDistance: 0.5 79 | m_AutoUVMaxAngle: 89 80 | m_LightmapParameters: {fileID: 0} 81 | m_SortingLayerID: 0 82 | m_SortingLayer: 0 83 | m_SortingOrder: 0 84 | m_AdditionalVertexStreams: {fileID: 0} 85 | --- !u!114 &1596951227613384182 86 | MonoBehaviour: 87 | m_ObjectHideFlags: 0 88 | m_CorrespondingSourceObject: {fileID: 0} 89 | m_PrefabInstance: {fileID: 0} 90 | m_PrefabAsset: {fileID: 0} 91 | m_GameObject: {fileID: 1596951227613384183} 92 | m_Enabled: 1 93 | m_EditorHideFlags: 0 94 | m_Script: {fileID: 11500000, guid: 832653835692d43ba8e0a74cc4beee0d, type: 3} 95 | m_Name: 96 | m_EditorClassIdentifier: 97 | _size: 1 98 | _shape: 3 99 | _filter: {fileID: 1596951227613384176} 100 | _renderer: {fileID: 1596951227613384177} 101 | _material: {fileID: 2100000, guid: 34d378e0ce91949eba29b06e76ad5e3a, type: 2} 102 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Polygon.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 46ef2aafe7c3f41b799bc411f6bf2dba 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Polyhedron.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &3809681529049135513 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 3809681529049135517} 12 | - component: {fileID: 3809681529049135516} 13 | - component: {fileID: 3809681529049135519} 14 | - component: {fileID: 3809681529049135518} 15 | m_Layer: 0 16 | m_Name: Polyhedron 17 | m_TagString: Untagged 18 | m_Icon: {fileID: 0} 19 | m_NavMeshLayer: 0 20 | m_StaticEditorFlags: 0 21 | m_IsActive: 1 22 | --- !u!4 &3809681529049135517 23 | Transform: 24 | m_ObjectHideFlags: 0 25 | m_CorrespondingSourceObject: {fileID: 0} 26 | m_PrefabInstance: {fileID: 0} 27 | m_PrefabAsset: {fileID: 0} 28 | m_GameObject: {fileID: 3809681529049135513} 29 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 30 | m_LocalPosition: {x: 0, y: 0, z: 0} 31 | m_LocalScale: {x: 1, y: 1, z: 1} 32 | m_Children: [] 33 | m_Father: {fileID: 0} 34 | m_RootOrder: 0 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | --- !u!33 &3809681529049135516 37 | MeshFilter: 38 | m_ObjectHideFlags: 0 39 | m_CorrespondingSourceObject: {fileID: 0} 40 | m_PrefabInstance: {fileID: 0} 41 | m_PrefabAsset: {fileID: 0} 42 | m_GameObject: {fileID: 3809681529049135513} 43 | m_Mesh: {fileID: 0} 44 | --- !u!23 &3809681529049135519 45 | MeshRenderer: 46 | m_ObjectHideFlags: 0 47 | m_CorrespondingSourceObject: {fileID: 0} 48 | m_PrefabInstance: {fileID: 0} 49 | m_PrefabAsset: {fileID: 0} 50 | m_GameObject: {fileID: 3809681529049135513} 51 | m_Enabled: 1 52 | m_CastShadows: 1 53 | m_ReceiveShadows: 1 54 | m_DynamicOccludee: 1 55 | m_MotionVectors: 1 56 | m_LightProbeUsage: 1 57 | m_ReflectionProbeUsage: 1 58 | m_RayTracingMode: 2 59 | m_RayTraceProcedural: 0 60 | m_RenderingLayerMask: 1 61 | m_RendererPriority: 0 62 | m_Materials: 63 | - {fileID: 0} 64 | m_StaticBatchInfo: 65 | firstSubMesh: 0 66 | subMeshCount: 0 67 | m_StaticBatchRoot: {fileID: 0} 68 | m_ProbeAnchor: {fileID: 0} 69 | m_LightProbeVolumeOverride: {fileID: 0} 70 | m_ScaleInLightmap: 1 71 | m_ReceiveGI: 1 72 | m_PreserveUVs: 0 73 | m_IgnoreNormalsForChartDetection: 0 74 | m_ImportantGI: 0 75 | m_StitchLightmapSeams: 1 76 | m_SelectedEditorRenderState: 3 77 | m_MinimumChartSize: 4 78 | m_AutoUVMaxDistance: 0.5 79 | m_AutoUVMaxAngle: 89 80 | m_LightmapParameters: {fileID: 0} 81 | m_SortingLayerID: 0 82 | m_SortingLayer: 0 83 | m_SortingOrder: 0 84 | m_AdditionalVertexStreams: {fileID: 0} 85 | --- !u!114 &3809681529049135518 86 | MonoBehaviour: 87 | m_ObjectHideFlags: 0 88 | m_CorrespondingSourceObject: {fileID: 0} 89 | m_PrefabInstance: {fileID: 0} 90 | m_PrefabAsset: {fileID: 0} 91 | m_GameObject: {fileID: 3809681529049135513} 92 | m_Enabled: 1 93 | m_EditorHideFlags: 0 94 | m_Script: {fileID: 11500000, guid: 14218a9a8f391444395acb4b75694bb8, type: 3} 95 | m_Name: 96 | m_EditorClassIdentifier: 97 | _type: 0 98 | _size: 1 99 | _filter: {fileID: 3809681529049135516} 100 | _renderer: {fileID: 3809681529049135519} 101 | _material: {fileID: 2100000, guid: 34d378e0ce91949eba29b06e76ad5e3a, type: 2} 102 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Polyhedron.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6d34c904b95fb4be6991a0ca83fcd898 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Sphere.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &2291770445230993887 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 2291770445230993875} 12 | - component: {fileID: 2291770445230993874} 13 | - component: {fileID: 2291770445230993885} 14 | - component: {fileID: 2291770445230993884} 15 | m_Layer: 0 16 | m_Name: Sphere 17 | m_TagString: Untagged 18 | m_Icon: {fileID: 0} 19 | m_NavMeshLayer: 0 20 | m_StaticEditorFlags: 0 21 | m_IsActive: 1 22 | --- !u!4 &2291770445230993875 23 | Transform: 24 | m_ObjectHideFlags: 0 25 | m_CorrespondingSourceObject: {fileID: 0} 26 | m_PrefabInstance: {fileID: 0} 27 | m_PrefabAsset: {fileID: 0} 28 | m_GameObject: {fileID: 2291770445230993887} 29 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 30 | m_LocalPosition: {x: 0, y: 0, z: 0} 31 | m_LocalScale: {x: 1, y: 1, z: 1} 32 | m_Children: [] 33 | m_Father: {fileID: 0} 34 | m_RootOrder: 0 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | --- !u!33 &2291770445230993874 37 | MeshFilter: 38 | m_ObjectHideFlags: 0 39 | m_CorrespondingSourceObject: {fileID: 0} 40 | m_PrefabInstance: {fileID: 0} 41 | m_PrefabAsset: {fileID: 0} 42 | m_GameObject: {fileID: 2291770445230993887} 43 | m_Mesh: {fileID: 0} 44 | --- !u!23 &2291770445230993885 45 | MeshRenderer: 46 | m_ObjectHideFlags: 0 47 | m_CorrespondingSourceObject: {fileID: 0} 48 | m_PrefabInstance: {fileID: 0} 49 | m_PrefabAsset: {fileID: 0} 50 | m_GameObject: {fileID: 2291770445230993887} 51 | m_Enabled: 1 52 | m_CastShadows: 1 53 | m_ReceiveShadows: 1 54 | m_DynamicOccludee: 1 55 | m_MotionVectors: 1 56 | m_LightProbeUsage: 1 57 | m_ReflectionProbeUsage: 1 58 | m_RayTracingMode: 2 59 | m_RayTraceProcedural: 0 60 | m_RenderingLayerMask: 1 61 | m_RendererPriority: 0 62 | m_Materials: 63 | - {fileID: 0} 64 | m_StaticBatchInfo: 65 | firstSubMesh: 0 66 | subMeshCount: 0 67 | m_StaticBatchRoot: {fileID: 0} 68 | m_ProbeAnchor: {fileID: 0} 69 | m_LightProbeVolumeOverride: {fileID: 0} 70 | m_ScaleInLightmap: 1 71 | m_ReceiveGI: 1 72 | m_PreserveUVs: 0 73 | m_IgnoreNormalsForChartDetection: 0 74 | m_ImportantGI: 0 75 | m_StitchLightmapSeams: 1 76 | m_SelectedEditorRenderState: 3 77 | m_MinimumChartSize: 4 78 | m_AutoUVMaxDistance: 0.5 79 | m_AutoUVMaxAngle: 89 80 | m_LightmapParameters: {fileID: 0} 81 | m_SortingLayerID: 0 82 | m_SortingLayer: 0 83 | m_SortingOrder: 0 84 | m_AdditionalVertexStreams: {fileID: 0} 85 | --- !u!114 &2291770445230993884 86 | MonoBehaviour: 87 | m_ObjectHideFlags: 0 88 | m_CorrespondingSourceObject: {fileID: 0} 89 | m_PrefabInstance: {fileID: 0} 90 | m_PrefabAsset: {fileID: 0} 91 | m_GameObject: {fileID: 2291770445230993887} 92 | m_Enabled: 1 93 | m_EditorHideFlags: 0 94 | m_Script: {fileID: 11500000, guid: 2e842168ec345442f8e3a7942e5b6fd6, type: 3} 95 | m_Name: 96 | m_EditorClassIdentifier: 97 | _radius: 1 98 | _level: 3 99 | _filter: {fileID: 2291770445230993874} 100 | _renderer: {fileID: 2291770445230993885} 101 | _material: {fileID: 2100000, guid: 34d378e0ce91949eba29b06e76ad5e3a, type: 2} 102 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Sphere.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 27fd746c69f28421fa05007d2f4429ff 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Torus.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &2460512011073721659 4 | GameObject: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | serializedVersion: 6 10 | m_Component: 11 | - component: {fileID: 2460512011073721542} 12 | - component: {fileID: 2460512011073721541} 13 | - component: {fileID: 2460512011073721540} 14 | - component: {fileID: 2460512011073721543} 15 | m_Layer: 0 16 | m_Name: Torus 17 | m_TagString: Untagged 18 | m_Icon: {fileID: 0} 19 | m_NavMeshLayer: 0 20 | m_StaticEditorFlags: 0 21 | m_IsActive: 1 22 | --- !u!4 &2460512011073721542 23 | Transform: 24 | m_ObjectHideFlags: 0 25 | m_CorrespondingSourceObject: {fileID: 0} 26 | m_PrefabInstance: {fileID: 0} 27 | m_PrefabAsset: {fileID: 0} 28 | m_GameObject: {fileID: 2460512011073721659} 29 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 30 | m_LocalPosition: {x: 0, y: 0, z: 0} 31 | m_LocalScale: {x: 1, y: 1, z: 1} 32 | m_Children: [] 33 | m_Father: {fileID: 0} 34 | m_RootOrder: 0 35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 36 | --- !u!33 &2460512011073721541 37 | MeshFilter: 38 | m_ObjectHideFlags: 0 39 | m_CorrespondingSourceObject: {fileID: 0} 40 | m_PrefabInstance: {fileID: 0} 41 | m_PrefabAsset: {fileID: 0} 42 | m_GameObject: {fileID: 2460512011073721659} 43 | m_Mesh: {fileID: 0} 44 | --- !u!23 &2460512011073721540 45 | MeshRenderer: 46 | m_ObjectHideFlags: 0 47 | m_CorrespondingSourceObject: {fileID: 0} 48 | m_PrefabInstance: {fileID: 0} 49 | m_PrefabAsset: {fileID: 0} 50 | m_GameObject: {fileID: 2460512011073721659} 51 | m_Enabled: 1 52 | m_CastShadows: 1 53 | m_ReceiveShadows: 1 54 | m_DynamicOccludee: 1 55 | m_MotionVectors: 1 56 | m_LightProbeUsage: 1 57 | m_ReflectionProbeUsage: 1 58 | m_RayTracingMode: 2 59 | m_RayTraceProcedural: 0 60 | m_RenderingLayerMask: 1 61 | m_RendererPriority: 0 62 | m_Materials: 63 | - {fileID: 0} 64 | m_StaticBatchInfo: 65 | firstSubMesh: 0 66 | subMeshCount: 0 67 | m_StaticBatchRoot: {fileID: 0} 68 | m_ProbeAnchor: {fileID: 0} 69 | m_LightProbeVolumeOverride: {fileID: 0} 70 | m_ScaleInLightmap: 1 71 | m_ReceiveGI: 1 72 | m_PreserveUVs: 0 73 | m_IgnoreNormalsForChartDetection: 0 74 | m_ImportantGI: 0 75 | m_StitchLightmapSeams: 1 76 | m_SelectedEditorRenderState: 3 77 | m_MinimumChartSize: 4 78 | m_AutoUVMaxDistance: 0.5 79 | m_AutoUVMaxAngle: 89 80 | m_LightmapParameters: {fileID: 0} 81 | m_SortingLayerID: 0 82 | m_SortingLayer: 0 83 | m_SortingOrder: 0 84 | m_AdditionalVertexStreams: {fileID: 0} 85 | --- !u!114 &2460512011073721543 86 | MonoBehaviour: 87 | m_ObjectHideFlags: 0 88 | m_CorrespondingSourceObject: {fileID: 0} 89 | m_PrefabInstance: {fileID: 0} 90 | m_PrefabAsset: {fileID: 0} 91 | m_GameObject: {fileID: 2460512011073721659} 92 | m_Enabled: 1 93 | m_EditorHideFlags: 0 94 | m_Script: {fileID: 11500000, guid: 1f69f7cf7306c462c9e699312a165258, type: 3} 95 | m_Name: 96 | m_EditorClassIdentifier: 97 | _majorRadius: 0.5 98 | _minorRadius: 0.25 99 | _majorSegment: 24 100 | _minorSegment: 18 101 | _filter: {fileID: 2460512011073721541} 102 | _renderer: {fileID: 2460512011073721540} 103 | _material: {fileID: 2100000, guid: 34d378e0ce91949eba29b06e76ad5e3a, type: 2} 104 | -------------------------------------------------------------------------------- /Assets/Resources/Prefabs/Torus.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c70e56c85706848cf98a5e59c6a7a9ea 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d989f5909a6884578bbb4e402bc504bf 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scenes/SampleScene.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: 9 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: 2100000, guid: 97fca95f33987e548be9dd7c03cb1a96, type: 2} 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: 705507994} 41 | m_IndirectSpecularColor: {r: 0.5418301, g: 0.751298, b: 0.845497, a: 1} 42 | m_UseRadianceAmbientProbe: 0 43 | --- !u!157 &3 44 | LightmapSettings: 45 | m_ObjectHideFlags: 0 46 | serializedVersion: 12 47 | m_GIWorkflowMode: 1 48 | m_GISettings: 49 | serializedVersion: 2 50 | m_BounceScale: 1 51 | m_IndirectOutputScale: 1 52 | m_AlbedoBoost: 1 53 | m_EnvironmentLightingMode: 0 54 | m_EnableBakedLightmaps: 1 55 | m_EnableRealtimeLightmaps: 0 56 | m_LightmapEditorSettings: 57 | serializedVersion: 12 58 | m_Resolution: 2 59 | m_BakeResolution: 40 60 | m_AtlasSize: 1024 61 | m_AO: 0 62 | m_AOMaxDistance: 1 63 | m_CompAOExponent: 1 64 | m_CompAOExponentDirect: 0 65 | m_ExtractAmbientOcclusion: 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_PVREnvironmentSampleCount: 500 81 | m_PVREnvironmentReferencePointCount: 2048 82 | m_PVRFilteringMode: 2 83 | m_PVRDenoiserTypeDirect: 0 84 | m_PVRDenoiserTypeIndirect: 0 85 | m_PVRDenoiserTypeAO: 0 86 | m_PVRFilterTypeDirect: 0 87 | m_PVRFilterTypeIndirect: 0 88 | m_PVRFilterTypeAO: 0 89 | m_PVREnvironmentMIS: 0 90 | m_PVRCulling: 1 91 | m_PVRFilteringGaussRadiusDirect: 1 92 | m_PVRFilteringGaussRadiusIndirect: 5 93 | m_PVRFilteringGaussRadiusAO: 2 94 | m_PVRFilteringAtrousPositionSigmaDirect: 0.5 95 | m_PVRFilteringAtrousPositionSigmaIndirect: 2 96 | m_PVRFilteringAtrousPositionSigmaAO: 1 97 | m_ExportTrainingData: 0 98 | m_TrainingDataDestination: TrainingData 99 | m_LightProbeSampleCountMultiplier: 4 100 | m_LightingDataAsset: {fileID: 0} 101 | m_LightingSettings: {fileID: 0} 102 | --- !u!196 &4 103 | NavMeshSettings: 104 | serializedVersion: 2 105 | m_ObjectHideFlags: 0 106 | m_BuildSettings: 107 | serializedVersion: 2 108 | agentTypeID: 0 109 | agentRadius: 0.5 110 | agentHeight: 2 111 | agentSlope: 45 112 | agentClimb: 0.4 113 | ledgeDropHeight: 0 114 | maxJumpAcrossDistance: 0 115 | minRegionArea: 2 116 | manualCellSize: 0 117 | cellSize: 0.16666667 118 | manualTileSize: 0 119 | tileSize: 256 120 | accuratePlacement: 0 121 | maxJobWorkers: 0 122 | preserveTilesOutsideBounds: 0 123 | debug: 124 | m_Flags: 0 125 | m_NavMeshData: {fileID: 0} 126 | --- !u!1 &705507993 127 | GameObject: 128 | m_ObjectHideFlags: 0 129 | m_CorrespondingSourceObject: {fileID: 0} 130 | m_PrefabInstance: {fileID: 0} 131 | m_PrefabAsset: {fileID: 0} 132 | serializedVersion: 6 133 | m_Component: 134 | - component: {fileID: 705507995} 135 | - component: {fileID: 705507994} 136 | m_Layer: 0 137 | m_Name: Directional Light 138 | m_TagString: Untagged 139 | m_Icon: {fileID: 0} 140 | m_NavMeshLayer: 0 141 | m_StaticEditorFlags: 0 142 | m_IsActive: 1 143 | --- !u!108 &705507994 144 | Light: 145 | m_ObjectHideFlags: 0 146 | m_CorrespondingSourceObject: {fileID: 0} 147 | m_PrefabInstance: {fileID: 0} 148 | m_PrefabAsset: {fileID: 0} 149 | m_GameObject: {fileID: 705507993} 150 | m_Enabled: 1 151 | serializedVersion: 10 152 | m_Type: 1 153 | m_Shape: 0 154 | m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} 155 | m_Intensity: 1 156 | m_Range: 10 157 | m_SpotAngle: 30 158 | m_InnerSpotAngle: 21.802082 159 | m_CookieSize: 10 160 | m_Shadows: 161 | m_Type: 2 162 | m_Resolution: -1 163 | m_CustomResolution: -1 164 | m_Strength: 1 165 | m_Bias: 0.05 166 | m_NormalBias: 0.4 167 | m_NearPlane: 0.2 168 | m_CullingMatrixOverride: 169 | e00: 1 170 | e01: 0 171 | e02: 0 172 | e03: 0 173 | e10: 0 174 | e11: 1 175 | e12: 0 176 | e13: 0 177 | e20: 0 178 | e21: 0 179 | e22: 1 180 | e23: 0 181 | e30: 0 182 | e31: 0 183 | e32: 0 184 | e33: 1 185 | m_UseCullingMatrixOverride: 0 186 | m_Cookie: {fileID: 0} 187 | m_DrawHalo: 0 188 | m_Flare: {fileID: 0} 189 | m_RenderMode: 0 190 | m_CullingMask: 191 | serializedVersion: 2 192 | m_Bits: 4294967295 193 | m_RenderingLayerMask: 1 194 | m_Lightmapping: 1 195 | m_LightShadowCasterMode: 0 196 | m_AreaSize: {x: 1, y: 1} 197 | m_BounceIntensity: 1 198 | m_ColorTemperature: 6570 199 | m_UseColorTemperature: 0 200 | m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} 201 | m_UseBoundingSphereOverride: 0 202 | m_UseViewFrustumForShadowCasterCull: 1 203 | m_ShadowRadius: 0 204 | m_ShadowAngle: 0 205 | --- !u!4 &705507995 206 | Transform: 207 | m_ObjectHideFlags: 0 208 | m_CorrespondingSourceObject: {fileID: 0} 209 | m_PrefabInstance: {fileID: 0} 210 | m_PrefabAsset: {fileID: 0} 211 | m_GameObject: {fileID: 705507993} 212 | m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} 213 | m_LocalPosition: {x: 0, y: 3, z: 0} 214 | m_LocalScale: {x: 1, y: 1, z: 1} 215 | m_Children: [] 216 | m_Father: {fileID: 0} 217 | m_RootOrder: 1 218 | m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} 219 | --- !u!1 &963194225 220 | GameObject: 221 | m_ObjectHideFlags: 0 222 | m_CorrespondingSourceObject: {fileID: 0} 223 | m_PrefabInstance: {fileID: 0} 224 | m_PrefabAsset: {fileID: 0} 225 | serializedVersion: 6 226 | m_Component: 227 | - component: {fileID: 963194228} 228 | - component: {fileID: 963194227} 229 | - component: {fileID: 963194226} 230 | m_Layer: 0 231 | m_Name: Main Camera 232 | m_TagString: MainCamera 233 | m_Icon: {fileID: 0} 234 | m_NavMeshLayer: 0 235 | m_StaticEditorFlags: 0 236 | m_IsActive: 1 237 | --- !u!81 &963194226 238 | AudioListener: 239 | m_ObjectHideFlags: 0 240 | m_CorrespondingSourceObject: {fileID: 0} 241 | m_PrefabInstance: {fileID: 0} 242 | m_PrefabAsset: {fileID: 0} 243 | m_GameObject: {fileID: 963194225} 244 | m_Enabled: 1 245 | --- !u!20 &963194227 246 | Camera: 247 | m_ObjectHideFlags: 0 248 | m_CorrespondingSourceObject: {fileID: 0} 249 | m_PrefabInstance: {fileID: 0} 250 | m_PrefabAsset: {fileID: 0} 251 | m_GameObject: {fileID: 963194225} 252 | m_Enabled: 1 253 | serializedVersion: 2 254 | m_ClearFlags: 1 255 | m_BackGroundColor: {r: 0.37601566, g: 0.34117648, b: 0.6901961, a: 0} 256 | m_projectionMatrixMode: 1 257 | m_GateFitMode: 2 258 | m_FOVAxisMode: 0 259 | m_SensorSize: {x: 36, y: 24} 260 | m_LensShift: {x: 0, y: 0} 261 | m_FocalLength: 50 262 | m_NormalizedViewPortRect: 263 | serializedVersion: 2 264 | x: 0 265 | y: 0 266 | width: 1 267 | height: 1 268 | near clip plane: 0.3 269 | far clip plane: 1000 270 | field of view: 60 271 | orthographic: 0 272 | orthographic size: 5 273 | m_Depth: -1 274 | m_CullingMask: 275 | serializedVersion: 2 276 | m_Bits: 4294967295 277 | m_RenderingPath: -1 278 | m_TargetTexture: {fileID: 0} 279 | m_TargetDisplay: 0 280 | m_TargetEye: 3 281 | m_HDR: 1 282 | m_AllowMSAA: 1 283 | m_AllowDynamicResolution: 0 284 | m_ForceIntoRT: 0 285 | m_OcclusionCulling: 1 286 | m_StereoConvergence: 10 287 | m_StereoSeparation: 0.022 288 | --- !u!4 &963194228 289 | Transform: 290 | m_ObjectHideFlags: 0 291 | m_CorrespondingSourceObject: {fileID: 0} 292 | m_PrefabInstance: {fileID: 0} 293 | m_PrefabAsset: {fileID: 0} 294 | m_GameObject: {fileID: 963194225} 295 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 296 | m_LocalPosition: {x: 0, y: 0.25, z: -7} 297 | m_LocalScale: {x: 1, y: 1, z: 1} 298 | m_Children: [] 299 | m_Father: {fileID: 0} 300 | m_RootOrder: 0 301 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 302 | --- !u!1 &1180059061 303 | GameObject: 304 | m_ObjectHideFlags: 0 305 | m_CorrespondingSourceObject: {fileID: 0} 306 | m_PrefabInstance: {fileID: 0} 307 | m_PrefabAsset: {fileID: 0} 308 | serializedVersion: 6 309 | m_Component: 310 | - component: {fileID: 1180059063} 311 | - component: {fileID: 1180059062} 312 | m_Layer: 0 313 | m_Name: PrimitiveManager 314 | m_TagString: Untagged 315 | m_Icon: {fileID: 0} 316 | m_NavMeshLayer: 0 317 | m_StaticEditorFlags: 0 318 | m_IsActive: 1 319 | --- !u!114 &1180059062 320 | MonoBehaviour: 321 | m_ObjectHideFlags: 0 322 | m_CorrespondingSourceObject: {fileID: 0} 323 | m_PrefabInstance: {fileID: 0} 324 | m_PrefabAsset: {fileID: 0} 325 | m_GameObject: {fileID: 1180059061} 326 | m_Enabled: 1 327 | m_EditorHideFlags: 0 328 | m_Script: {fileID: 11500000, guid: 7183c39d4468a4e33b7dcdbe9dcf6877, type: 3} 329 | m_Name: 330 | m_EditorClassIdentifier: 331 | _spherePrefab: {fileID: 2291770445230993884, guid: 27fd746c69f28421fa05007d2f4429ff, type: 3} 332 | _boxPrefab: {fileID: 8331174169484721074, guid: eb26ef52106d442b1bee68af54d2c23f, type: 3} 333 | _polygonPrefab: {fileID: 1596951227613384182, guid: 46ef2aafe7c3f41b799bc411f6bf2dba, type: 3} 334 | _capsulePrefab: {fileID: 2591662288808477185, guid: 5bb26c795d0a64c059686ba10103928d, type: 3} 335 | _cylinderPrefab: {fileID: 7075336000680819661, guid: 90809d69b33634b89aa200ed5eef4b9b, type: 3} 336 | _torusPrefab: {fileID: 2460512011073721543, guid: c70e56c85706848cf98a5e59c6a7a9ea, type: 3} 337 | _polyhedronPrefab: {fileID: 3809681529049135518, guid: 6d34c904b95fb4be6991a0ca83fcd898, type: 3} 338 | _gridPrefab: {fileID: 3455946681752948679, guid: 0e5cb743e926f4f3faab72499cb28edf, type: 3} 339 | _defaultMaterial: {fileID: 2100000, guid: 34d378e0ce91949eba29b06e76ad5e3a, type: 2} 340 | _redMaterial: {fileID: 2100000, guid: 55413634fc741478c973caf5556c8e63, type: 2} 341 | _blueMaterial: {fileID: 2100000, guid: 38617acc607854180bc788f670fb2176, type: 2} 342 | _yellowMaterial: {fileID: 2100000, guid: 3f08bf94c216642afbc7e356c9647450, type: 2} 343 | _parent: {fileID: 1180059063} 344 | --- !u!4 &1180059063 345 | Transform: 346 | m_ObjectHideFlags: 0 347 | m_CorrespondingSourceObject: {fileID: 0} 348 | m_PrefabInstance: {fileID: 0} 349 | m_PrefabAsset: {fileID: 0} 350 | m_GameObject: {fileID: 1180059061} 351 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 352 | m_LocalPosition: {x: 0, y: 0, z: 0} 353 | m_LocalScale: {x: 1, y: 1, z: 1} 354 | m_Children: [] 355 | m_Father: {fileID: 0} 356 | m_RootOrder: 2 357 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 358 | -------------------------------------------------------------------------------- /Assets/Scenes/SampleScene.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3b671f145e67b4eb3976f208d8ce75db 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f0602b757317646519723b1b1387afe8 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/2D.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3abd3566aa6c74a1e8651d3b325d4a01 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/2D/Polygon.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using PrimitiveCommon; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | [RequireComponent(typeof(MeshRenderer))] 7 | [RequireComponent(typeof(MeshFilter))] 8 | public class Polygon : PrimitiveBase 9 | { 10 | [SerializeField, Range(Const.MIN_SCALE, Const.MAX_SCALE)] float _size = 1f; 11 | [SerializeField, Range(3, 50)] int _shape = 3; 12 | [SerializeField] MeshFilter _filter; 13 | [SerializeField] MeshRenderer _renderer; 14 | [SerializeField] Material _material; 15 | 16 | private Mesh _mesh; 17 | 18 | public void Generate(int shape, float size, Material material = null) 19 | { 20 | CreateMesh(shape, size); 21 | UpdateMesh(); 22 | if(material != null) { 23 | SetMaterial(material, _renderer); 24 | } 25 | } 26 | 27 | private void CreateMesh(int shape, float size) 28 | { 29 | float radius = size / 2f; 30 | _mesh = PolygonBuilder.Build(shape, radius); 31 | } 32 | 33 | private void UpdateMesh() 34 | { 35 | if (!_filter.sharedMesh) 36 | { 37 | _filter.sharedMesh = new Mesh(); 38 | } 39 | 40 | _filter.sharedMesh.Clear(); 41 | _filter.sharedMesh = _mesh; 42 | } 43 | 44 | private void OnDestroy() 45 | { 46 | var mat = _renderer.material; 47 | if (mat != null) 48 | { 49 | Destroy(mat); 50 | } 51 | } 52 | } 53 | } -------------------------------------------------------------------------------- /Assets/Scripts/2D/Polygon.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 832653835692d43ba8e0a74cc4beee0d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/2D/PolygonBuilder.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | public class PolygonBuilder 7 | { 8 | public static Mesh Build(int shape, float radius) 9 | { 10 | if(shape < 3) { 11 | shape = 3; 12 | } 13 | var vertices = new List(); 14 | var uvs = new List(); 15 | var triangles = new List(); 16 | 17 | var center = Vector3.zero; 18 | vertices.Add(center); 19 | uvs.Add(new Vector2(0.5f, 0.5f)); 20 | 21 | float stepAngle = 2.0f * Mathf.PI / shape; 22 | 23 | float x, y, s, t; 24 | for (int i = 0; i < shape; i++) 25 | { 26 | float angle = i * stepAngle; 27 | x = radius * Mathf.Cos(angle); 28 | y = radius * Mathf.Sin(angle); 29 | vertices.Add(new Vector3(x, y, 0)); 30 | 31 | s = 0.5f + Mathf.Cos(angle) / 2f; 32 | t = 0.5f + Mathf.Sin(angle) / 2f; 33 | uvs.Add(new Vector2(s, t)); 34 | } 35 | 36 | for (int i = 0; i < shape-1; i++) 37 | { 38 | triangles.Add(0); 39 | triangles.Add(i + 2); 40 | triangles.Add(i + 1); 41 | } 42 | triangles.Add(0); 43 | triangles.Add(1); 44 | triangles.Add(shape); 45 | 46 | Mesh mesh = new Mesh(); 47 | mesh.name = "Polygon"; 48 | mesh.vertices = vertices.ToArray(); 49 | mesh.triangles = triangles.ToArray(); 50 | mesh.uv = uvs.ToArray(); 51 | 52 | mesh.RecalculateNormals(); 53 | mesh.RecalculateTangents(); 54 | mesh.Optimize(); 55 | 56 | return mesh; 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Assets/Scripts/2D/PolygonBuilder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a48821b3aa7c84a458059558a060c521 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1d752b8bc3c1e4c72afdcf73ea28576d 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Box.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7e0ccd20a707f432881c8efa07045902 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Box/Box.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using PrimitiveCommon; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | [RequireComponent(typeof(MeshRenderer))] 7 | [RequireComponent(typeof(MeshFilter))] 8 | public class Box : PrimitiveBase 9 | { 10 | [SerializeField, Range(Const.MIN_SCALE, Const.MAX_SCALE)] float _width = 1f; 11 | [SerializeField, Range(Const.MIN_SCALE, Const.MAX_SCALE)] float _height = 1f; 12 | [SerializeField, Range(Const.MIN_SCALE, Const.MAX_SCALE)] float _depth = 1f; 13 | [SerializeField, Range(1, 40)] int _segments = 1; 14 | [SerializeField] Material _material; 15 | [SerializeField] MeshFilter _filter; 16 | [SerializeField] MeshRenderer _renderer; 17 | 18 | private Mesh _mesh; 19 | 20 | public void Generate(float width, float height, float depth, int segments, Material material = null) 21 | { 22 | CreateMesh(width, height, depth, segments); 23 | UpdateMesh(); 24 | if(material != null) { 25 | SetMaterial(material, _renderer); 26 | } 27 | } 28 | 29 | private void CreateMesh(float width, float height, float depth, int segments) 30 | { 31 | _mesh = BoxBuilder.Build(width, segments, height, depth, 1f); 32 | } 33 | 34 | private void UpdateMesh() 35 | { 36 | if (!_filter?.sharedMesh) 37 | { 38 | _filter.sharedMesh = new Mesh(); 39 | } 40 | 41 | _filter.sharedMesh.Clear(); 42 | _filter.sharedMesh = _mesh; 43 | } 44 | 45 | private void OnDestroy() 46 | { 47 | var instance = _renderer.material; 48 | if (instance != null) 49 | { 50 | Destroy(instance); 51 | } 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Box/Box.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a503595a5ad3149bc81299478862c2c5 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Box/BoxBuilder.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace PrimitiveGenerator 4 | { 5 | public class BoxBuilder 6 | { 7 | public static Mesh Build(float width, int step, float height, float depth, float scale) 8 | { 9 | Vector3 Size = new Vector3(width * scale, height * scale, depth * scale); 10 | Vector3 Half = Size / 2f; 11 | 12 | var coordXY = new Vector3[] {Vector3.right, Vector3.up}; 13 | var front = CreatePlane( 14 | coordXY, new Vector2(Size.x, Size.y), 15 | step, new Vector3(-Half.x, -Half.y, Half.z), 16 | Vector3.forward); 17 | front.RecalculateNormals(); 18 | front.RecalculateTangents(); 19 | var back = CreatePlane( 20 | coordXY, new Vector2(Size.x, Size.y), 21 | step, new Vector3(Half.x, -Half.y, -Half.z), 22 | Vector3.back); 23 | back.RecalculateNormals(); 24 | back.RecalculateTangents(); 25 | 26 | var coordXZ = new Vector3[] {Vector3.right, Vector3.back}; 27 | var top = CreatePlane( 28 | coordXZ, new Vector2(Size.x, Size.z), 29 | step, new Vector3(-Half.x, Half.y, -Half.z), 30 | Vector3.up); 31 | top.RecalculateNormals(); 32 | top.RecalculateTangents(); 33 | var bottom = CreatePlane( 34 | coordXZ, new Vector2(Size.x, Size.z), 35 | step, new Vector3(-Half.x, -Half.y, Half.z), 36 | Vector3.down); 37 | bottom.RecalculateNormals(); 38 | bottom.RecalculateTangents(); 39 | 40 | var coordZY = new Vector3[] {Vector3.back, Vector3.up}; 41 | var right = CreatePlane( 42 | coordZY, new Vector2(Size.z, Size.y), 43 | step, new Vector3(Half.x, -Half.y, -Half.z), 44 | Vector3.right); 45 | right.RecalculateNormals(); 46 | right.RecalculateTangents(); 47 | var left = CreatePlane( 48 | coordZY, new Vector2(Size.z, Size.y), 49 | step, new Vector3(-Half.x, -Half.y, Half.z), 50 | Vector3.left); 51 | left.RecalculateNormals(); 52 | left.RecalculateTangents(); 53 | 54 | var q = Quaternion.Euler(new Vector3(0, 0, 0)); 55 | var one = Vector3.one; 56 | var planes = new CombineInstance[6]; 57 | 58 | planes[0].mesh = front; 59 | var q0 = Quaternion.Euler(new Vector3(0, 0, 0)); 60 | planes[0].transform = Matrix4x4.TRS(new Vector3(0, 0, -Size.z), q0, one); 61 | 62 | planes[1].mesh = back; 63 | var q1 = Quaternion.Euler(new Vector3(0, 180f, 0)); 64 | planes[1].transform = Matrix4x4.TRS(new Vector3(Size.x, 0, 0), q1, one); 65 | 66 | planes[2].mesh = top; 67 | var q2 = Quaternion.Euler(new Vector3(180f, 0, 0)); 68 | planes[2].transform = Matrix4x4.TRS(new Vector3(0, Size.y, -Size.z), q2, one); 69 | 70 | planes[3].mesh = bottom; 71 | var q3 = Quaternion.Euler(new Vector3(0, 0, 0)); 72 | planes[3].transform = Matrix4x4.TRS(new Vector3(0, 0, 0), q3, one); 73 | 74 | planes[4].mesh = right; 75 | var q4 = Quaternion.Euler(new Vector3(0, 180f, 0)); 76 | planes[4].transform = Matrix4x4.TRS(new Vector3(Size.x, 0, -Size.z), q4, one); 77 | 78 | planes[5].mesh = left; 79 | var q5 = Quaternion.Euler(new Vector3(0, 0, 0)); 80 | planes[5].transform = Matrix4x4.TRS(new Vector3(0, 0, 0), q5, one); 81 | 82 | var box = new Mesh(); 83 | box.CombineMeshes(planes); 84 | 85 | return box; 86 | } 87 | 88 | private static Mesh CreatePlane(Vector3[] coord, Vector2 size, int division, Vector3 offset, Vector3 normal) 89 | { 90 | Vector2 Step = size / division; 91 | 92 | var vertices = new Vector3[(division + 1) * (division + 1)]; 93 | var uvs = new Vector2[vertices.Length]; 94 | var normals = new Vector3[vertices.Length]; 95 | var triangles = new int[division * division * 2 * 3]; 96 | 97 | int tIndex = 0; 98 | for(int dy = 0; dy <= division; dy++) { 99 | for(int dx = 0; dx <= division; dx++) { 100 | float sx = dx * Step.x; 101 | float sy = dy * Step.y; 102 | int vIndex = dy * (division + 1) + dx; 103 | Vector3 vert = sx * coord[0] + sy * coord[1]; 104 | vertices[vIndex] = vert + offset; 105 | normals[vIndex] = normal; 106 | uvs[vIndex] = new Vector2( sx / size.x, sy / size.y ); 107 | 108 | if(dx == division || dy == division) { 109 | continue; 110 | } 111 | 112 | triangles[tIndex++] = vIndex; 113 | triangles[tIndex++] = vIndex + division + 1; 114 | triangles[tIndex++] = vIndex + division + 2; 115 | 116 | triangles[tIndex++] = vIndex; 117 | triangles[tIndex++] = vIndex + division + 2; 118 | triangles[tIndex++] = vIndex + 1; 119 | 120 | } 121 | } 122 | 123 | var mesh = new Mesh(); 124 | mesh.name = "Box"; 125 | mesh.vertices = vertices; 126 | mesh.normals = normals; 127 | mesh.triangles = triangles; 128 | mesh.uv = uvs; 129 | 130 | mesh.RecalculateTangents(); 131 | mesh.Optimize(); 132 | 133 | return mesh; 134 | } 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Box/BoxBuilder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 738d1f38704f145cbb0ed7940f9cacd2 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Capsule.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9287d76d9caba4dd5bb3fff9b197d536 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Capsule/Capsule.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using PrimitiveCommon; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | [RequireComponent(typeof(MeshRenderer))] 7 | [RequireComponent(typeof(MeshFilter))] 8 | public class Capsule : PrimitiveBase 9 | { 10 | [SerializeField, Range(Const.MIN_SCALE, Const.MAX_SCALE)] float _radius = 0.5f; 11 | [SerializeField, Range(Const.MIN_SCALE, Const.MAX_SCALE)] float _height = 1f; 12 | [SerializeField, Range(2, 50)] int _latitudes = 16; 13 | [SerializeField, Range(3, 50)] int _longitudes = 32; 14 | [SerializeField, Range(0, 20)] int _rings = 2; 15 | [SerializeField] Material _material; 16 | [SerializeField] MeshFilter _filter; 17 | [SerializeField] MeshRenderer _renderer; 18 | 19 | private Mesh _mesh; 20 | 21 | public void Generate(float radius, float height, int lats, int lons, int rings, Material material = null) 22 | { 23 | CreateMesh(radius, height, lats, lons, rings); 24 | UpdateMesh(); 25 | if(material != null) { 26 | SetMaterial(material, _renderer); 27 | } 28 | } 29 | 30 | private void CreateMesh(float radius, float height, int lats, int lons, int rings) 31 | { 32 | _mesh = CapsuleBuilder.Build(height, radius, lats, lons, rings); 33 | } 34 | 35 | private void UpdateMesh() 36 | { 37 | if (!_filter?.sharedMesh) 38 | { 39 | _filter.sharedMesh = new Mesh(); 40 | } 41 | 42 | _filter.sharedMesh.Clear(); 43 | _filter.sharedMesh = _mesh; 44 | } 45 | 46 | private void OnDestroy() 47 | { 48 | var mat = _renderer.material; 49 | if (mat != null) 50 | { 51 | Destroy(mat); 52 | } 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Capsule/Capsule.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 605918de6b0d94f65853daf409d38399 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Capsule/CapsuleBuilder.cs: -------------------------------------------------------------------------------- 1 | // ref: https://behreajj.medium.com/making-a-capsule-mesh-via-script-in-five-3d-environments-c2214abf02db 2 | using UnityEngine; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | public class CapsuleBuilder 7 | { 8 | public static Mesh Build(float height, float radius, int latitudes, int longitudes, int rings) 9 | { 10 | latitudes = latitudes % 2 != 0 ? latitudes + 1 : latitudes; 11 | 12 | int halfLats = latitudes / 2; 13 | 14 | // vertext index offsets 15 | int vOffsetNorthHemi = longitudes; 16 | int vOffsetNorthEquator = vOffsetNorthHemi + (longitudes + 1) * (halfLats - 1); 17 | int vOffsetCylinder = vOffsetNorthEquator + (longitudes + 1); 18 | int vOffsetSouthEquator = (rings > 0) ? 19 | vOffsetCylinder + (longitudes + 1) * rings : 20 | vOffsetCylinder; 21 | int vOffsetSouthHemi = vOffsetSouthEquator + (longitudes + 1); 22 | int vOffsetSouthPolar = vOffsetSouthHemi + (longitudes + 1) * (halfLats - 2); 23 | int vOffsetSouthCap = vOffsetSouthPolar + (longitudes + 1); 24 | 25 | int vCount = vOffsetSouthCap + longitudes; 26 | var vertices = new Vector3[vCount]; 27 | var uvs = new Vector2[vCount]; 28 | var normals = new Vector3[vCount]; 29 | 30 | float toTheta = 2f * Mathf.PI / longitudes; 31 | float toPhi = Mathf.PI / latitudes; 32 | float toTexHorizontal = 1f / longitudes; 33 | float toTexVertical = 1f / halfLats; 34 | 35 | float vtAspectRatio = 1f / 3f; 36 | float vtAspectNorth = 1f - vtAspectRatio; 37 | float vtAspectSouth = vtAspectRatio; 38 | 39 | var thetaCartesian = new Vector2[longitudes]; 40 | var rhoThetaCartesian = new Vector2[longitudes]; 41 | var sTexCache = new float[longitudes + 1]; 42 | 43 | // Polar vertices 44 | for (int lon = 0; lon < longitudes; ++lon) 45 | { 46 | float lf = lon; 47 | float sTexPolar = 1f - ((lf + .5f) * toTexHorizontal); 48 | float cosTheta = Mathf.Cos (lf * toTheta); 49 | float sinTheta = Mathf.Sin (lf * toTheta); 50 | 51 | thetaCartesian[lon] = new Vector2(cosTheta, sinTheta); 52 | rhoThetaCartesian[lon] = radius * new Vector2(cosTheta, sinTheta); 53 | 54 | // North 55 | vertices[lon] = new Vector3(0f, height/2f + radius, 0f); 56 | uvs[lon] = new Vector2(sTexPolar, 1f); 57 | normals[lon] = new Vector3(0f, 1f, 0f); 58 | 59 | // South 60 | int i = vOffsetSouthCap + lon; 61 | vertices[i] = new Vector3(0f, -(height/2f + radius), 0f); 62 | uvs[i] = new Vector2(sTexPolar, 0f); 63 | normals[i] = new Vector3(0f, -1f, 0f); 64 | } 65 | 66 | // Equatorial vertices 67 | for (int lon = 0; lon <= longitudes; ++lon) 68 | { 69 | float sTex = 1f - lon * toTexHorizontal; 70 | sTexCache[lon] = sTex; 71 | 72 | int ll = lon % longitudes; 73 | Vector2 tc = thetaCartesian[ll]; 74 | Vector2 rtc = rhoThetaCartesian[ll]; 75 | 76 | // North equator 77 | int idxn = vOffsetNorthEquator + lon; 78 | vertices[idxn] = new Vector3(rtc.x, height/2f, -rtc.y); 79 | uvs[idxn] = new Vector2(sTex, vtAspectNorth); 80 | normals[idxn] = new Vector3(tc.x, 0f, -tc.y); 81 | 82 | // South equator 83 | int idxs = vOffsetSouthEquator + lon; 84 | vertices[idxs] = new Vector3(rtc.x, -height/2f, -rtc.y); 85 | uvs[idxs] = new Vector2(sTex, vtAspectSouth); 86 | normals[idxs] = new Vector3(tc.x, 0f, -tc.y); 87 | } 88 | 89 | // Hemisphere vertices 90 | for (int lat = 0; lat < halfLats-1; ++lat) 91 | { 92 | float phi = (lat + 1f) * toPhi; 93 | float cosPhiSouth = Mathf.Cos(phi); 94 | float sinPhiSouth = Mathf.Sin(phi); 95 | float cosPhiNorth = sinPhiSouth; 96 | float sinPhiNorth = -cosPhiSouth; 97 | 98 | float rhoCosPhiNorth = radius * cosPhiNorth; 99 | float rhoSinPhiNorth = radius * sinPhiNorth; 100 | float zOffsetNorth = height / 2f - rhoSinPhiNorth; 101 | float rhoCosPhiSouth = radius * cosPhiSouth; 102 | float rhoSinPhiSouth = radius * sinPhiSouth; 103 | float zOffsetSouth = - height / 2f - rhoSinPhiSouth; 104 | 105 | float tTexFac = (lat + 1f) * toTexVertical; 106 | float cmplTexFac = 1f - tTexFac; 107 | float tTexNorth = cmplTexFac + vtAspectNorth * tTexFac; 108 | float tTexSouth = cmplTexFac * vtAspectSouth; 109 | 110 | int vCurrentLatNorth = vOffsetNorthHemi + (lat * (longitudes + 1)); 111 | int vCurrentLatSouth = vOffsetSouthHemi + (lat * (longitudes + 1)); 112 | 113 | for (int lon = 0; lon <= longitudes; ++lon) 114 | { 115 | float sTex = sTexCache[lon]; 116 | Vector2 tc = thetaCartesian[lon % longitudes]; 117 | 118 | // North hemisphere 119 | int idxn = vCurrentLatNorth + lon; 120 | vertices[idxn] = new Vector3 ( 121 | rhoCosPhiNorth * tc.x, 122 | zOffsetNorth, 123 | -rhoCosPhiNorth * tc.y 124 | ); 125 | uvs[idxn] = new Vector2 (sTex, tTexNorth); 126 | normals[idxn] = new Vector3 ( 127 | cosPhiNorth * tc.x, 128 | -sinPhiNorth, 129 | -cosPhiNorth * tc.y 130 | ); 131 | 132 | // South hemisphere 133 | int idxs = vCurrentLatSouth + lon; 134 | vertices[idxs] = new Vector3 ( 135 | rhoCosPhiSouth * tc.x, 136 | zOffsetSouth, 137 | -rhoCosPhiSouth * tc.y 138 | ); 139 | uvs[idxs] = new Vector2 (sTex, tTexSouth); 140 | normals[idxs] = new Vector3 ( 141 | cosPhiSouth * tc.x, 142 | -sinPhiSouth, 143 | -cosPhiSouth * tc.y 144 | ); 145 | } 146 | } 147 | 148 | // Cylinder vertices 149 | if(rings > 0) { 150 | float toFac = 1f / (rings + 1); 151 | int index = vOffsetCylinder; 152 | 153 | for (int h = 1; h <= rings; ++h) { 154 | float fac = h * toFac; 155 | float cmplFac = 1f - fac; 156 | float tTex = cmplFac * vtAspectNorth + fac * vtAspectSouth; 157 | float z = (height / 2f) - height * fac; 158 | 159 | for(int lon = 0; lon <= longitudes; ++lon) 160 | { 161 | var tc = thetaCartesian[lon % longitudes]; 162 | var rtc = rhoThetaCartesian[lon % longitudes]; 163 | float sTex = sTexCache[lon]; 164 | 165 | vertices[index] = new Vector3(rtc.x, z, -rtc.y); 166 | uvs[index] = new Vector2(sTex, tTex); 167 | normals[index] = new Vector3(tc.x, 0f, -tc.y); 168 | ++index; 169 | } 170 | } 171 | } 172 | 173 | // Triangle indices 174 | int long3 = longitudes * 3; 175 | int long6 = longitudes * 6; 176 | int hemiLong = (halfLats - 1) * long6; 177 | 178 | int tOffsetNorthHemi = long3; 179 | int tOffsetCylinder = tOffsetNorthHemi + hemiLong; 180 | int tOffsetSouthHemi = tOffsetCylinder + (rings + 1) * long6; 181 | int tOffsetSouthCap = tOffsetSouthHemi + hemiLong; 182 | 183 | int triCount = tOffsetSouthCap + long3; 184 | var triangles = new int[triCount]; 185 | 186 | // Polar caps 187 | for (int i = 0, k = 0, m = tOffsetSouthCap; i < longitudes; ++i, k += 3, m += 3) 188 | { 189 | // North 190 | triangles[k] = i; 191 | triangles[k + 1] = vOffsetNorthHemi + i; 192 | triangles[k + 2] = vOffsetNorthHemi + i + 1; 193 | // South 194 | triangles[m] = vOffsetSouthCap + i; 195 | triangles[m + 1] = vOffsetSouthPolar + i + 1; 196 | triangles[m + 2] = vOffsetSouthPolar + i; 197 | } 198 | 199 | // Hemispheres 200 | for (int i = 0, k = tOffsetNorthHemi, m = tOffsetSouthHemi; i < (halfLats - 1); ++i) 201 | { 202 | int vCurrentLatNorth = vOffsetNorthHemi + (i * (longitudes + 1)); 203 | int vNextLatNorth = vCurrentLatNorth + (longitudes + 1); 204 | int vCurrentLatSouth = vOffsetSouthEquator + (i * (longitudes + 1)); 205 | int vNextLatSouth = vCurrentLatSouth + (longitudes + 1); 206 | 207 | for (int j = 0; j < longitudes; ++j, k += 6, m += 6) 208 | { 209 | // North 210 | int n00 = vCurrentLatNorth + j; 211 | int n01 = vNextLatNorth + j; 212 | int n11 = vNextLatNorth + j + 1; 213 | int n10 = vCurrentLatNorth + j + 1; 214 | 215 | triangles[k] = n00; 216 | triangles[k + 1] = n11; 217 | triangles[k + 2] = n10; 218 | 219 | triangles[k + 3] = n00; 220 | triangles[k + 4] = n01; 221 | triangles[k + 5] = n11; 222 | 223 | // South 224 | int s00 = vCurrentLatSouth + j; 225 | int s01 = vNextLatSouth + j; 226 | int s11 = vNextLatSouth + j + 1; 227 | int s10 = vCurrentLatSouth + j + 1; 228 | 229 | triangles[m] = s00; 230 | triangles[m + 1] = s11; 231 | triangles[m + 2] = s10; 232 | 233 | triangles[m + 3] = s00; 234 | triangles[m + 4] = s01; 235 | triangles[m + 5] = s11; 236 | } 237 | } 238 | 239 | // Cylinder 240 | for (int i = 0, k = tOffsetCylinder; i <= rings; ++i) 241 | { 242 | int vCurrentLat = vOffsetNorthEquator + i * (longitudes + 1); 243 | int vNextLat = vCurrentLat + (longitudes + 1); 244 | 245 | for (int j = 0; j < longitudes; ++j, k += 6) 246 | { 247 | int cy00 = vCurrentLat + j; 248 | int cy01 = vNextLat + j; 249 | int cy11 = vNextLat + j + 1; 250 | int cy10 = vCurrentLat + j + 1; 251 | 252 | triangles[k] = cy00; 253 | triangles[k + 1] = cy11; 254 | triangles[k + 2] = cy10; 255 | triangles[k + 3] = cy00; 256 | triangles[k + 4] = cy01; 257 | triangles[k + 5] = cy11; 258 | } 259 | } 260 | 261 | Mesh mesh = new Mesh(); 262 | mesh.name = "Capsule"; 263 | mesh.vertices = vertices; 264 | mesh.uv = uvs; 265 | mesh.normals = normals; 266 | mesh.triangles = triangles; 267 | 268 | mesh.Optimize(); 269 | mesh.RecalculateTangents(); 270 | 271 | return mesh; 272 | } 273 | } 274 | } 275 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Capsule/CapsuleBuilder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7dbb9e60dfe024d39a450db4fa1deccb 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Cylinder.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8328ae72fea9a456a9398b47f38ac5c5 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Cylinder/Cylinder.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using PrimitiveCommon; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | [RequireComponent(typeof(MeshRenderer))] 7 | [RequireComponent(typeof(MeshFilter))] 8 | public class Cylinder : PrimitiveBase 9 | { 10 | [SerializeField, Range(Const.MIN_SCALE, Const.MAX_SCALE)] float _topRadius = 0.5f; 11 | [SerializeField, Range(Const.MIN_SCALE, Const.MAX_SCALE)] float _bottomRadius = 0.5f; 12 | [SerializeField, Range(3, 50)] int _radialSegments = 24; 13 | [SerializeField, Range(3, 50)] int _heightSegments = 24; 14 | [SerializeField, Range(1f, 50f)] float _height = 1f; 15 | [SerializeField] bool _endCap = true; 16 | [SerializeField] MeshFilter _filter; 17 | [SerializeField] MeshRenderer _renderer; 18 | [SerializeField] Material _material; 19 | private Mesh _mesh; 20 | 21 | public void Generate(int radialSegments, int heightSegments, float topRadius, float bottomRadius, float height, Material material = null, bool endCap = true) 22 | { 23 | CreateMesh(radialSegments, heightSegments, topRadius, bottomRadius, height, endCap); 24 | UpdateMesh(); 25 | if(material != null) { 26 | SetMaterial(material, _renderer); 27 | } 28 | } 29 | 30 | private void CreateMesh(int radialSegments, int heightSegments, float topRadius, float bottomRadius, float height, bool endCap) 31 | { 32 | _mesh = CylinderBuilder.Build(radialSegments, heightSegments, topRadius, bottomRadius, height, 1f, endCap); 33 | } 34 | private void UpdateMesh() 35 | { 36 | if (!_filter.sharedMesh) 37 | { 38 | _filter.sharedMesh = new Mesh(); 39 | } 40 | 41 | _filter.sharedMesh.Clear(); 42 | _filter.sharedMesh = _mesh; 43 | } 44 | 45 | private void OnDestroy() 46 | { 47 | var mat = _renderer.material; 48 | if (mat != null) 49 | { 50 | Destroy(mat); 51 | } 52 | } 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Cylinder/Cylinder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cfdf7990b08bc4406b6a536501f2a4cc 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Cylinder/CylinderBuilder.cs: -------------------------------------------------------------------------------- 1 | // ref: https://github.com/doukasd/Unity-Components/blob/master/ProceduralCylinder/Assets/Scripts/Procedural/ProceduralCylinder.cs 2 | using UnityEngine; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | public class CylinderBuilder 7 | { 8 | private const int MIN_RADIAL_SEGMENTS = 1; 9 | private const int MIN_HEIGHT_SEGMENTS = 3; 10 | public static Mesh Build( 11 | int radialSegments, int heightSegments, 12 | float topRadius, float bottomRadius, 13 | float height, float scale, bool endCap) 14 | { 15 | if (radialSegments < MIN_RADIAL_SEGMENTS) radialSegments = MIN_RADIAL_SEGMENTS; 16 | if (heightSegments < MIN_HEIGHT_SEGMENTS) heightSegments = MIN_HEIGHT_SEGMENTS; 17 | 18 | topRadius *= scale; 19 | bottomRadius *= scale; 20 | height *= scale; 21 | 22 | // how many vertices we need 23 | int vertCols = radialSegments + 1; // +1 for welding 24 | int vertRows = heightSegments + 1; 25 | int numVerts = vertCols * vertRows; 26 | int numUVs = numVerts; 27 | int numSlideTris = radialSegments * heightSegments * 2; 28 | int numCapTris = radialSegments - 2; 29 | // 3 places in the array for each tri 30 | int trisArrayLength = endCap ? (numSlideTris + numCapTris * 2) * 3 : numSlideTris * 2 * 3; 31 | 32 | Vector3[] vertices = new Vector3[numVerts]; 33 | Vector2[] uvs = new Vector2[numUVs]; 34 | int[] triangles = new int[trisArrayLength]; 35 | 36 | float heightStep = height / heightSegments; 37 | float angleStep = 2 * Mathf.PI / radialSegments; 38 | float uvStepH = 1.0f / radialSegments; 39 | float uvStepV = 1.0f / heightSegments; 40 | 41 | // A. draw tube 42 | for (int row = 0; row < vertRows; row++) 43 | { 44 | for (int col = 0; col < vertCols; col++) 45 | { 46 | float angle = col * angleStep; 47 | 48 | float ratio = (float)(row) / vertRows; 49 | float radius = mix(topRadius, bottomRadius, ratio); 50 | 51 | // first and last vertex of each row at same spot 52 | if (col == vertCols - 1) 53 | { 54 | angle = 0; 55 | } 56 | 57 | int index = row * vertCols + col; 58 | // pos curent vertex 59 | vertices[index] = new Vector3( 60 | radius * Mathf.Cos(angle), 61 | row * heightStep - height/2, 62 | radius * Mathf.Sin(angle) 63 | ); 64 | 65 | uvs[index] = new Vector2( 66 | col * uvStepH, row * uvStepV 67 | ); 68 | 69 | 70 | if (row == 0 || col >= vertCols - 1) 71 | { 72 | continue; 73 | } 74 | 75 | int index2 = ((row - 1) * radialSegments * 6 + col * 6); 76 | 77 | if(endCap) { 78 | index2 += numCapTris * 3; 79 | } 80 | 81 | triangles[index2 + 0] = row * vertCols + col; 82 | triangles[index2 + 1] = row * vertCols + col + 1; 83 | triangles[index2 + 2] = (row - 1) * vertCols + col; 84 | 85 | triangles[index2 + 3] = (row - 1) * vertCols + col; 86 | triangles[index2 + 4] = row * vertCols + col + 1; 87 | triangles[index2 + 5] = (row - 1) * vertCols + col + 1; 88 | } 89 | } 90 | 91 | // B. draw caps 92 | if(endCap) 93 | { 94 | bool isLeftSide = true; 95 | int leftIndex = 0; 96 | int rightIndex = 0; 97 | int middleIndex = 0; 98 | int topCapVertexOffset = numVerts - vertCols; 99 | 100 | for (int n = 0; n < numCapTris; n++) 101 | { 102 | int bottomCapBaseIndex = n * 3; 103 | int topCapBaseIndex = (numCapTris + numSlideTris + n) * 3; 104 | 105 | if (n == 0) 106 | { 107 | middleIndex = 0; 108 | leftIndex = 1; 109 | rightIndex = vertCols - 2; 110 | isLeftSide = true; 111 | } 112 | else if (isLeftSide) 113 | { 114 | middleIndex = rightIndex; 115 | rightIndex--; 116 | } 117 | else 118 | { 119 | middleIndex = leftIndex; 120 | leftIndex++; 121 | } 122 | 123 | isLeftSide = !isLeftSide; 124 | 125 | // assign bottom tris 126 | triangles[bottomCapBaseIndex + 0] = rightIndex; 127 | triangles[bottomCapBaseIndex + 1] = middleIndex; 128 | triangles[bottomCapBaseIndex + 2] = leftIndex; 129 | // assign top tris 130 | triangles[topCapBaseIndex + 0] = topCapVertexOffset + leftIndex; 131 | triangles[topCapBaseIndex + 1] = topCapVertexOffset + middleIndex; 132 | triangles[topCapBaseIndex + 2] = topCapVertexOffset + rightIndex; 133 | } 134 | } 135 | // else 136 | // { 137 | // for (int row = 0; row < vertRows; row++) 138 | // { 139 | // for (int col = 0; col < vertCols; col++) 140 | // { 141 | // if (row == 0 || col >= vertCols - 1) 142 | // { 143 | // continue; 144 | // } 145 | 146 | // int index = ((row - 1) * radialSegments * 6 + col * 6) + (trisArrayLength/2); 147 | 148 | // triangles[index + 0] = row * vertCols + col; 149 | // triangles[index + 1] = (row - 1) * vertCols + col; 150 | // triangles[index + 2] = row * vertCols + col + 1; 151 | 152 | // triangles[index + 3] = (row - 1) * vertCols + col; 153 | // triangles[index + 4] = (row - 1) * vertCols + col + 1; 154 | // triangles[index + 5] = row * vertCols + col + 1; 155 | // } 156 | // } 157 | // } 158 | 159 | Mesh mesh = new Mesh(); 160 | mesh.name = "Cylinder"; 161 | mesh.vertices = vertices; 162 | mesh.uv = uvs; 163 | mesh.triangles = triangles; 164 | 165 | mesh.RecalculateNormals(); 166 | mesh.RecalculateBounds(); 167 | 168 | return mesh; 169 | } 170 | 171 | private static float mix(float x, float y, float a) 172 | { 173 | return x * (1f - a) + y * a; 174 | } 175 | } 176 | } 177 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Cylinder/CylinderBuilder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b355a9fba411745b5bbdad483a64c47d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Datas.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 37ccb6c19c93a45478795dbb40237b5b 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Datas/MeshData.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class MeshData { 6 | public Vector3[] Vertices { private set; get; } 7 | public int[] Triangles { private set; get; } 8 | public Vector2[] Uv { private set; get; } 9 | public Vector3[] Normals {private set; get; } 10 | public MeshData(Vector3[] vertices, int[] triangles, Vector2[] uv, Vector3[] normals) { 11 | Vertices = vertices; 12 | Triangles = triangles; 13 | Uv = uv; 14 | Normals = normals; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Datas/MeshData.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bd30d969234744428a5a7bedf81687db 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Datas/SolidType.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public enum SolidType 6 | { 7 | Tetrahedron, // 正四面体 8 | Octahedron, // 正八面体 9 | Dodecahedron, // 正十二面体 10 | Icosahedron // 正二十面体 11 | } 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Datas/SolidType.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 26f59a1a74711493d8204525c0ecc4fe 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Datas/TriangleFace.cs: -------------------------------------------------------------------------------- 1 | public class TriangleFace 2 | { 3 | public int v1 {set; get;} 4 | public int v2 {set; get;} 5 | public int v3 {set; get;} 6 | 7 | public TriangleFace(int v1, int v2, int v3) { 8 | this.v1 = v1; 9 | this.v2 = v2; 10 | this.v3 = v3; 11 | } 12 | 13 | public void SetV1(int newV1) { v1 = newV1;} 14 | public void SetV2(int newV2) { v2 = newV2;} 15 | public void SetV3(int newV3) { v3 = newV3;} 16 | } 17 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Datas/TriangleFace.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7ec23501d4a0e4ac2a3eb5216b109bd7 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Grid.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6e4bdd4599ad04a849e9875902a8ea4b 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Grid/Grid.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using PrimitiveCommon; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | [RequireComponent(typeof(MeshRenderer))] 7 | [RequireComponent(typeof(MeshFilter))] 8 | public class Grid : PrimitiveBase 9 | { 10 | [SerializeField, Range(Const.MIN_SCALE, Const.MAX_SCALE)] float _width = 1f; 11 | [SerializeField, Range(Const.MIN_SCALE, Const.MAX_SCALE)] float _height = 1f; 12 | [SerializeField, Range(0, 60)] int _divisionX = 15; 13 | [SerializeField, Range(0, 60)] int _divisionY = 15; 14 | [SerializeField] bool _isBackVisible = true; 15 | [SerializeField] MeshFilter _filter; 16 | [SerializeField] MeshRenderer _renderer; 17 | [SerializeField] Material _material; 18 | 19 | private Mesh _mesh; 20 | 21 | public void Generate(float width, float height, int divX, int divY, Material material = null) 22 | { 23 | CreateMesh(width, height, divX, divY); 24 | UpdateMesh(); 25 | if(material != null) { 26 | SetMaterial(material, _renderer); 27 | } 28 | } 29 | 30 | private void CreateMesh(float width, float height,int divX, int divY) 31 | { 32 | Vector2 division = new Vector2(divX, divY); 33 | _mesh = GridBuilder.Build(width, height, division, _isBackVisible); 34 | } 35 | 36 | private void UpdateMesh() 37 | { 38 | if (!_filter.sharedMesh) 39 | { 40 | _filter.sharedMesh = new Mesh(); 41 | } 42 | 43 | _filter.sharedMesh.Clear(); 44 | _filter.sharedMesh = _mesh; 45 | } 46 | 47 | private void OnDestroy() 48 | { 49 | var mat = _renderer.material; 50 | if (mat != null) 51 | { 52 | Destroy(mat); 53 | } 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Grid/Grid.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3cb1ee165e8e94ff9ada82a323a9913b 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Grid/GridBuilder.cs: -------------------------------------------------------------------------------- 1 | // ref: https://github.com/sanukin39/UniPlaneMeshGenerator/blob/main/Assets/UniPlaneMeshGenerator/Runtime/PlaneMeshGenerator.cs 2 | 3 | using UnityEngine; 4 | 5 | namespace PrimitiveGenerator 6 | { 7 | public class GridBuilder 8 | { 9 | public static Mesh Build(float width, float height, Vector2 division, bool isBackVisible) 10 | { 11 | // UIで分割なしを0としているため 12 | division += new Vector2(1f, 1f); 13 | 14 | Vector2 size = new Vector2(width, height); 15 | int divx = (int)division.x; 16 | int divy = (int)division.y; 17 | 18 | Vector2 step = size / division; 19 | Vector3 offset = new Vector3(size.x / 2f, 0, size.y / 2f); 20 | 21 | int vCount = (divx + 1) * (divy + 1); 22 | var vertices = new Vector3[vCount]; 23 | var uvs = new Vector2[vCount]; 24 | int tCount = (divx * divy) * 2 * 3; 25 | if(isBackVisible) 26 | { 27 | tCount *= 2; 28 | } 29 | var triangles = new int[tCount]; 30 | 31 | int tIndex = 0; 32 | for(int dy = 0; dy <= divy; dy++) { 33 | for(int dx = 0; dx <= divx; dx++) { 34 | float sx = dx * step.x; 35 | float sy = dy * step.y; 36 | int vIndex = dy * (divx + 1) + dx; 37 | var pos = Vector3.right * sx + Vector3.forward * sy; 38 | vertices[vIndex] = pos - offset; 39 | uvs[vIndex] = new Vector2( sx / size.x, sy / size.y ); 40 | 41 | if(dx == divx || dy == divy) { 42 | continue; 43 | } 44 | 45 | int backFaceOffset = tCount / 2; 46 | 47 | int tIndexP1 = tIndex + 1; 48 | int tIndexP2 = tIndex + 2; 49 | int tIndexP3 = tIndex + 3; 50 | int tIndexP4 = tIndex + 4; 51 | int tIndexP5 = tIndex + 5; 52 | 53 | triangles[tIndex] = vIndex; 54 | triangles[tIndexP1] = vIndex + divx + 1; 55 | triangles[tIndexP2] = vIndex + divx + 2; 56 | 57 | triangles[tIndexP3] = vIndex; 58 | triangles[tIndexP4] = vIndex + divx + 2; 59 | triangles[tIndexP5] = vIndex + 1; 60 | 61 | tIndex += 6; 62 | } 63 | } 64 | 65 | Mesh mesh = new Mesh(); 66 | mesh.name = "Grid"; 67 | mesh.vertices = vertices; 68 | mesh.triangles = triangles; 69 | mesh.uv = uvs; 70 | 71 | mesh.RecalculateNormals(); 72 | mesh.RecalculateTangents(); 73 | mesh.Optimize(); 74 | 75 | return mesh; 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Grid/GridBuilder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 92adf65b5388f40c99aeb0777fae2e82 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a13b65988c4ba4d06b365736f01fff8c 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron/Platonics.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3205f9e20f9db4cd989ef23de0ee3a80 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron/Platonics/Dodecahedron.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | public class Dodecahedron : IPlatonicSolid 7 | { 8 | public List Vertices { private set; get; } 9 | public List Faces { private set; get; } 10 | public Vector3 NorthPole { private set; get; } 11 | public Dodecahedron() 12 | { 13 | float t = (1f + Mathf.Sqrt(5f)) / 2f; 14 | List vertices = new List(); 15 | // center cube coordinates 16 | vertices.Add(new Vector3(1f, 1f, 1f)); //0 17 | vertices.Add(new Vector3(-1f, -1f, -1f)); //1 18 | vertices.Add(new Vector3(-1f, 1f, 1f)); //2 19 | vertices.Add(new Vector3(1f, -1f, 1f)); //3 20 | vertices.Add(new Vector3(1f, 1f, -1f)); //4 21 | vertices.Add(new Vector3(1f, -1f, -1f)); //5 22 | vertices.Add(new Vector3(-1f, 1f, -1f)); //6 23 | vertices.Add(new Vector3(-1f, -1f, 1f)); //7 24 | // yz plane coordinates 25 | vertices.Add(new Vector3(0f, 1f / t, t)); //8 26 | vertices.Add(new Vector3(0f, 1f / t, -t)); //9 27 | vertices.Add(new Vector3(0f, -1f / t, t)); //10 28 | vertices.Add(new Vector3(0f, -1f / t, -t)); //11 29 | // xy plnae coordinates 30 | vertices.Add(new Vector3(1f / t, t, 0f)); //12 31 | vertices.Add(new Vector3(-1f / t, t, 0f)); //13 32 | vertices.Add(new Vector3(1f / t, -t, 0f)); //14 33 | vertices.Add(new Vector3(-1f / t, -t, 0f)); //15 34 | // xz planet coordinates 35 | vertices.Add(new Vector3(t, 0f, 1f / t)); //16 36 | vertices.Add(new Vector3(-t, 0f, 1f / t)); //17 37 | vertices.Add(new Vector3(t, 0f, -1f / t)); //18 38 | vertices.Add(new Vector3(-t, 0f, -1f / t)); //19 39 | 40 | //vertex at the center of each face 41 | Vector3 centerFace1 = (vertices[12] + vertices[4] + vertices[9] + vertices[6] + vertices[13]) / 5f; 42 | Vector3 centerFace2 = (vertices[12] + vertices[13] + vertices[2] + vertices[8] + vertices[0]) / 5f; 43 | Vector3 centerFace3 = (vertices[12] + vertices[0] + vertices[16] + vertices[18] + vertices[4]) / 5f; 44 | Vector3 centerFace4 = (vertices[9] + vertices[4] + vertices[18] + vertices[5] + vertices[11]) / 5f; 45 | Vector3 centerFace5 = (vertices[6] + vertices[9] + vertices[11] + vertices[1] + vertices[19]) / 5f; 46 | Vector3 centerFace6 = (vertices[13] + vertices[6] + vertices[19] + vertices[17] + vertices[2]) / 5f; 47 | 48 | Vector3 centerFace7 = (vertices[17] + vertices[19] + vertices[1] + vertices[15] + vertices[7]) / 5f; 49 | Vector3 centerFace8 = (vertices[14] + vertices[15] + vertices[1] + vertices[11] + vertices[5]) / 5f; 50 | Vector3 centerFace9 = (vertices[14] + vertices[5] + vertices[18] + vertices[16] + vertices[3]) / 5f; 51 | Vector3 centerFace10 = (vertices[3] + vertices[16] + vertices[0] + vertices[8] + vertices[10]) / 5f; 52 | Vector3 centerFace11 = (vertices[10] + vertices[8] + vertices[2] + vertices[17] + vertices[7]) / 5f; 53 | Vector3 centerFace12 = (vertices[15] + vertices[14] + vertices[3] + vertices[10] + vertices[7]) / 5f; 54 | 55 | vertices.Add(centerFace1); //20 56 | vertices.Add(centerFace2); //21 57 | vertices.Add(centerFace3); //22 58 | vertices.Add(centerFace4); //23 59 | vertices.Add(centerFace5); //24 60 | vertices.Add(centerFace6); //25 61 | vertices.Add(centerFace7); //26 62 | vertices.Add(centerFace8); //27 63 | vertices.Add(centerFace9); //28 64 | vertices.Add(centerFace10); //29 65 | vertices.Add(centerFace11); //30 66 | vertices.Add(centerFace12); //31 67 | 68 | List faces = new List(); 69 | // face 1 70 | faces.Add(new TriangleFace(20, 13, 12)); 71 | faces.Add(new TriangleFace(20, 12, 4)); 72 | faces.Add(new TriangleFace(20, 4, 9)); 73 | faces.Add(new TriangleFace(20, 9, 6)); 74 | faces.Add(new TriangleFace(20, 6, 13)); 75 | // face 2 76 | faces.Add(new TriangleFace(21, 13, 2)); 77 | faces.Add(new TriangleFace(21, 2, 8)); 78 | faces.Add(new TriangleFace(21, 8, 0)); 79 | faces.Add(new TriangleFace(21, 0, 12)); 80 | faces.Add(new TriangleFace(21, 12, 13)); 81 | // face 3 82 | faces.Add(new TriangleFace(22, 12, 0)); 83 | faces.Add(new TriangleFace(22, 0, 16)); 84 | faces.Add(new TriangleFace(22, 16, 18)); 85 | faces.Add(new TriangleFace(22, 18, 4)); 86 | faces.Add(new TriangleFace(22, 4, 12)); 87 | // face 4 88 | faces.Add(new TriangleFace(23, 4, 18)); 89 | faces.Add(new TriangleFace(23, 18, 5)); 90 | faces.Add(new TriangleFace(23, 5, 11)); 91 | faces.Add(new TriangleFace(23, 11, 9)); 92 | faces.Add(new TriangleFace(23, 9, 4)); 93 | // face 5 94 | faces.Add(new TriangleFace(24, 9, 11)); 95 | faces.Add(new TriangleFace(24, 11, 1)); 96 | faces.Add(new TriangleFace(24, 1, 19)); 97 | faces.Add(new TriangleFace(24, 19, 6)); 98 | faces.Add(new TriangleFace(24, 6, 9)); 99 | // face 6 100 | faces.Add(new TriangleFace(25, 6, 19)); 101 | faces.Add(new TriangleFace(25, 19, 17)); 102 | faces.Add(new TriangleFace(25, 17, 2)); 103 | faces.Add(new TriangleFace(25, 2, 13)); 104 | faces.Add(new TriangleFace(25, 13, 6)); 105 | // face 7 106 | faces.Add(new TriangleFace(26, 7, 17)); 107 | faces.Add(new TriangleFace(26, 17, 19)); 108 | faces.Add(new TriangleFace(26, 19, 1)); 109 | faces.Add(new TriangleFace(26, 1, 15)); 110 | faces.Add(new TriangleFace(26, 15, 7)); 111 | // face 8 112 | faces.Add(new TriangleFace(27, 15, 1)); 113 | faces.Add(new TriangleFace(27, 1, 11)); 114 | faces.Add(new TriangleFace(27, 11, 5)); 115 | faces.Add(new TriangleFace(27, 5, 14)); 116 | faces.Add(new TriangleFace(27, 14, 15)); 117 | // face 9 118 | faces.Add(new TriangleFace(28, 14, 5)); 119 | faces.Add(new TriangleFace(28, 5, 18)); 120 | faces.Add(new TriangleFace(28, 18, 16)); 121 | faces.Add(new TriangleFace(28, 16, 3)); 122 | faces.Add(new TriangleFace(28, 3, 14)); 123 | // face 10 124 | faces.Add(new TriangleFace(29, 3, 16)); 125 | faces.Add(new TriangleFace(29, 16, 0)); 126 | faces.Add(new TriangleFace(29, 0, 8)); 127 | faces.Add(new TriangleFace(29, 8, 10)); 128 | faces.Add(new TriangleFace(29, 10, 3)); 129 | // face 11 130 | faces.Add(new TriangleFace(30, 10, 8)); 131 | faces.Add(new TriangleFace(30, 8, 2)); 132 | faces.Add(new TriangleFace(30, 2, 17)); 133 | faces.Add(new TriangleFace(30, 17, 7)); 134 | faces.Add(new TriangleFace(30, 7, 10)); 135 | // face 12 136 | faces.Add(new TriangleFace(31, 15, 14)); 137 | faces.Add(new TriangleFace(31, 14, 3)); 138 | faces.Add(new TriangleFace(31, 3, 10)); 139 | faces.Add(new TriangleFace(31, 10, 7)); 140 | faces.Add(new TriangleFace(31, 7, 15)); 141 | 142 | NorthPole = Vector3.up; 143 | Vertices = vertices; 144 | Faces = faces; 145 | } 146 | } 147 | 148 | } 149 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron/Platonics/Dodecahedron.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c21e6107e7fd24a98a3d341b70eaff22 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron/Platonics/IPlatonicSolid.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | public interface IPlatonicSolid 7 | { 8 | List Vertices { get; } 9 | List Faces { get; } 10 | Vector3 NorthPole { get; } 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron/Platonics/IPlatonicSolid.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b701d3fe0c95042dbbf1aea4208969bf 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron/Platonics/Icosahedron.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | public class Icosahedron : IPlatonicSolid 7 | { 8 | public List Vertices { private set; get; } 9 | public List Faces { private set; get; } 10 | public Vector3 NorthPole { private set; get; } 11 | public Icosahedron() 12 | { 13 | float t = (1f + Mathf.Sqrt(5f)) / 2f; 14 | List vertices = new List(); 15 | vertices.Add(new Vector3(-1f, t, 0f)); 16 | vertices.Add(new Vector3(1f, t, 0f)); 17 | vertices.Add(new Vector3(-1f, -t, 0f)); 18 | vertices.Add(new Vector3(1f, -t, 0f)); 19 | 20 | vertices.Add(new Vector3(0f, -1f, t)); 21 | vertices.Add(new Vector3(0f, 1f, t)); 22 | vertices.Add(new Vector3(0f, -1f, -t)); 23 | vertices.Add(new Vector3(0f, 1f, -t)); 24 | 25 | vertices.Add(new Vector3(t, 0f, -1f)); 26 | vertices.Add(new Vector3(t, 0f, 1f)); 27 | vertices.Add(new Vector3(-t, 0f, -1f)); 28 | vertices.Add(new Vector3(-t, 0f, 1f)); 29 | 30 | List faces = new List(); 31 | // 5 faces around point 0 32 | faces.Add(new TriangleFace(0, 11, 5)); 33 | faces.Add(new TriangleFace(0, 5, 1)); 34 | faces.Add(new TriangleFace(0, 1, 7)); 35 | faces.Add(new TriangleFace(0, 7, 10)); 36 | faces.Add(new TriangleFace(0, 10, 11)); 37 | // 5 adjacent faces 38 | faces.Add(new TriangleFace(1, 5, 9)); 39 | faces.Add(new TriangleFace(5, 11, 4)); 40 | faces.Add(new TriangleFace(11, 10, 2)); 41 | faces.Add(new TriangleFace(10, 7, 6)); 42 | faces.Add(new TriangleFace(7, 1, 8)); 43 | // 5 faces around point 3 44 | faces.Add(new TriangleFace(3, 9, 4)); 45 | faces.Add(new TriangleFace(3, 4, 2)); 46 | faces.Add(new TriangleFace(3, 2, 6)); 47 | faces.Add(new TriangleFace(3, 6, 8)); 48 | faces.Add(new TriangleFace(3, 8, 9)); 49 | // 5 adjacent faces 50 | faces.Add(new TriangleFace(4, 9, 5)); 51 | faces.Add(new TriangleFace(2, 4, 11)); 52 | faces.Add(new TriangleFace(6, 2, 10)); 53 | faces.Add(new TriangleFace(8, 6, 7)); 54 | faces.Add(new TriangleFace(9, 8, 1)); 55 | 56 | NorthPole = new Vector3(0f, t, 0f); 57 | Vertices = vertices; 58 | Faces = faces; 59 | } 60 | } 61 | 62 | } 63 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron/Platonics/Icosahedron.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 44caf499214734d05ad34cf9a90bad03 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron/Platonics/Octahedron.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | public class Octahedron : IPlatonicSolid 7 | { 8 | public List Vertices { private set; get; } 9 | public List Faces { private set; get; } 10 | public Vector3 NorthPole { private set; get; } 11 | public Octahedron() 12 | { 13 | List vertices = new List(); 14 | vertices.Add(new Vector3(1f, 0f, 0f)); 15 | vertices.Add(new Vector3(-1f, 0f, 0f)); 16 | vertices.Add(new Vector3(0f, 1f, 0f)); 17 | vertices.Add(new Vector3(0f, -1f, 0f)); 18 | vertices.Add(new Vector3(0f, 0f, 1f)); 19 | vertices.Add(new Vector3(0f, 0f, -1f)); 20 | 21 | List faces = new List(); 22 | faces.Add(new TriangleFace(2, 0, 5)); 23 | faces.Add(new TriangleFace(2, 5, 1)); 24 | faces.Add(new TriangleFace(2, 1, 4)); 25 | faces.Add(new TriangleFace(2, 4, 0)); 26 | 27 | faces.Add(new TriangleFace(3, 5, 0)); 28 | faces.Add(new TriangleFace(3, 1, 5)); 29 | faces.Add(new TriangleFace(3, 4, 1)); 30 | faces.Add(new TriangleFace(3, 0, 4)); 31 | 32 | NorthPole = Vector3.up; 33 | Vertices = vertices; 34 | Faces = faces; 35 | } 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron/Platonics/Octahedron.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a4b3addd2b0ec49728f6d6c545ab98b3 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron/Platonics/Tetrahedron.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | public class Tetrahedron : IPlatonicSolid 7 | { 8 | public List Vertices { private set; get; } 9 | public List Faces { private set; get; } 10 | public Vector3 NorthPole { private set; get; } 11 | public Tetrahedron() 12 | { 13 | List vertices = new List(); 14 | vertices.Add(new Vector3(1f, 1f, 1f)); 15 | vertices.Add(new Vector3(1f, -1f, -1f)); 16 | vertices.Add(new Vector3(-1f, 1f, -1f)); 17 | vertices.Add(new Vector3(-1f, -1f, 1f)); 18 | 19 | List faces = new List(); 20 | faces.Add(new TriangleFace(0, 1, 2)); 21 | faces.Add(new TriangleFace(0, 2, 3)); 22 | faces.Add(new TriangleFace(1, 3, 2)); 23 | faces.Add(new TriangleFace(0, 3, 1)); 24 | 25 | NorthPole = Vector3.up; 26 | Vertices = vertices; 27 | Faces = faces; 28 | } 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron/Platonics/Tetrahedron.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 87fddff9be48540baa1dbdfcad837d23 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron/Polyhedron.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using PrimitiveCommon; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | [RequireComponent(typeof(MeshRenderer))] 7 | [RequireComponent(typeof(MeshFilter))] 8 | public class Polyhedron : PrimitiveBase 9 | { 10 | [SerializeField] SolidType _type = SolidType.Tetrahedron; 11 | [SerializeField, Range(Const.MIN_SCALE, Const.MAX_SCALE)] float _size = 1f; 12 | [SerializeField] MeshFilter _filter; 13 | [SerializeField] MeshRenderer _renderer; 14 | [SerializeField] Material _material; 15 | 16 | private MeshData _data; 17 | 18 | public void Generate(SolidType type, float size, Material material = null) 19 | { 20 | CreateMesh(type, size); 21 | UpdateMesh(); 22 | if(material != null) { 23 | SetMaterial(material, _renderer); 24 | } 25 | } 26 | 27 | private IPlatonicSolid GetBase(SolidType type) 28 | { 29 | switch (type) 30 | { 31 | case SolidType.Tetrahedron: 32 | return new Tetrahedron(); 33 | case SolidType.Octahedron: 34 | return new Octahedron(); 35 | case SolidType.Dodecahedron: 36 | return new Dodecahedron(); 37 | case SolidType.Icosahedron: 38 | return new Icosahedron(); 39 | default: 40 | Debug.LogWarning("[WARN] Input Invalid SolidType"); 41 | return new Tetrahedron(); // DEFAULT 42 | } 43 | } 44 | 45 | private void CreateMesh(SolidType type, float size) 46 | { 47 | IPlatonicSolid solid = GetBase(type); 48 | _data = PolyhedronBuilder.Build(solid, size); 49 | } 50 | 51 | private void UpdateMesh() 52 | { 53 | if (!_filter.sharedMesh) 54 | { 55 | _filter.sharedMesh = new Mesh(); 56 | } 57 | 58 | _filter.sharedMesh.Clear(); 59 | _filter.sharedMesh.vertices = _data.Vertices; 60 | _filter.sharedMesh.triangles = _data.Triangles; 61 | _filter.sharedMesh.uv = _data.Uv; 62 | _filter.sharedMesh.normals = _data.Normals; 63 | } 64 | 65 | private void OnDestroy() 66 | { 67 | var mat = _renderer.material; 68 | if (mat != null) 69 | { 70 | Destroy(mat); 71 | } 72 | } 73 | 74 | // private void OnValidate() { 75 | // Generate(_type, _size, _material); 76 | // } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron/Polyhedron.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 14218a9a8f391444395acb4b75694bb8 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron/PolyhedronBuilder.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | public class PolyhedronBuilder 7 | { 8 | public static MeshData Build(IPlatonicSolid solid, float scale) 9 | { 10 | List vertices = new List(); 11 | List triangles = new List(); 12 | List faces = new List(); 13 | 14 | vertices = solid.Vertices; 15 | faces = solid.Faces; 16 | 17 | Dictionary vertWithWarpedU = UvModifier.FindAndFixeWarpedFaces(ref faces, ref vertices); 18 | Dictionary poleVertIndicesCorrectU = UvModifier.FindAndFixPoleVertices(solid, ref faces, ref vertices); 19 | 20 | for (int i = 0; i < faces.Count; i++) 21 | { 22 | triangles.Add(faces[i].v1); 23 | triangles.Add(faces[i].v2); 24 | triangles.Add(faces[i].v3); 25 | } 26 | 27 | Vector2[] uv = new Vector2[vertices.Count]; 28 | Vector3[] normals = new Vector3[vertices.Count]; 29 | 30 | for (int i = 0; i < vertices.Count; i++) 31 | { 32 | Vector3 normal = vertices[i].normalized; 33 | float u = (Mathf.Atan2(normal.z, normal.x) / (2f * Mathf.PI)) + 0.5f; // remove the 0.5f 34 | float v = (Mathf.Asin(normal.y) / Mathf.PI) + 0.5f; 35 | 36 | vertices[i] = normal * scale; 37 | 38 | // correct uv issues 39 | if (poleVertIndicesCorrectU.ContainsKey(i)) 40 | { 41 | u = poleVertIndicesCorrectU[i]; 42 | } 43 | if (vertWithWarpedU.ContainsValue(i)) 44 | { 45 | u += 1f; 46 | } 47 | 48 | // おまじない 49 | if (vertWithWarpedU.ContainsValue(i) && poleVertIndicesCorrectU.ContainsKey(i)) 50 | { 51 | u -= 0.5f; 52 | } 53 | 54 | uv[i] = new Vector2(u, v); 55 | normals[i] = normal; 56 | } 57 | 58 | return new MeshData( 59 | vertices.ToArray(), 60 | triangles.ToArray(), 61 | uv, 62 | normals 63 | ); 64 | } 65 | } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Polyhedron/PolyhedronBuilder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a3aad7ad0c1f246c1a9abad2a4b2575d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Sphere.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ec6264529cb484c2c939f37d1af75d80 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Sphere/Sphere.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using PrimitiveCommon; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | [RequireComponent(typeof(MeshRenderer))] 7 | [RequireComponent(typeof(MeshFilter))] 8 | public class Sphere : PrimitiveBase 9 | { 10 | [SerializeField, Range(Const.MIN_SCALE, Const.MAX_SCALE)] float _radius = 1f; 11 | [SerializeField, Range(0, 6)] int _level = 3; 12 | [SerializeField] MeshFilter _filter; 13 | [SerializeField] MeshRenderer _renderer; 14 | [SerializeField] Material _material; 15 | 16 | private Mesh _mesh; 17 | 18 | public void Generate(float radius, int level, Material material = null) 19 | { 20 | CreateMesh(radius, level); 21 | UpdateMesh(); 22 | if(material != null) { 23 | SetMaterial(material, _renderer); 24 | } 25 | } 26 | 27 | private void CreateMesh(float radius, int level) 28 | { 29 | var icosahedron = new Icosahedron(); 30 | _mesh = SphereBuilder.Build(icosahedron, level, radius); 31 | } 32 | 33 | private void UpdateMesh() 34 | { 35 | if (!_filter.sharedMesh) 36 | { 37 | _filter.sharedMesh = new Mesh(); 38 | } 39 | 40 | _filter.sharedMesh.Clear(); 41 | _filter.sharedMesh = _mesh; 42 | } 43 | 44 | private void OnDestroy() 45 | { 46 | var mat = _renderer.material; 47 | if (mat != null) 48 | { 49 | Destroy(mat); 50 | } 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Sphere/Sphere.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2e842168ec345442f8e3a7942e5b6fd6 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Sphere/SphereBuilder.cs: -------------------------------------------------------------------------------- 1 | // ref : http://wiki.unity3d.com/index.php/CreateIcoSphere 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | namespace PrimitiveGenerator 6 | { 7 | public class SphereBuilder 8 | { 9 | // P1, P2 の中点を頂点に追加 10 | // 追加した頂点のインデックスを返す(後で面を追加するため) 11 | private static int GetMiddlePoint(int p1, int p2, ref List vertices, ref Dictionary cache) 12 | { 13 | long smallerIndex = p1 < p2 ? p1 : p2; 14 | long greaterIndex = p1 < p2 ? p2 : p1; 15 | long key = (smallerIndex << 32) + greaterIndex; 16 | 17 | int ret; 18 | if (cache.TryGetValue(key, out ret)) 19 | { 20 | return ret; 21 | } 22 | 23 | Vector3 point1 = vertices[p1]; 24 | Vector3 point2 = vertices[p2]; 25 | Vector3 middle = new Vector3( 26 | (point1.x + point2.x) / 2f, 27 | (point1.y + point2.y) / 2f, 28 | (point1.z + point2.z) / 2f 29 | ); 30 | 31 | int index = vertices.Count; 32 | vertices.Add(middle); 33 | 34 | cache.Add(key, index); 35 | 36 | return index; 37 | } 38 | 39 | private static Vector3[] Normalize(Vector3[] vertices) 40 | { 41 | Vector3[] normals = new Vector3[vertices.Length]; 42 | 43 | for (int i = 0; i < normals.Length; i++) 44 | { 45 | normals[i] = vertices[i].normalized; 46 | } 47 | return normals; 48 | } 49 | 50 | private static List AddTriangles(List faces) 51 | { 52 | List triangles = new List(); 53 | 54 | for (int i = 0; i < faces.Count; i++) 55 | { 56 | triangles.Add(faces[i].v1); 57 | triangles.Add(faces[i].v2); 58 | triangles.Add(faces[i].v3); 59 | } 60 | return triangles; 61 | } 62 | 63 | public static Mesh Build(IPlatonicSolid solid, int level, float scale) 64 | { 65 | List vertices = new List(); 66 | List triangles = new List(); 67 | List faces = new List(); 68 | 69 | vertices = solid.Vertices; 70 | faces = solid.Faces; 71 | 72 | Dictionary middlePointIndexCache = new Dictionary(); 73 | 74 | // subdivide the triangle faces 75 | for (int i = 1; i < level; i++) 76 | { 77 | List newFaces = new List(); 78 | foreach (var t in faces) 79 | { 80 | int p1 = GetMiddlePoint(t.v1, t.v2, ref vertices, ref middlePointIndexCache); 81 | int p2 = GetMiddlePoint(t.v2, t.v3, ref vertices, ref middlePointIndexCache); 82 | int p3 = GetMiddlePoint(t.v3, t.v1, ref vertices, ref middlePointIndexCache); 83 | newFaces.Add(new TriangleFace(t.v1, p1, p3)); 84 | newFaces.Add(new TriangleFace(t.v2, p2, p1)); 85 | newFaces.Add(new TriangleFace(t.v3, p3, p2)); 86 | newFaces.Add(new TriangleFace(p1, p2, p3)); 87 | } 88 | faces = newFaces; 89 | } 90 | 91 | Dictionary vertWithWarpedU = UvModifier.FindAndFixeWarpedFaces(ref faces, ref vertices); 92 | Dictionary poleVertIndicesCorrectU = UvModifier.FindAndFixPoleVertices(solid, ref faces, ref vertices); 93 | 94 | for (int i = 0; i < faces.Count; i++) 95 | { 96 | triangles.Add(faces[i].v1); 97 | triangles.Add(faces[i].v2); 98 | triangles.Add(faces[i].v3); 99 | } 100 | 101 | Vector2[] uv = new Vector2[vertices.Count]; 102 | Vector3[] normals = new Vector3[vertices.Count]; 103 | 104 | for (int i = 0; i < vertices.Count; i++) 105 | { 106 | Vector3 normal = vertices[i].normalized; 107 | float u = (Mathf.Atan2(normal.z, normal.x) / (2f * Mathf.PI)) + 0.5f; // remove the 0.5f 108 | float v = (Mathf.Asin(normal.y) / Mathf.PI) + 0.5f; 109 | 110 | vertices[i] = normal * scale; 111 | 112 | if (poleVertIndicesCorrectU.ContainsKey(i)) 113 | { 114 | u = poleVertIndicesCorrectU[i]; 115 | } 116 | if (vertWithWarpedU.ContainsValue(i)) 117 | { 118 | u += 1f; 119 | } 120 | 121 | // おまじない 122 | if (vertWithWarpedU.ContainsValue(i) && poleVertIndicesCorrectU.ContainsKey(i)) 123 | { 124 | u -= 0.5f; 125 | } 126 | 127 | uv[i] = new Vector2(u, v); 128 | normals[i] = normal; 129 | } 130 | 131 | Mesh mesh = new Mesh(); 132 | mesh.name = "Sphere"; 133 | mesh.vertices = vertices.ToArray(); 134 | mesh.triangles = triangles.ToArray(); 135 | mesh.normals = normals; 136 | mesh.uv = uv; 137 | 138 | mesh.RecalculateNormals(); 139 | mesh.RecalculateTangents(); 140 | mesh.Optimize(); 141 | 142 | return mesh; 143 | } 144 | 145 | 146 | 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Sphere/SphereBuilder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1049a85578d474366a5bfccf4baf1a0c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Torus.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f6438b5bf405947daa8013d06077bade 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Torus/Torus.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using PrimitiveCommon; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | [RequireComponent(typeof(MeshRenderer))] 7 | [RequireComponent(typeof(MeshFilter))] 8 | public class Torus : PrimitiveBase 9 | { 10 | [SerializeField, Range(Const.MIN_SCALE, Const.MAX_SCALE)] float _majorRadius = .5f; 11 | [SerializeField, Range(Const.MIN_SCALE, Const.MAX_SCALE)] float _minorRadius = .25f; 12 | [SerializeField, Range(3, 50)] int _majorSegment = 24; 13 | [SerializeField, Range(3, 50)] int _minorSegment = 18; 14 | [SerializeField] MeshFilter _filter; 15 | [SerializeField] MeshRenderer _renderer; 16 | [SerializeField] Material _material; 17 | 18 | private Mesh _mesh; 19 | 20 | public void Generate(float majorRadius, float minorRadius, int majorSegment, int minorSegment, Material material = null) 21 | { 22 | CreateMesh(majorRadius, minorRadius, majorSegment, minorSegment); 23 | UpdateMesh(); 24 | if(material != null) { 25 | SetMaterial(material, _renderer); 26 | } 27 | } 28 | 29 | private void CreateMesh(float majorRadius, float minorRadius, int majorSegment, int minorSegment) 30 | { 31 | _mesh = TorusBuilder.Build(majorRadius, minorRadius, majorSegment, minorSegment); 32 | } 33 | 34 | private void UpdateMesh() 35 | { 36 | if (!_filter?.sharedMesh) 37 | { 38 | _filter.sharedMesh = new Mesh(); 39 | } 40 | 41 | _filter.sharedMesh.Clear(); 42 | _filter.sharedMesh = _mesh; 43 | } 44 | 45 | private void OnDestroy() 46 | { 47 | var mat = _renderer.material; 48 | if (mat != null) 49 | { 50 | Destroy(mat); 51 | } 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Torus/Torus.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1f69f7cf7306c462c9e699312a165258 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Torus/TorusBuilder.cs: -------------------------------------------------------------------------------- 1 | // ref: https://blog.applibot.co.jp/2017/08/17/tutorial-for-unity-3d-2/ 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | namespace PrimitiveGenerator 6 | { 7 | public class TorusBuilder 8 | { 9 | public static Mesh Build(float radius, float innerRadius, int seg1, int seg2) 10 | { 11 | var vertices = new List(); 12 | var triangles = new List(); 13 | var normals = new List(); 14 | var uvs = new List(); 15 | 16 | for(int i = 0; i <= seg2; i++) { 17 | float phi = Mathf.PI * 2f * i / seg2; 18 | float r = Mathf.Cos(phi) * innerRadius; 19 | float y = Mathf.Sin(phi) * innerRadius; 20 | 21 | for (int j = 0; j <= seg1; j++) { 22 | float theta = Mathf.PI * 2f * j / seg1; 23 | float x = Mathf.Cos(theta) * (radius + r); 24 | float z = Mathf.Sin(theta) * (radius + r); 25 | 26 | vertices.Add(new Vector3(x, y, z)); 27 | normals.Add(new Vector3(r * Mathf.Cos(theta), y, r * Mathf.Sin(theta))); 28 | 29 | uvs.Add(new Vector2( 30 | (float)j / (float)seg1, 31 | (float)i / (float)seg2 32 | )); 33 | } 34 | } 35 | 36 | for(int i = 0; i < seg1; i++) { 37 | for(int j = 0; j < seg2; j++) { 38 | int tri = (seg1 + 1) * j + i; 39 | 40 | triangles.Add(tri); 41 | triangles.Add(tri + seg1 + 2); 42 | triangles.Add(tri + 1); 43 | 44 | triangles.Add(tri); 45 | triangles.Add(tri + seg1 + 1); 46 | triangles.Add(tri + seg1 + 2); 47 | } 48 | } 49 | 50 | Mesh mesh = new Mesh(); 51 | mesh.name = "Torus"; 52 | mesh.vertices = vertices.ToArray(); 53 | mesh.normals = normals.ToArray(); 54 | mesh.uv = uvs.ToArray(); 55 | mesh.triangles = triangles.ToArray(); 56 | 57 | mesh.Optimize(); 58 | return mesh; 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Torus/TorusBuilder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1e73b6108dd3148fe8bc33a9a27e764d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Utilities.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4abec40f99ba94be48391867373c36b3 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Utilities/UvModifier.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | 4 | namespace PrimitiveGenerator 5 | { 6 | public class UvModifier 7 | { 8 | public static Dictionary FindAndFixeWarpedFaces(ref List faces, ref List vertices) 9 | { 10 | List warpedFaces = new List(); 11 | Dictionary checkedVert = new Dictionary(); 12 | 13 | // find warped faces 14 | foreach (TriangleFace face in faces) 15 | { 16 | Vector3 coord1 = GetUvCoords(vertices[face.v1]); 17 | Vector3 coord2 = GetUvCoords(vertices[face.v2]); 18 | Vector3 coord3 = GetUvCoords(vertices[face.v3]); 19 | 20 | Vector3 texNormal = Vector3.Cross(coord2 - coord1, coord3 - coord1); 21 | if (texNormal.z > 0) 22 | { 23 | warpedFaces.Add(face); 24 | } 25 | } 26 | 27 | // fix warped faces 28 | foreach (TriangleFace wFace in warpedFaces) 29 | { 30 | float xCoord1 = GetUvCoords(vertices[wFace.v1]).x; 31 | float xCoord2 = GetUvCoords(vertices[wFace.v2]).x; 32 | float xCoord3 = GetUvCoords(vertices[wFace.v3]).x; 33 | 34 | if (xCoord1 < 0.25f) 35 | { 36 | int newV1 = wFace.v1; 37 | if (!checkedVert.TryGetValue(wFace.v1, out newV1)) 38 | { 39 | vertices.Add(vertices[wFace.v1]); 40 | checkedVert[wFace.v1] = vertices.Count - 1; 41 | newV1 = vertices.Count - 1; 42 | } 43 | wFace.SetV1(newV1); 44 | } 45 | if (xCoord2 < 0.25f) 46 | { 47 | int newV2 = wFace.v2; 48 | if (!checkedVert.TryGetValue(wFace.v2, out newV2)) 49 | { 50 | vertices.Add(vertices[wFace.v2]); 51 | checkedVert[wFace.v2] = vertices.Count - 1; 52 | newV2 = vertices.Count - 1; 53 | } 54 | wFace.SetV2(newV2); 55 | } 56 | if (xCoord3 < 0.25f) 57 | { 58 | int newV3 = wFace.v3; 59 | if (!checkedVert.TryGetValue(wFace.v3, out newV3)) 60 | { 61 | vertices.Add(vertices[wFace.v3]); 62 | checkedVert[wFace.v3] = vertices.Count - 1; 63 | newV3 = vertices.Count - 1; 64 | } 65 | wFace.SetV3(newV3); 66 | } 67 | } 68 | return checkedVert; 69 | } 70 | 71 | public static Dictionary FindAndFixPoleVertices(IPlatonicSolid solid, ref List faces, ref List vertices) 72 | { 73 | Vector3 north = solid.NorthPole; 74 | Vector3 south = -solid.NorthPole; 75 | 76 | List poleVerticeInd = new List(); 77 | Dictionary poleVertIndicesCorrectU = new Dictionary(); 78 | 79 | foreach (TriangleFace face in faces) 80 | { 81 | if (vertices[face.v1] == north || vertices[face.v1] == south) 82 | { 83 | if (!poleVerticeInd.Contains(face.v1)) 84 | { 85 | poleVerticeInd.Add(face.v1); 86 | } 87 | else 88 | { 89 | vertices.Add(vertices[face.v1] == north ? north : south); 90 | face.SetV1(vertices.Count - 1); 91 | } 92 | float xCoordB = GetUvCoords(vertices[face.v2]).x; 93 | float xCoordC = GetUvCoords(vertices[face.v3]).x; 94 | float correctedU = (xCoordB + xCoordC) / 2f + 0.5f; // I am not sure why it is needed but it seems needed... 95 | 96 | poleVertIndicesCorrectU[face.v1] = correctedU; 97 | } 98 | } 99 | 100 | return poleVertIndicesCorrectU; 101 | } 102 | 103 | private static Vector2 GetUvCoords(Vector3 vertice) 104 | { 105 | Vector3 vertCoord = vertice.normalized; 106 | float u = (Mathf.Atan2(vertCoord.z, vertCoord.x) / (2f * Mathf.PI)); 107 | float v = (Mathf.Asin(vertCoord.y) / Mathf.PI) + 0.5f; 108 | 109 | return new Vector2(u, v); 110 | } 111 | } 112 | 113 | } 114 | -------------------------------------------------------------------------------- /Assets/Scripts/3D/Utilities/UvModifier.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 11dc5ff05857f4c5bb1d813d3bd999ab 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/PrimitiveBase.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using PrimitiveGenerator; 3 | 4 | public class PrimitiveBase : MonoBehaviour 5 | { 6 | public void Set(Vector3? position = null, Vector3? scale = null, Vector3? rotation = null) 7 | { 8 | if(position != null) 9 | { 10 | SetPosition((Vector3)position); 11 | } 12 | 13 | if(scale != null) 14 | { 15 | SetScale((Vector3)scale); 16 | } 17 | 18 | if(rotation != null) 19 | { 20 | SetRotation((Vector3)rotation); 21 | } 22 | } 23 | 24 | private void SetPosition(Vector3 position) 25 | { 26 | this.gameObject.transform.localPosition = position; 27 | } 28 | 29 | private void SetScale(Vector3 scale) 30 | { 31 | this.gameObject.transform.localScale = scale; 32 | } 33 | 34 | private void SetRotation(Vector3 rotation) 35 | { 36 | this.gameObject.transform.eulerAngles = rotation; 37 | } 38 | 39 | public void SetMaterial(Material material, MeshRenderer renderer) 40 | { 41 | renderer.material = material; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Assets/Scripts/PrimitiveBase.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b842d5ea8813841528267c60d1fc312f 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/PrimitiveCommon.cs: -------------------------------------------------------------------------------- 1 | namespace PrimitiveCommon 2 | { 3 | public static class Const 4 | { 5 | public const float MAX_SCALE = 10f; 6 | public const float MIN_SCALE = 0.1f; 7 | } 8 | } -------------------------------------------------------------------------------- /Assets/Scripts/PrimitiveCommon.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4e7e26555e5334b81924767f415df58d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/PrimitiveManager.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using PrimitiveGenerator; 3 | 4 | public class PrimitiveManager : MonoBehaviour 5 | { 6 | Sphere _sphere; 7 | Box _box; 8 | Polygon _polygon; 9 | Capsule _capsule; 10 | Cylinder _cylinder; 11 | Torus _torus; 12 | Polyhedron _polyhedron; 13 | PrimitiveGenerator.Grid _grid; 14 | 15 | [Header("Primitives")] 16 | [SerializeField] Sphere _spherePrefab; 17 | [SerializeField] Box _boxPrefab; 18 | [SerializeField] Polygon _polygonPrefab; 19 | [SerializeField] Capsule _capsulePrefab; 20 | [SerializeField] Cylinder _cylinderPrefab; 21 | [SerializeField] Torus _torusPrefab; 22 | [SerializeField] Polyhedron _polyhedronPrefab; 23 | [SerializeField] PrimitiveGenerator.Grid _gridPrefab; 24 | 25 | [Header("Material")] 26 | [SerializeField] Material _defaultMaterial; 27 | [SerializeField] Material _redMaterial; 28 | [SerializeField] Material _blueMaterial; 29 | [SerializeField] Material _yellowMaterial; 30 | 31 | [Header("GameObject")] 32 | [SerializeField] Transform _parent; 33 | 34 | private void Start() 35 | { 36 | _polygon = Instantiate(_polygonPrefab); 37 | _polygon.Generate( 38 | shape: 3, 39 | size: 2f, 40 | _redMaterial 41 | ); 42 | _polygon.gameObject.transform.SetParent(_parent); 43 | _polygon.Set(position: new Vector3(0, 0, 0)); 44 | 45 | _box = Instantiate(_boxPrefab); 46 | _box.Generate( 47 | width: 1f, 48 | height: 1f, 49 | depth: 1f, 50 | segments: 4, 51 | _blueMaterial 52 | ); 53 | _box.gameObject.transform.SetParent(_parent); 54 | _box.Set(position: new Vector3(2, 0, 0)); 55 | 56 | _grid = Instantiate(_gridPrefab); 57 | _grid.Generate( 58 | width: 12f, 59 | height: 6f, 60 | divX: 12, 61 | divY: 12, 62 | _yellowMaterial 63 | ); 64 | _grid.gameObject.transform.SetParent(_parent); 65 | _grid.Set(position: new Vector3(0, -2f, 0)); 66 | 67 | _capsule = Instantiate(_capsulePrefab); 68 | _capsule.Generate( 69 | radius: 0.5f, 70 | height: 1f, 71 | lats: 16, 72 | lons: 32, 73 | rings: 2, 74 | _redMaterial 75 | ); 76 | _capsule.gameObject.transform.SetParent(_parent); 77 | _capsule.Set(position: new Vector3(4, 0, 0)); 78 | 79 | _cylinder = Instantiate(_cylinderPrefab); 80 | _cylinder.Generate( 81 | radialSegments: 24, 82 | heightSegments: 24, 83 | topRadius: 0.5f, 84 | bottomRadius: 0.5f, 85 | height: 2f, 86 | _blueMaterial 87 | ); 88 | _cylinder.gameObject.transform.SetParent(_parent); 89 | _cylinder.Set(position: new Vector3(6, 0, 0)); 90 | 91 | _sphere = Instantiate(_spherePrefab); 92 | _sphere.Generate( 93 | radius: 1f, 94 | level: 4, 95 | _yellowMaterial 96 | ); 97 | _sphere.gameObject.transform.SetParent(_parent); 98 | _sphere.Set(position: new Vector3(-2, 0, 0)); 99 | 100 | _torus = Instantiate(_torusPrefab); 101 | _torus.Generate( 102 | majorRadius: .5f, 103 | minorRadius: .25f, 104 | majorSegment: 24, 105 | minorSegment: 16, 106 | _redMaterial 107 | ); 108 | _torus.gameObject.transform.SetParent(_parent); 109 | _torus.Set(position: new Vector3(-4, 0, 0)); 110 | 111 | _polyhedron = Instantiate(_polyhedronPrefab); 112 | _polyhedron.Generate( 113 | type: SolidType.Icosahedron, 114 | size: 1f, 115 | _blueMaterial 116 | ); 117 | _polyhedron.gameObject.transform.SetParent(_parent); 118 | _polyhedron.Set(position: new Vector3(-6, 0, 0)); 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /Assets/Scripts/PrimitiveManager.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7183c39d4468a4e33b7dcdbe9dcf6877 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 okawari 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Unity-ProceduralPrimitives 2 | 3 | Procedural builder for some basic primitives in Unity 4 | 5 | ``` 6 | - Sphere 7 | - Box 8 | - Cylinder 9 | - Capsule 10 | - Torus 11 | - Grid(Terrain) 12 | - Polygon(Triangle, Rectangle, Circle etc..) 13 | - Polyhedron 14 | ``` 15 | 16 | ## Screenshots 17 | ![image](https://user-images.githubusercontent.com/21966381/130729996-ce17f055-a375-4081-a8d5-ea945b111f64.png) 18 | 19 | ## Usage 20 | 21 | ### [Sphere](https://github.com/ogrew/Unity-ProceduralPrimitives/blob/main/Assets/Scripts/3D/Sphere/SphereBuilder.cs) 22 | ![image](https://user-images.githubusercontent.com/21966381/130739406-704f4764-b695-4948-a9de-7f876f741976.png) 23 | ```cs 24 | _sphere.Generate( 25 | radius: 1f, 26 | level: 4, 27 | _redMaterial 28 | ); 29 | ``` 30 | ### [Box](https://github.com/ogrew/Unity-ProceduralPrimitives/blob/main/Assets/Scripts/3D/Box/BoxBuilder.cs) 31 | ![image](https://user-images.githubusercontent.com/21966381/130738860-27090e4b-f159-46e3-b7db-6f5736d53b49.png) 32 | ```cs 33 | _box.Generate( 34 | width: 1f, 35 | height: 1f, 36 | depth: 1f, 37 | segments: 4, 38 | _yellowMaterial 39 | ); 40 | ``` 41 | 42 | ### [Cylinder](https://github.com/ogrew/Unity-ProceduralPrimitives/blob/main/Assets/Scripts/3D/Cylinder/CylinderBuilder.cs) 43 | ![image](https://user-images.githubusercontent.com/21966381/130739146-771e899d-d283-490c-a2ce-5d0c20217894.png) 44 | ```cs 45 | _cylinder.Generate( 46 | radialSegments: 24, 47 | heightSegments: 24, 48 | topRadius: 0.5f, 49 | bottomRadius: 0.5f, 50 | height: 2f, 51 | _blueMaterial 52 | ); 53 | ``` 54 | 55 | ### [Capsule](https://github.com/ogrew/Unity-ProceduralPrimitives/blob/main/Assets/Scripts/3D/Capsule/CapsuleBuilder.cs) 56 | ![image](https://user-images.githubusercontent.com/21966381/130738972-aa632a8d-58c2-4383-9a3f-345942016bb2.png) 57 | ```cs 58 | _capsule.Generate( 59 | radius: 0.5f, 60 | height: 1f, 61 | lats: 16, 62 | lons: 32, 63 | rings: 2, 64 | _redMaterial 65 | ); 66 | ``` 67 | 68 | ### [Torus](https://github.com/ogrew/Unity-ProceduralPrimitives/blob/main/Assets/Scripts/3D/Torus/TorusBuilder.cs) 69 | ![image](https://user-images.githubusercontent.com/21966381/130739654-c24f1c1c-f523-4dab-9c19-7bcb18f7382a.png) 70 | ```cs 71 | _torus.Generate( 72 | majorRadius: .5f, 73 | minorRadius: .25f, 74 | majorSegment: 24, 75 | minorSegment: 16, 76 | _yellowMaterial 77 | ); 78 | ``` 79 | 80 | ### [Grid(Terrain)](https://github.com/ogrew/Unity-ProceduralPrimitives/blob/main/Assets/Scripts/3D/Grid/GridBuilder.cs) 81 | ![image](https://user-images.githubusercontent.com/21966381/130739845-5d56a748-0011-43e8-8818-6f62310c5b31.png) 82 | ```cs 83 | _grid.Generate( 84 | width: 12f, 85 | height: 6f, 86 | divX: 12, 87 | divY: 12, 88 | _blueMaterial 89 | ); 90 | ``` 91 | 92 | ### [Polygon](https://github.com/ogrew/Unity-ProceduralPrimitives/blob/main/Assets/Scripts/2D/PolygonBuilder.cs) 93 | ![image](https://user-images.githubusercontent.com/21966381/130740407-80fb2766-b1ef-44fa-8bc0-f4f185bb1635.png) 94 | ```cs 95 | _polygon.Generate( 96 | shape: 3, 97 | size: 2f, 98 | _redMaterial 99 | ); 100 | ``` 101 | 102 | ### [Polyhedron](https://github.com/ogrew/Unity-ProceduralPrimitives/blob/main/Assets/Scripts/3D/Polyhedron/PolyhedronBuilder.cs) 103 | ![image](https://user-images.githubusercontent.com/21966381/130741449-d83028f1-ba9b-4740-9a9a-f75a143113b0.png) 104 | ```cs 105 | _polyhedron.Generate( 106 | type: SolidType.Icosahedron, 107 | size: 1f, 108 | _redMaterial 109 | ); 110 | ``` 111 | 112 | ## License 113 | 114 | MIT 115 | --------------------------------------------------------------------------------