├── .github ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE │ └── bug_report.md └── README.md ├── .gitignore ├── Gizmos.meta ├── Gizmos ├── Kitbashery.meta └── Kitbashery │ ├── Gameplay.meta │ └── Gameplay │ ├── ActivationEvents Icon.png │ ├── ActivationEvents Icon.png.meta │ ├── CollisionEvents Icon.png │ ├── CollisionEvents Icon.png.meta │ ├── ForceField Icon.png │ ├── ForceField Icon.png.meta │ ├── Health Icon.png │ ├── Health Icon.png.meta │ ├── HealthZone Icon.png │ ├── HealthZone Icon.png.meta │ ├── ObjectPools Icon.png │ ├── ObjectPools Icon.png.meta │ ├── Projectile Icon.png │ ├── Projectile Icon.png.meta │ ├── Spawner Icon.png │ ├── Spawner Icon.png.meta │ ├── TimeManager Icon.png │ └── TimeManager Icon.png.meta ├── LICENSE.md ├── LICENSE.md.meta ├── Runtime.meta ├── Runtime ├── ActivationEvents.cs ├── ActivationEvents.cs.meta ├── CollisionEvents.cs ├── CollisionEvents.cs.meta ├── ForceField.cs ├── ForceField.cs.meta ├── Health.cs ├── Health.cs.meta ├── HealthZone.cs ├── HealthZone.cs.meta ├── ObjectPools.cs ├── ObjectPools.cs.meta ├── Projectile.cs ├── Projectile.cs.meta ├── Spawner.cs ├── Spawner.cs.meta ├── TimeManager.cs ├── TimeManager.cs.meta ├── kitbashery.game-kit.asmdef └── kitbashery.game-kit.asmdef.meta ├── Samples~ ├── Demo.meta └── Demo │ ├── Demo Sphere.prefab │ ├── Demo Sphere.prefab.meta │ ├── Game Kit Demo.unity │ └── Game Kit Demo.unity.meta ├── package.json └── package.json.meta /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | kitbashery@gmail.com. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Contributing: 2 |

3 | All code contributions are subject to the following requirements: 4 | 5 | All C# code must be up to Microsoft's [C# Coding Conventions](https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions). In the past Unity used conventions like using m_variableName and such practices can still be found in legacy code. However going forward Microsoft's conventions are now the standard. 6 | 7 | In addition to the C# coding standards there is a prefered comment and region structure to follow. 8 | 9 | * Encapsulate all properties in a #region labeled: Properties: 10 | * Encapsulate all Monobehaviour Initializers, Updates, Gizmos and IEnumerators in a #region labeled: Initialization & Updates. 11 | * Encapsulate Methods in a #region labeled: Methods: within this region you can have sub regions labeled to your liking. 12 | * Triple slash summary comments must be used on all public methods and properties that are not obviously named. These summary comments corralate to the descriptions in the documentation. 13 | 14 | ```csharp 15 | ///

16 | /// your summary... 17 | /// 18 | YourMethod() 19 | { 20 | //your code. 21 | } 22 | ``` 23 | Sometimes when there is a private field/method that isn't very well named it is a good idea to add a summary comment there as well. 24 | 25 | Additionally over any public property field that will be displayed in Unity's inspector window include: 26 | 27 | ```csharp 28 | [ToolTip("Your tooltip text")] 29 | ``` 30 | 31 | Sometimes with very obviouslty named fields that are self explanitory it isn't necessary to add a tooltip attribute, but in most cases it is prefered. 32 | 33 | In some cases it is prefered to be more strict than Microsoft's conventions such as var is rarely if ever used, instead a known type should be used. Additionally when checking if statements == true/false is always used instead of if(variableName) These two practices are done to reduce ambiguity. 34 | 35 | After putting in a pull request it is helpful (but not necessary) to also document them by putting in a pull request to The documentation repo and update the docs. Doing so however does not mean your additions/changes will be accepted so it may be best to add docs after your changes have been merged or let an official developer document the changes. 36 | 37 | Code that deviates to far from these guidelines may not be merged untill it is revised and/or fits within the scope of the project. 38 |

39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ![](https://kitbashery.com/assets/images/kitbashery-github-banner.jpg) 4 | 5 | [![Unity Version](https://img.shields.io/badge/Unity-2021.3%2B-blue.svg)](https://unity3d.com/get-unity/download) 6 | [![GitHub](https://img.shields.io/github/license/kitbashery/modular-ai.svg)](https://github.com/Kitbashery/Game-Kit/blob/main/.github/LICENSE.md) 7 | [![OpenUPM](https://img.shields.io/badge/Install-openUPM-blue)](https://openupm.com/packages/com.kitbashery.game-kit.html) 8 | [![DevKit](https://img.shields.io/badge/Dev%20Kit-.unitypackage-blue)](https://github.com/Kitbashery/Game-Kit/releases/download/Development-Package/Kitbashery_GameKit.unitypackage) 9 | [![Documentation](https://img.shields.io/badge/Docs-Kitbashery.com-%23ffaf0c)](https://kitbashery.com/docs/game-kit) 10 | [![Contributing](https://img.shields.io/badge/Contribute-guidelines-lightgrey)](https://github.com/Kitbashery/.github/blob/main/.github/CONTRIBUTING.md) 11 | 12 | #### For a more performant, stable and fully featured solution check out our latest asset: 13 | [![Smart GameObjects](https://kitbashery.com/assets/images/smart-gameobjects-uas-sale.jpg)](https://assetstore.unity.com/packages/slug/248930?aid=1100lvf66) 14 | 15 | # Game Kit 16 | 17 | ## Description: 18 | GameKit contains feature rich systems and components commonly used in games. Designed with 3D games in mind, however some components may function in 2D as well. 19 | 20 | ## Features: 21 | 22 | #### Object pooling: 23 | * Improves game performace 24 | * Sequential naming 25 | * Hide pooled GameObjects in the inspector 26 | * Expandable pools. 27 | 28 | #### Spawner: 29 | * Forward & offset spawn direction 30 | * Integrated object pooling 31 | * Spawn events 32 | * Wave system 33 | * Random spawns 34 | 35 | #### Health: 36 | * Invinsibility 37 | * Multiple health bars 38 | * Passive regeneration 39 | * Damage/healing 40 | * Stackable effects over time 41 | * Damage/heal/death Events 42 | * Area of effect zones 43 | * Healthbar UI support 44 | 45 | #### Projectiles: 46 | * Impact force 47 | * Seeking 48 | * Ricochets 49 | * Integrated with health system 50 | * Integrated object pooling 51 | 52 | #### Event Systems: 53 | * Dynamic collision events 54 | * Dynamic activation events 55 | * Integrated with health system 56 | * Integrated with projectiles 57 | 58 | #### Time Management: 59 | * Play/Pause 60 | * FPS Counter 61 | * Slow Motion 62 | * Time Events 63 | 64 | #### Force Fields: 65 | * Directional forces 66 | * Sync with WindZone 67 | * Explosion/Implosion 68 | 69 | 70 | # Getting Started: 71 | All components can be found under Kitbashery in the component menu: 72 | ![](https://kitbashery.com/assets/images/kitbashery-getting-started.jpg) 73 | 74 | Online documentation & scripting API is found at: 75 | 76 | https://kitbashery.com/docs/game-kit 77 | 78 | ---- 79 | The name Kitbashery & all associated images Copyright © 2023 Kitbashery. All Rights Reserved. 80 | 81 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /Gizmos.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5269231391443574d9195c8a2e7fb314 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Gizmos/Kitbashery.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 93f92657914763841b4dcc2b5393088c 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fcfdbaca0cb3ab345b7420d6b1ca4e84 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/ActivationEvents Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kitbashery/Game-Kit/76caf3e7f5c010c6f6c29c838e045e3abe6885c3/Gizmos/Kitbashery/Gameplay/ActivationEvents Icon.png -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/ActivationEvents Icon.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 528f30f65bef92d49a68bf78678de876 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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 | ignoreMasterTextureLimit: 0 28 | grayScaleToAlpha: 0 29 | generateCubemap: 6 30 | cubemapConvolution: 0 31 | seamlessCubemap: 0 32 | textureFormat: 1 33 | maxTextureSize: 2048 34 | textureSettings: 35 | serializedVersion: 2 36 | filterMode: 1 37 | aniso: 1 38 | mipBias: 0 39 | wrapU: 1 40 | wrapV: 1 41 | wrapW: 0 42 | nPOTScale: 0 43 | lightmap: 0 44 | compressionQuality: 50 45 | spriteMode: 0 46 | spriteExtrude: 1 47 | spriteMeshType: 1 48 | alignment: 0 49 | spritePivot: {x: 0.5, y: 0.5} 50 | spritePixelsToUnits: 100 51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 52 | spriteGenerateFallbackPhysicsShape: 1 53 | alphaUsage: 1 54 | alphaIsTransparency: 1 55 | spriteTessellationDetail: -1 56 | textureType: 2 57 | textureShape: 1 58 | singleChannelComponent: 0 59 | flipbookRows: 1 60 | flipbookColumns: 1 61 | maxTextureSizeSet: 0 62 | compressionQualitySet: 0 63 | textureFormatSet: 0 64 | ignorePngGamma: 0 65 | applyGammaDecoding: 0 66 | platformSettings: 67 | - serializedVersion: 3 68 | buildTarget: DefaultTexturePlatform 69 | maxTextureSize: 32 70 | resizeAlgorithm: 0 71 | textureFormat: -1 72 | textureCompression: 1 73 | compressionQuality: 50 74 | crunchedCompression: 0 75 | allowsAlphaSplitting: 0 76 | overridden: 0 77 | androidETC2FallbackOverride: 0 78 | forceMaximumCompressionQuality_BC6H_BC7: 0 79 | - serializedVersion: 3 80 | buildTarget: Standalone 81 | maxTextureSize: 2048 82 | resizeAlgorithm: 0 83 | textureFormat: -1 84 | textureCompression: 1 85 | compressionQuality: 50 86 | crunchedCompression: 0 87 | allowsAlphaSplitting: 0 88 | overridden: 0 89 | androidETC2FallbackOverride: 0 90 | forceMaximumCompressionQuality_BC6H_BC7: 0 91 | - serializedVersion: 3 92 | buildTarget: Server 93 | maxTextureSize: 2048 94 | resizeAlgorithm: 0 95 | textureFormat: -1 96 | textureCompression: 1 97 | compressionQuality: 50 98 | crunchedCompression: 0 99 | allowsAlphaSplitting: 0 100 | overridden: 0 101 | androidETC2FallbackOverride: 0 102 | forceMaximumCompressionQuality_BC6H_BC7: 0 103 | spriteSheet: 104 | serializedVersion: 2 105 | sprites: [] 106 | outline: [] 107 | physicsShape: [] 108 | bones: [] 109 | spriteID: 110 | internalID: 0 111 | vertices: [] 112 | indices: 113 | edges: [] 114 | weights: [] 115 | secondaryTextures: [] 116 | nameFileIdTable: {} 117 | spritePackingTag: 118 | pSDRemoveMatte: 0 119 | pSDShowRemoveMatteOption: 0 120 | userData: 121 | assetBundleName: 122 | assetBundleVariant: 123 | -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/CollisionEvents Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kitbashery/Game-Kit/76caf3e7f5c010c6f6c29c838e045e3abe6885c3/Gizmos/Kitbashery/Gameplay/CollisionEvents Icon.png -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/CollisionEvents Icon.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 609d93c33ccb1a148a98edf9ea2f2fa6 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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 | ignoreMasterTextureLimit: 0 28 | grayScaleToAlpha: 0 29 | generateCubemap: 6 30 | cubemapConvolution: 0 31 | seamlessCubemap: 0 32 | textureFormat: 1 33 | maxTextureSize: 2048 34 | textureSettings: 35 | serializedVersion: 2 36 | filterMode: 1 37 | aniso: 1 38 | mipBias: 0 39 | wrapU: 1 40 | wrapV: 1 41 | wrapW: 0 42 | nPOTScale: 0 43 | lightmap: 0 44 | compressionQuality: 50 45 | spriteMode: 0 46 | spriteExtrude: 1 47 | spriteMeshType: 1 48 | alignment: 0 49 | spritePivot: {x: 0.5, y: 0.5} 50 | spritePixelsToUnits: 100 51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 52 | spriteGenerateFallbackPhysicsShape: 1 53 | alphaUsage: 1 54 | alphaIsTransparency: 1 55 | spriteTessellationDetail: -1 56 | textureType: 2 57 | textureShape: 1 58 | singleChannelComponent: 0 59 | flipbookRows: 1 60 | flipbookColumns: 1 61 | maxTextureSizeSet: 0 62 | compressionQualitySet: 0 63 | textureFormatSet: 0 64 | ignorePngGamma: 0 65 | applyGammaDecoding: 0 66 | platformSettings: 67 | - serializedVersion: 3 68 | buildTarget: DefaultTexturePlatform 69 | maxTextureSize: 32 70 | resizeAlgorithm: 0 71 | textureFormat: -1 72 | textureCompression: 1 73 | compressionQuality: 50 74 | crunchedCompression: 0 75 | allowsAlphaSplitting: 0 76 | overridden: 0 77 | androidETC2FallbackOverride: 0 78 | forceMaximumCompressionQuality_BC6H_BC7: 0 79 | - serializedVersion: 3 80 | buildTarget: Standalone 81 | maxTextureSize: 2048 82 | resizeAlgorithm: 0 83 | textureFormat: -1 84 | textureCompression: 1 85 | compressionQuality: 50 86 | crunchedCompression: 0 87 | allowsAlphaSplitting: 0 88 | overridden: 0 89 | androidETC2FallbackOverride: 0 90 | forceMaximumCompressionQuality_BC6H_BC7: 0 91 | - serializedVersion: 3 92 | buildTarget: Server 93 | maxTextureSize: 2048 94 | resizeAlgorithm: 0 95 | textureFormat: -1 96 | textureCompression: 1 97 | compressionQuality: 50 98 | crunchedCompression: 0 99 | allowsAlphaSplitting: 0 100 | overridden: 0 101 | androidETC2FallbackOverride: 0 102 | forceMaximumCompressionQuality_BC6H_BC7: 0 103 | spriteSheet: 104 | serializedVersion: 2 105 | sprites: [] 106 | outline: [] 107 | physicsShape: [] 108 | bones: [] 109 | spriteID: 110 | internalID: 0 111 | vertices: [] 112 | indices: 113 | edges: [] 114 | weights: [] 115 | secondaryTextures: [] 116 | nameFileIdTable: {} 117 | spritePackingTag: 118 | pSDRemoveMatte: 0 119 | pSDShowRemoveMatteOption: 0 120 | userData: 121 | assetBundleName: 122 | assetBundleVariant: 123 | -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/ForceField Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kitbashery/Game-Kit/76caf3e7f5c010c6f6c29c838e045e3abe6885c3/Gizmos/Kitbashery/Gameplay/ForceField Icon.png -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/ForceField Icon.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 35ba978c0620bee4cba4870280e098b0 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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 | ignoreMasterTextureLimit: 0 28 | grayScaleToAlpha: 0 29 | generateCubemap: 6 30 | cubemapConvolution: 0 31 | seamlessCubemap: 0 32 | textureFormat: 1 33 | maxTextureSize: 2048 34 | textureSettings: 35 | serializedVersion: 2 36 | filterMode: 1 37 | aniso: 1 38 | mipBias: 0 39 | wrapU: 1 40 | wrapV: 1 41 | wrapW: 0 42 | nPOTScale: 0 43 | lightmap: 0 44 | compressionQuality: 50 45 | spriteMode: 0 46 | spriteExtrude: 1 47 | spriteMeshType: 1 48 | alignment: 0 49 | spritePivot: {x: 0.5, y: 0.5} 50 | spritePixelsToUnits: 100 51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 52 | spriteGenerateFallbackPhysicsShape: 1 53 | alphaUsage: 1 54 | alphaIsTransparency: 1 55 | spriteTessellationDetail: -1 56 | textureType: 2 57 | textureShape: 1 58 | singleChannelComponent: 0 59 | flipbookRows: 1 60 | flipbookColumns: 1 61 | maxTextureSizeSet: 0 62 | compressionQualitySet: 0 63 | textureFormatSet: 0 64 | ignorePngGamma: 0 65 | applyGammaDecoding: 0 66 | platformSettings: 67 | - serializedVersion: 3 68 | buildTarget: DefaultTexturePlatform 69 | maxTextureSize: 32 70 | resizeAlgorithm: 0 71 | textureFormat: -1 72 | textureCompression: 1 73 | compressionQuality: 50 74 | crunchedCompression: 0 75 | allowsAlphaSplitting: 0 76 | overridden: 0 77 | androidETC2FallbackOverride: 0 78 | forceMaximumCompressionQuality_BC6H_BC7: 0 79 | - serializedVersion: 3 80 | buildTarget: Standalone 81 | maxTextureSize: 2048 82 | resizeAlgorithm: 0 83 | textureFormat: -1 84 | textureCompression: 1 85 | compressionQuality: 50 86 | crunchedCompression: 0 87 | allowsAlphaSplitting: 0 88 | overridden: 0 89 | androidETC2FallbackOverride: 0 90 | forceMaximumCompressionQuality_BC6H_BC7: 0 91 | - serializedVersion: 3 92 | buildTarget: Server 93 | maxTextureSize: 2048 94 | resizeAlgorithm: 0 95 | textureFormat: -1 96 | textureCompression: 1 97 | compressionQuality: 50 98 | crunchedCompression: 0 99 | allowsAlphaSplitting: 0 100 | overridden: 0 101 | androidETC2FallbackOverride: 0 102 | forceMaximumCompressionQuality_BC6H_BC7: 0 103 | spriteSheet: 104 | serializedVersion: 2 105 | sprites: [] 106 | outline: [] 107 | physicsShape: [] 108 | bones: [] 109 | spriteID: 110 | internalID: 0 111 | vertices: [] 112 | indices: 113 | edges: [] 114 | weights: [] 115 | secondaryTextures: [] 116 | nameFileIdTable: {} 117 | spritePackingTag: 118 | pSDRemoveMatte: 0 119 | pSDShowRemoveMatteOption: 0 120 | userData: 121 | assetBundleName: 122 | assetBundleVariant: 123 | -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/Health Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kitbashery/Game-Kit/76caf3e7f5c010c6f6c29c838e045e3abe6885c3/Gizmos/Kitbashery/Gameplay/Health Icon.png -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/Health Icon.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bda33c99099617d44802e6d58657fe68 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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 | ignoreMasterTextureLimit: 0 28 | grayScaleToAlpha: 0 29 | generateCubemap: 6 30 | cubemapConvolution: 0 31 | seamlessCubemap: 0 32 | textureFormat: 1 33 | maxTextureSize: 2048 34 | textureSettings: 35 | serializedVersion: 2 36 | filterMode: 1 37 | aniso: 1 38 | mipBias: 0 39 | wrapU: 1 40 | wrapV: 1 41 | wrapW: 0 42 | nPOTScale: 0 43 | lightmap: 0 44 | compressionQuality: 50 45 | spriteMode: 0 46 | spriteExtrude: 1 47 | spriteMeshType: 1 48 | alignment: 0 49 | spritePivot: {x: 0.5, y: 0.5} 50 | spritePixelsToUnits: 100 51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 52 | spriteGenerateFallbackPhysicsShape: 1 53 | alphaUsage: 1 54 | alphaIsTransparency: 1 55 | spriteTessellationDetail: -1 56 | textureType: 2 57 | textureShape: 1 58 | singleChannelComponent: 0 59 | flipbookRows: 1 60 | flipbookColumns: 1 61 | maxTextureSizeSet: 0 62 | compressionQualitySet: 0 63 | textureFormatSet: 0 64 | ignorePngGamma: 0 65 | applyGammaDecoding: 0 66 | platformSettings: 67 | - serializedVersion: 3 68 | buildTarget: DefaultTexturePlatform 69 | maxTextureSize: 32 70 | resizeAlgorithm: 0 71 | textureFormat: -1 72 | textureCompression: 1 73 | compressionQuality: 50 74 | crunchedCompression: 0 75 | allowsAlphaSplitting: 0 76 | overridden: 0 77 | androidETC2FallbackOverride: 0 78 | forceMaximumCompressionQuality_BC6H_BC7: 0 79 | - serializedVersion: 3 80 | buildTarget: Standalone 81 | maxTextureSize: 2048 82 | resizeAlgorithm: 0 83 | textureFormat: -1 84 | textureCompression: 1 85 | compressionQuality: 50 86 | crunchedCompression: 0 87 | allowsAlphaSplitting: 0 88 | overridden: 0 89 | androidETC2FallbackOverride: 0 90 | forceMaximumCompressionQuality_BC6H_BC7: 0 91 | - serializedVersion: 3 92 | buildTarget: Server 93 | maxTextureSize: 2048 94 | resizeAlgorithm: 0 95 | textureFormat: -1 96 | textureCompression: 1 97 | compressionQuality: 50 98 | crunchedCompression: 0 99 | allowsAlphaSplitting: 0 100 | overridden: 0 101 | androidETC2FallbackOverride: 0 102 | forceMaximumCompressionQuality_BC6H_BC7: 0 103 | spriteSheet: 104 | serializedVersion: 2 105 | sprites: [] 106 | outline: [] 107 | physicsShape: [] 108 | bones: [] 109 | spriteID: 110 | internalID: 0 111 | vertices: [] 112 | indices: 113 | edges: [] 114 | weights: [] 115 | secondaryTextures: [] 116 | nameFileIdTable: {} 117 | spritePackingTag: 118 | pSDRemoveMatte: 0 119 | pSDShowRemoveMatteOption: 0 120 | userData: 121 | assetBundleName: 122 | assetBundleVariant: 123 | -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/HealthZone Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kitbashery/Game-Kit/76caf3e7f5c010c6f6c29c838e045e3abe6885c3/Gizmos/Kitbashery/Gameplay/HealthZone Icon.png -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/HealthZone Icon.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 98fa57431c5f8bb44b84110b86f3699c 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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 | ignoreMasterTextureLimit: 0 28 | grayScaleToAlpha: 0 29 | generateCubemap: 6 30 | cubemapConvolution: 0 31 | seamlessCubemap: 0 32 | textureFormat: 1 33 | maxTextureSize: 2048 34 | textureSettings: 35 | serializedVersion: 2 36 | filterMode: 1 37 | aniso: 1 38 | mipBias: 0 39 | wrapU: 1 40 | wrapV: 1 41 | wrapW: 0 42 | nPOTScale: 0 43 | lightmap: 0 44 | compressionQuality: 50 45 | spriteMode: 0 46 | spriteExtrude: 1 47 | spriteMeshType: 1 48 | alignment: 0 49 | spritePivot: {x: 0.5, y: 0.5} 50 | spritePixelsToUnits: 100 51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 52 | spriteGenerateFallbackPhysicsShape: 1 53 | alphaUsage: 1 54 | alphaIsTransparency: 1 55 | spriteTessellationDetail: -1 56 | textureType: 2 57 | textureShape: 1 58 | singleChannelComponent: 0 59 | flipbookRows: 1 60 | flipbookColumns: 1 61 | maxTextureSizeSet: 0 62 | compressionQualitySet: 0 63 | textureFormatSet: 0 64 | ignorePngGamma: 0 65 | applyGammaDecoding: 0 66 | platformSettings: 67 | - serializedVersion: 3 68 | buildTarget: DefaultTexturePlatform 69 | maxTextureSize: 32 70 | resizeAlgorithm: 0 71 | textureFormat: -1 72 | textureCompression: 1 73 | compressionQuality: 50 74 | crunchedCompression: 0 75 | allowsAlphaSplitting: 0 76 | overridden: 0 77 | androidETC2FallbackOverride: 0 78 | forceMaximumCompressionQuality_BC6H_BC7: 0 79 | - serializedVersion: 3 80 | buildTarget: Standalone 81 | maxTextureSize: 2048 82 | resizeAlgorithm: 0 83 | textureFormat: -1 84 | textureCompression: 1 85 | compressionQuality: 50 86 | crunchedCompression: 0 87 | allowsAlphaSplitting: 0 88 | overridden: 0 89 | androidETC2FallbackOverride: 0 90 | forceMaximumCompressionQuality_BC6H_BC7: 0 91 | - serializedVersion: 3 92 | buildTarget: Server 93 | maxTextureSize: 2048 94 | resizeAlgorithm: 0 95 | textureFormat: -1 96 | textureCompression: 1 97 | compressionQuality: 50 98 | crunchedCompression: 0 99 | allowsAlphaSplitting: 0 100 | overridden: 0 101 | androidETC2FallbackOverride: 0 102 | forceMaximumCompressionQuality_BC6H_BC7: 0 103 | spriteSheet: 104 | serializedVersion: 2 105 | sprites: [] 106 | outline: [] 107 | physicsShape: [] 108 | bones: [] 109 | spriteID: 110 | internalID: 0 111 | vertices: [] 112 | indices: 113 | edges: [] 114 | weights: [] 115 | secondaryTextures: [] 116 | nameFileIdTable: {} 117 | spritePackingTag: 118 | pSDRemoveMatte: 0 119 | pSDShowRemoveMatteOption: 0 120 | userData: 121 | assetBundleName: 122 | assetBundleVariant: 123 | -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/ObjectPools Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kitbashery/Game-Kit/76caf3e7f5c010c6f6c29c838e045e3abe6885c3/Gizmos/Kitbashery/Gameplay/ObjectPools Icon.png -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/ObjectPools Icon.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 73a4d41112a438a42947614be5d5cf9d 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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 | ignoreMasterTextureLimit: 0 28 | grayScaleToAlpha: 0 29 | generateCubemap: 6 30 | cubemapConvolution: 0 31 | seamlessCubemap: 0 32 | textureFormat: 1 33 | maxTextureSize: 2048 34 | textureSettings: 35 | serializedVersion: 2 36 | filterMode: 1 37 | aniso: 1 38 | mipBias: 0 39 | wrapU: 1 40 | wrapV: 1 41 | wrapW: 0 42 | nPOTScale: 0 43 | lightmap: 0 44 | compressionQuality: 50 45 | spriteMode: 0 46 | spriteExtrude: 1 47 | spriteMeshType: 1 48 | alignment: 0 49 | spritePivot: {x: 0.5, y: 0.5} 50 | spritePixelsToUnits: 100 51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 52 | spriteGenerateFallbackPhysicsShape: 1 53 | alphaUsage: 1 54 | alphaIsTransparency: 1 55 | spriteTessellationDetail: -1 56 | textureType: 2 57 | textureShape: 1 58 | singleChannelComponent: 0 59 | flipbookRows: 1 60 | flipbookColumns: 1 61 | maxTextureSizeSet: 0 62 | compressionQualitySet: 0 63 | textureFormatSet: 0 64 | ignorePngGamma: 0 65 | applyGammaDecoding: 0 66 | platformSettings: 67 | - serializedVersion: 3 68 | buildTarget: DefaultTexturePlatform 69 | maxTextureSize: 32 70 | resizeAlgorithm: 0 71 | textureFormat: -1 72 | textureCompression: 1 73 | compressionQuality: 50 74 | crunchedCompression: 0 75 | allowsAlphaSplitting: 0 76 | overridden: 0 77 | androidETC2FallbackOverride: 0 78 | forceMaximumCompressionQuality_BC6H_BC7: 0 79 | - serializedVersion: 3 80 | buildTarget: Standalone 81 | maxTextureSize: 2048 82 | resizeAlgorithm: 0 83 | textureFormat: -1 84 | textureCompression: 1 85 | compressionQuality: 50 86 | crunchedCompression: 0 87 | allowsAlphaSplitting: 0 88 | overridden: 0 89 | androidETC2FallbackOverride: 0 90 | forceMaximumCompressionQuality_BC6H_BC7: 0 91 | - serializedVersion: 3 92 | buildTarget: Server 93 | maxTextureSize: 2048 94 | resizeAlgorithm: 0 95 | textureFormat: -1 96 | textureCompression: 1 97 | compressionQuality: 50 98 | crunchedCompression: 0 99 | allowsAlphaSplitting: 0 100 | overridden: 0 101 | androidETC2FallbackOverride: 0 102 | forceMaximumCompressionQuality_BC6H_BC7: 0 103 | spriteSheet: 104 | serializedVersion: 2 105 | sprites: [] 106 | outline: [] 107 | physicsShape: [] 108 | bones: [] 109 | spriteID: 110 | internalID: 0 111 | vertices: [] 112 | indices: 113 | edges: [] 114 | weights: [] 115 | secondaryTextures: [] 116 | nameFileIdTable: {} 117 | spritePackingTag: 118 | pSDRemoveMatte: 0 119 | pSDShowRemoveMatteOption: 0 120 | userData: 121 | assetBundleName: 122 | assetBundleVariant: 123 | -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/Projectile Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kitbashery/Game-Kit/76caf3e7f5c010c6f6c29c838e045e3abe6885c3/Gizmos/Kitbashery/Gameplay/Projectile Icon.png -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/Projectile Icon.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 54f72835463919a4b8cd30bfd216feb8 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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 | ignoreMasterTextureLimit: 0 28 | grayScaleToAlpha: 0 29 | generateCubemap: 6 30 | cubemapConvolution: 0 31 | seamlessCubemap: 0 32 | textureFormat: 1 33 | maxTextureSize: 2048 34 | textureSettings: 35 | serializedVersion: 2 36 | filterMode: 1 37 | aniso: 1 38 | mipBias: 0 39 | wrapU: 1 40 | wrapV: 1 41 | wrapW: 0 42 | nPOTScale: 0 43 | lightmap: 0 44 | compressionQuality: 50 45 | spriteMode: 0 46 | spriteExtrude: 1 47 | spriteMeshType: 1 48 | alignment: 0 49 | spritePivot: {x: 0.5, y: 0.5} 50 | spritePixelsToUnits: 100 51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 52 | spriteGenerateFallbackPhysicsShape: 1 53 | alphaUsage: 1 54 | alphaIsTransparency: 1 55 | spriteTessellationDetail: -1 56 | textureType: 2 57 | textureShape: 1 58 | singleChannelComponent: 0 59 | flipbookRows: 1 60 | flipbookColumns: 1 61 | maxTextureSizeSet: 0 62 | compressionQualitySet: 0 63 | textureFormatSet: 0 64 | ignorePngGamma: 0 65 | applyGammaDecoding: 0 66 | platformSettings: 67 | - serializedVersion: 3 68 | buildTarget: DefaultTexturePlatform 69 | maxTextureSize: 32 70 | resizeAlgorithm: 0 71 | textureFormat: -1 72 | textureCompression: 1 73 | compressionQuality: 50 74 | crunchedCompression: 0 75 | allowsAlphaSplitting: 0 76 | overridden: 0 77 | androidETC2FallbackOverride: 0 78 | forceMaximumCompressionQuality_BC6H_BC7: 0 79 | - serializedVersion: 3 80 | buildTarget: Standalone 81 | maxTextureSize: 2048 82 | resizeAlgorithm: 0 83 | textureFormat: -1 84 | textureCompression: 1 85 | compressionQuality: 50 86 | crunchedCompression: 0 87 | allowsAlphaSplitting: 0 88 | overridden: 0 89 | androidETC2FallbackOverride: 0 90 | forceMaximumCompressionQuality_BC6H_BC7: 0 91 | - serializedVersion: 3 92 | buildTarget: Server 93 | maxTextureSize: 2048 94 | resizeAlgorithm: 0 95 | textureFormat: -1 96 | textureCompression: 1 97 | compressionQuality: 50 98 | crunchedCompression: 0 99 | allowsAlphaSplitting: 0 100 | overridden: 0 101 | androidETC2FallbackOverride: 0 102 | forceMaximumCompressionQuality_BC6H_BC7: 0 103 | spriteSheet: 104 | serializedVersion: 2 105 | sprites: [] 106 | outline: [] 107 | physicsShape: [] 108 | bones: [] 109 | spriteID: 110 | internalID: 0 111 | vertices: [] 112 | indices: 113 | edges: [] 114 | weights: [] 115 | secondaryTextures: [] 116 | nameFileIdTable: {} 117 | spritePackingTag: 118 | pSDRemoveMatte: 0 119 | pSDShowRemoveMatteOption: 0 120 | userData: 121 | assetBundleName: 122 | assetBundleVariant: 123 | -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/Spawner Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kitbashery/Game-Kit/76caf3e7f5c010c6f6c29c838e045e3abe6885c3/Gizmos/Kitbashery/Gameplay/Spawner Icon.png -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/Spawner Icon.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 530cffd1eb210d24c83d59eb68e3f69f 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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 | ignoreMasterTextureLimit: 0 28 | grayScaleToAlpha: 0 29 | generateCubemap: 6 30 | cubemapConvolution: 0 31 | seamlessCubemap: 0 32 | textureFormat: 1 33 | maxTextureSize: 2048 34 | textureSettings: 35 | serializedVersion: 2 36 | filterMode: 1 37 | aniso: 1 38 | mipBias: 0 39 | wrapU: 1 40 | wrapV: 1 41 | wrapW: 0 42 | nPOTScale: 0 43 | lightmap: 0 44 | compressionQuality: 50 45 | spriteMode: 0 46 | spriteExtrude: 1 47 | spriteMeshType: 1 48 | alignment: 0 49 | spritePivot: {x: 0.5, y: 0.5} 50 | spritePixelsToUnits: 100 51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 52 | spriteGenerateFallbackPhysicsShape: 1 53 | alphaUsage: 1 54 | alphaIsTransparency: 1 55 | spriteTessellationDetail: -1 56 | textureType: 2 57 | textureShape: 1 58 | singleChannelComponent: 0 59 | flipbookRows: 1 60 | flipbookColumns: 1 61 | maxTextureSizeSet: 0 62 | compressionQualitySet: 0 63 | textureFormatSet: 0 64 | ignorePngGamma: 0 65 | applyGammaDecoding: 0 66 | platformSettings: 67 | - serializedVersion: 3 68 | buildTarget: DefaultTexturePlatform 69 | maxTextureSize: 32 70 | resizeAlgorithm: 0 71 | textureFormat: -1 72 | textureCompression: 1 73 | compressionQuality: 50 74 | crunchedCompression: 0 75 | allowsAlphaSplitting: 0 76 | overridden: 0 77 | androidETC2FallbackOverride: 0 78 | forceMaximumCompressionQuality_BC6H_BC7: 0 79 | - serializedVersion: 3 80 | buildTarget: Standalone 81 | maxTextureSize: 2048 82 | resizeAlgorithm: 0 83 | textureFormat: -1 84 | textureCompression: 1 85 | compressionQuality: 50 86 | crunchedCompression: 0 87 | allowsAlphaSplitting: 0 88 | overridden: 0 89 | androidETC2FallbackOverride: 0 90 | forceMaximumCompressionQuality_BC6H_BC7: 0 91 | - serializedVersion: 3 92 | buildTarget: Server 93 | maxTextureSize: 2048 94 | resizeAlgorithm: 0 95 | textureFormat: -1 96 | textureCompression: 1 97 | compressionQuality: 50 98 | crunchedCompression: 0 99 | allowsAlphaSplitting: 0 100 | overridden: 0 101 | androidETC2FallbackOverride: 0 102 | forceMaximumCompressionQuality_BC6H_BC7: 0 103 | spriteSheet: 104 | serializedVersion: 2 105 | sprites: [] 106 | outline: [] 107 | physicsShape: [] 108 | bones: [] 109 | spriteID: 110 | internalID: 0 111 | vertices: [] 112 | indices: 113 | edges: [] 114 | weights: [] 115 | secondaryTextures: [] 116 | nameFileIdTable: {} 117 | spritePackingTag: 118 | pSDRemoveMatte: 0 119 | pSDShowRemoveMatteOption: 0 120 | userData: 121 | assetBundleName: 122 | assetBundleVariant: 123 | -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/TimeManager Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Kitbashery/Game-Kit/76caf3e7f5c010c6f6c29c838e045e3abe6885c3/Gizmos/Kitbashery/Gameplay/TimeManager Icon.png -------------------------------------------------------------------------------- /Gizmos/Kitbashery/Gameplay/TimeManager Icon.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e22227f5d8588bd409651653feb95a90 3 | TextureImporter: 4 | internalIDToNameTable: [] 5 | externalObjects: {} 6 | serializedVersion: 11 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 0 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 | ignoreMasterTextureLimit: 0 28 | grayScaleToAlpha: 0 29 | generateCubemap: 6 30 | cubemapConvolution: 0 31 | seamlessCubemap: 0 32 | textureFormat: 1 33 | maxTextureSize: 2048 34 | textureSettings: 35 | serializedVersion: 2 36 | filterMode: 1 37 | aniso: 1 38 | mipBias: 0 39 | wrapU: 1 40 | wrapV: 1 41 | wrapW: 0 42 | nPOTScale: 0 43 | lightmap: 0 44 | compressionQuality: 50 45 | spriteMode: 0 46 | spriteExtrude: 1 47 | spriteMeshType: 1 48 | alignment: 0 49 | spritePivot: {x: 0.5, y: 0.5} 50 | spritePixelsToUnits: 100 51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 52 | spriteGenerateFallbackPhysicsShape: 1 53 | alphaUsage: 1 54 | alphaIsTransparency: 1 55 | spriteTessellationDetail: -1 56 | textureType: 2 57 | textureShape: 1 58 | singleChannelComponent: 0 59 | flipbookRows: 1 60 | flipbookColumns: 1 61 | maxTextureSizeSet: 0 62 | compressionQualitySet: 0 63 | textureFormatSet: 0 64 | ignorePngGamma: 0 65 | applyGammaDecoding: 0 66 | platformSettings: 67 | - serializedVersion: 3 68 | buildTarget: DefaultTexturePlatform 69 | maxTextureSize: 32 70 | resizeAlgorithm: 0 71 | textureFormat: -1 72 | textureCompression: 1 73 | compressionQuality: 50 74 | crunchedCompression: 0 75 | allowsAlphaSplitting: 0 76 | overridden: 0 77 | androidETC2FallbackOverride: 0 78 | forceMaximumCompressionQuality_BC6H_BC7: 0 79 | - serializedVersion: 3 80 | buildTarget: Standalone 81 | maxTextureSize: 2048 82 | resizeAlgorithm: 0 83 | textureFormat: -1 84 | textureCompression: 1 85 | compressionQuality: 50 86 | crunchedCompression: 0 87 | allowsAlphaSplitting: 0 88 | overridden: 0 89 | androidETC2FallbackOverride: 0 90 | forceMaximumCompressionQuality_BC6H_BC7: 0 91 | - serializedVersion: 3 92 | buildTarget: Server 93 | maxTextureSize: 2048 94 | resizeAlgorithm: 0 95 | textureFormat: -1 96 | textureCompression: 1 97 | compressionQuality: 50 98 | crunchedCompression: 0 99 | allowsAlphaSplitting: 0 100 | overridden: 0 101 | androidETC2FallbackOverride: 0 102 | forceMaximumCompressionQuality_BC6H_BC7: 0 103 | spriteSheet: 104 | serializedVersion: 2 105 | sprites: [] 106 | outline: [] 107 | physicsShape: [] 108 | bones: [] 109 | spriteID: 110 | internalID: 0 111 | vertices: [] 112 | indices: 113 | edges: [] 114 | weights: [] 115 | secondaryTextures: [] 116 | nameFileIdTable: {} 117 | spritePackingTag: 118 | pSDRemoveMatte: 0 119 | pSDShowRemoveMatteOption: 0 120 | userData: 121 | assetBundleName: 122 | assetBundleVariant: 123 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Kitbashery 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 | -------------------------------------------------------------------------------- /LICENSE.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0d1288ee8a8048a4d969ac509fd0bc9b 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Runtime.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6173e6a37085ece4d9a7d3afd67da3a0 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Runtime/ActivationEvents.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.Events; 3 | 4 | /* 5 | MIT License 6 | 7 | Copyright (c) 2022 Kitbashery 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy 10 | of this software and associated documentation files (the "Software"), to deal 11 | in the Software without restriction, including without limitation the rights 12 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | copies of the Software, and to permit persons to whom the Software is 14 | furnished to do so, subject to the following conditions: 15 | 16 | The above copyright notice and this permission notice shall be included in all 17 | copies or substantial portions of the Software. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | SOFTWARE. 26 | 27 | 28 | 29 | Need support or additional features? Please visit https://kitbashery.com/ 30 | */ 31 | 32 | namespace Kitbashery.Gameplay 33 | { 34 | /// 35 | /// Exposes s to the inspector that are invoked during their corralating activation messages. 36 | /// 37 | [HelpURL("https://kitbashery.com/docs/game-kit/activation-events.html")] 38 | [DisallowMultipleComponent] 39 | [AddComponentMenu("Kitbashery/Event/Activation Events")] 40 | public class ActivationEvents : MonoBehaviour 41 | { 42 | [Header("Called when a script instance is being loaded.")] 43 | public UnityEvent onAwake; 44 | [Header("Called before the first frame update.")] 45 | public UnityEvent onStart; 46 | [Header("Called when the object becomes active and enabled.")] 47 | public UnityEvent onEnable; 48 | [Header("Called when the object becomes disabled or inactive.")] 49 | public UnityEvent onDisable; 50 | [Header("Called when the MonoBehaviour will be destroyed.")] 51 | public UnityEvent onDestroy; 52 | 53 | private void Awake() 54 | { 55 | onAwake.Invoke(); 56 | } 57 | 58 | private void OnEnable() 59 | { 60 | onEnable.Invoke(); 61 | } 62 | 63 | private void Start() 64 | { 65 | onStart.Invoke(); 66 | } 67 | 68 | private void OnDisable() 69 | { 70 | onDisable.Invoke(); 71 | } 72 | 73 | private void OnDestroy() 74 | { 75 | onDestroy.Invoke(); 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /Runtime/ActivationEvents.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a36c92081ad09b94593c7184174249da 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 528f30f65bef92d49a68bf78678de876, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/CollisionEvents.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | using UnityEngine.Events; 4 | 5 | /* 6 | MIT License 7 | 8 | Copyright (c) 2022 Kitbashery 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | 28 | 29 | 30 | Need support or additional features? Please visit https://kitbashery.com/ 31 | */ 32 | 33 | namespace Kitbashery.Gameplay 34 | { 35 | /// 36 | /// A wrapper for 's built-in physics methods adding conditional constrains and events. 37 | /// 38 | [HelpURL("https://kitbashery.com/docs/game-kit/collision-events.html")] 39 | [DisallowMultipleComponent] 40 | [RequireComponent(typeof(Collider))] 41 | [AddComponentMenu("Kitbashery/Event/Collision Events")] 42 | public class CollisionEvents : MonoBehaviour 43 | { 44 | #region Properties: 45 | 46 | [Tooltip("Use trigger events (true/false).")] 47 | public bool isTrigger = true; 48 | [Tooltip("Events will not be invoked if there are more collisions taking place than the maximum.")] 49 | [Min(1)] 50 | public int maxCollisions = 50; 51 | 52 | [Tooltip("Tags a collider must have in order for events to be invoked.")] 53 | public List requiredTags = new List(); 54 | 55 | /// 56 | /// Colliders to ignore when the script is initialized. 57 | /// 58 | [Tooltip("Colliders to ignore (Only supported in Unity 5.5.0b3 and later).")] 59 | public List ignoredColliders = new List(); 60 | [Space] 61 | 62 | public UnityEvent enterEvent; 63 | public UnityEvent exitEvent; 64 | public UnityEvent stayEvent; 65 | 66 | /// 67 | /// The collider that last interacted with the event collider. 68 | /// 69 | [HideInInspector] 70 | public Collider lastContact; 71 | 72 | /// 73 | /// The last collision that occured. 74 | /// 75 | public Collision lastCollision; 76 | 77 | /// 78 | /// All colliders currently interacting with the collision event collider. 79 | /// 80 | [HideInInspector] 81 | public List colliders = new List(); 82 | 83 | /// 84 | /// The collider used to detect collision events (Found when Awake() is called). 85 | /// 86 | [HideInInspector] 87 | public Collider eventCollider; 88 | 89 | #endregion 90 | 91 | #region Initialization & Updates: 92 | 93 | private void Awake() 94 | { 95 | eventCollider = transform.GetComponent(); 96 | eventCollider.isTrigger = isTrigger; 97 | IgnoreColliders(ignoredColliders, true); 98 | } 99 | 100 | private void OnTriggerEnter(Collider other) 101 | { 102 | if (isTrigger == true && colliders.Count < maxCollisions && (requiredTags.Count == 0 || requiredTags.Contains(other.gameObject.tag))) 103 | { 104 | lastContact = other; 105 | if (!colliders.Contains(other)) 106 | { 107 | colliders.Add(other); 108 | } 109 | enterEvent.Invoke(); 110 | } 111 | } 112 | 113 | private void OnTriggerExit(Collider other) 114 | { 115 | if (isTrigger == true && colliders.Count < maxCollisions && (requiredTags.Count == 0 || requiredTags.Contains(other.gameObject.tag))) 116 | { 117 | lastContact = other; 118 | if (colliders.Contains(other)) 119 | { 120 | colliders.Remove(other); 121 | } 122 | exitEvent.Invoke(); 123 | } 124 | } 125 | 126 | private void OnTriggerStay(Collider other) 127 | { 128 | if (isTrigger == true && (requiredTags.Count == 0 || requiredTags.Contains(other.gameObject.tag))) 129 | { 130 | lastContact = other; 131 | stayEvent.Invoke(); 132 | } 133 | } 134 | 135 | private void OnCollisionEnter(Collision collision) 136 | { 137 | if (isTrigger == false && colliders.Count < maxCollisions && (requiredTags.Count == 0 || requiredTags.Contains(collision.gameObject.tag))) 138 | { 139 | lastContact = collision.collider; 140 | lastCollision = collision; 141 | if (!colliders.Contains(collision.collider)) 142 | { 143 | colliders.Add(collision.collider); 144 | } 145 | enterEvent.Invoke(); 146 | } 147 | } 148 | 149 | private void OnCollisionExit(Collision collision) 150 | { 151 | if (isTrigger == false && colliders.Count < maxCollisions && (requiredTags.Count == 0 || requiredTags.Contains(collision.gameObject.tag))) 152 | { 153 | lastContact = collision.collider; 154 | lastCollision = collision; 155 | if (colliders.Contains(collision.collider)) 156 | { 157 | colliders.Remove(collision.collider); 158 | } 159 | exitEvent.Invoke(); 160 | } 161 | } 162 | 163 | private void OnCollisionStay(Collision collision) 164 | { 165 | if (isTrigger == false && (requiredTags.Count == 0 || requiredTags.Contains(collision.gameObject.tag))) 166 | { 167 | lastContact = collision.collider; 168 | lastCollision = collision; 169 | stayEvent.Invoke(); 170 | } 171 | } 172 | 173 | #endregion 174 | 175 | #region Core Functions: 176 | 177 | /// 178 | /// Tells the physics engine to ignore/detect collisions between a list of colliders and the . 179 | /// 180 | /// Colliders to ignore/detect. 181 | /// Should the colliders in the ignore list be ignored or detected? (true/false) 182 | public void IgnoreColliders(List ignoreList, bool ignore) 183 | { 184 | //Note: Prior to Unity 5.5.0b3 calling this could reset the trigger state of a collider in PhysX. 185 | //See: https://forum.unity.com/threads/physics-ignorecollision-that-does-not-reset-trigger-state.340836/ 186 | 187 | #if UNITY_5_5_OR_NEWER 188 | foreach (Collider col in ignoredColliders) 189 | { 190 | Physics.IgnoreCollision(eventCollider, col, ignore); 191 | } 192 | #else 193 | 194 | //Do nothing... 195 | //TODO: is backward compatibility to support triggers possible? 196 | 197 | #endif 198 | } 199 | 200 | /// 201 | /// Used in the Unity editor to check if a contains a listener with a certain method. 202 | /// 203 | /// The to check for a listener in. 204 | /// The name of the method to check for. 205 | /// true if an event contains a listener with methodName. 206 | public bool EventContainsListenerWithMethod(UnityEvent uEvent, string methodName) 207 | { 208 | for (int i = 0; i < uEvent.GetPersistentEventCount(); i++) 209 | { 210 | if (uEvent.GetPersistentMethodName(i) == methodName) 211 | { 212 | return true; 213 | } 214 | } 215 | 216 | return false; 217 | } 218 | 219 | public void DebugCollisionCount() 220 | { 221 | Debug.LogFormat(gameObject, "|CollisionEvent|: Colliding with {0} colliders.", colliders.Count); 222 | } 223 | 224 | public void DebugLastCollision() 225 | { 226 | Debug.LogFormat(gameObject, "|CollisionEvent|: last collided with {0}'s collider.", lastContact.gameObject.name); 227 | } 228 | 229 | #endregion 230 | } 231 | } -------------------------------------------------------------------------------- /Runtime/CollisionEvents.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cb65b08cef889c14eb78493d5ae0aee8 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 609d93c33ccb1a148a98edf9ea2f2fa6, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/ForceField.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | namespace Kitbashery.Gameplay 6 | { 7 | /// 8 | /// Applys force to s within it's bounds. 9 | /// 10 | [HelpURL("https://kitbashery.com/docs/game-kit/force-field.html")] 11 | [AddComponentMenu("Kitbashery/Physics/Force Field")] 12 | public class ForceField : CollisionEvents 13 | { 14 | #region Properties: 15 | 16 | [Header("Force Field:")] 17 | [HideInInspector] 18 | public List rigidbodies = new List(); 19 | 20 | public ForceTypes mode = ForceTypes.directional; 21 | 22 | public float force = 10; 23 | 24 | public Vector3 forceDirection = Vector3.forward; 25 | 26 | [Space] 27 | [Tooltip("WindZone component that the force field syncs to if set to use the wind ForceMode.")] 28 | public WindZone wind; 29 | 30 | private float windPluseTime = 0; 31 | 32 | #endregion 33 | 34 | private void Start() 35 | { 36 | isTrigger = true; 37 | eventCollider.isTrigger = true; 38 | } 39 | 40 | #region Initialization & Updates: 41 | 42 | #if UNITY_EDITOR 43 | private void OnValidate() 44 | { 45 | //Autofill events: 46 | if (enterEvent == null) 47 | { 48 | enterEvent = new UnityEngine.Events.UnityEvent(); 49 | UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(enterEvent, RegisterRigidbody); 50 | } 51 | else if (EventContainsListenerWithMethod(enterEvent, "RegisterRigidbody") == false) 52 | { 53 | UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(enterEvent, RegisterRigidbody); 54 | } 55 | 56 | if (exitEvent == null) 57 | { 58 | exitEvent = new UnityEngine.Events.UnityEvent(); 59 | UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(exitEvent, UnregisterRigidbody); 60 | } 61 | else if (EventContainsListenerWithMethod(exitEvent, "UnregisterRigidbody") == false) 62 | { 63 | UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(exitEvent, UnregisterRigidbody); 64 | } 65 | } 66 | #endif 67 | 68 | 69 | private void FixedUpdate() 70 | { 71 | foreach(Rigidbody rigid in rigidbodies) 72 | { 73 | switch(mode) 74 | { 75 | case ForceTypes.explode: 76 | 77 | rigid.AddExplosionForce(force, transform.position, eventCollider.bounds.extents.x); 78 | 79 | break; 80 | 81 | case ForceTypes.wind: 82 | 83 | if(wind != null) 84 | { 85 | windPluseTime += Time.fixedDeltaTime; 86 | if (windPluseTime >= wind.windPulseFrequency) 87 | { 88 | if(wind.mode == WindZoneMode.Directional) 89 | { 90 | rigid.AddForce(wind.transform.forward * Random.Range(wind.windMain, wind.windMain + wind.windTurbulence) * wind.windPulseMagnitude, ForceMode.Impulse); 91 | } 92 | else 93 | { 94 | rigid.AddForce((wind.transform.position * wind.radius) * Random.Range(wind.windMain, wind.windMain + wind.windTurbulence) * wind.windPulseMagnitude, ForceMode.Force); 95 | } 96 | 97 | windPluseTime = 0; 98 | } 99 | } 100 | else 101 | { 102 | Debug.LogWarningFormat(gameObject, "|Game Kit|: ForceType is set the wind, however no WindZone was defined. The ForceField will not apply force."); 103 | } 104 | 105 | break; 106 | 107 | case ForceTypes.directional: 108 | 109 | rigid.AddForce(forceDirection * force); 110 | 111 | break; 112 | 113 | case ForceTypes.implode: 114 | 115 | rigid.AddForce((transform.position - rigid.transform.position).normalized * force, ForceMode.Force); 116 | 117 | break; 118 | } 119 | } 120 | } 121 | 122 | #endregion 123 | 124 | public void RegisterRigidbody() 125 | { 126 | if(lastContact != null) 127 | { 128 | rigidbodies.Add(lastContact.attachedRigidbody); 129 | } 130 | } 131 | 132 | public void UnregisterRigidbody() 133 | { 134 | rigidbodies.Remove(lastContact.attachedRigidbody); 135 | } 136 | } 137 | 138 | public enum ForceTypes { wind, directional, explode, implode } 139 | } -------------------------------------------------------------------------------- /Runtime/ForceField.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3ec71563c819ad94e91452ec834dbc36 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 35ba978c0620bee4cba4870280e098b0, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/Health.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.Collections; 4 | using System.Collections.Generic; 5 | using UnityEngine; 6 | using UnityEngine.Events; 7 | 8 | /* 9 | MIT License 10 | 11 | Copyright (c) 2022 Kitbashery 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to deal 15 | in the Software without restriction, including without limitation the rights 16 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 | copies of the Software, and to permit persons to whom the Software is 18 | furnished to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in all 21 | copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 29 | SOFTWARE. 30 | 31 | 32 | 33 | Need support or additional features? Please visit https://kitbashery.com/ 34 | */ 35 | 36 | namespace Kitbashery.Gameplay 37 | { 38 | /// 39 | /// Tracks "hit points" and invokes events based on the current amount or state. 40 | /// 41 | [HelpURL("https://kitbashery.com/docs/game-kit/health.html")] 42 | [AddComponentMenu("Kitbashery/Gameplay/Health")] 43 | public class Health : MonoBehaviour 44 | { 45 | #region Properties: 46 | 47 | [field: SerializeField, Tooltip("Check this to disable receiving damage.")] 48 | public bool invinsible { get; set; } = false; 49 | 50 | [Tooltip("If assigned the hitpoints of the bonus health will need to be depleted before damage can be applied to this health component.")] 51 | public Health bonusHealth; 52 | [Tooltip("The hitpoints to start with, it isn't recommended to modify this value directly during runtime, use ModifyHealth() instead.")] 53 | [Min(0)] 54 | public int hitPoints = 100; 55 | [field: SerializeField, Tooltip("Should the maximum hit points be expanded if healed beyond maxHitPoints?")] 56 | public bool overhealExpand { get; set; } = false; 57 | 58 | [field: SerializeField, Tooltip("Enables passive health regeneration.")] 59 | public bool canRegen { get; set; } = false; 60 | [Tooltip("Hitpoints to regenerate.")] 61 | [Min(1)] 62 | public int regenPoints = 1; 63 | [Tooltip("Time between regenerating hitpoints (in seconds).")] 64 | [Min(0.01f)] 65 | public float regenRate = 0.1f; 66 | 67 | private int originalHitpoints = 100; 68 | private int maxHitpoints = 100; 69 | /// 70 | /// Half the current max value of . 71 | /// 72 | private float halfHealth = 50f; 73 | private float currentRegenTime = 0; 74 | 75 | private Dictionary healthEffects = new Dictionary(); 76 | 77 | [Space] 78 | public UnityEvent onReceivedDamage; 79 | public UnityEvent onHealed; 80 | public UnityEvent onDead; 81 | 82 | #endregion 83 | 84 | #region Initialization & Updates: 85 | 86 | private void Awake() 87 | { 88 | originalHitpoints = hitPoints; 89 | maxHitpoints = hitPoints; 90 | halfHealth = maxHitpoints / 2; 91 | 92 | if(bonusHealth == this) 93 | { 94 | bonusHealth = null; 95 | Debug.Log("|Health|: Has bonusHealth assigned to itself so it has been set to null.", gameObject); 96 | } 97 | } 98 | 99 | private void Update() 100 | { 101 | if (canRegen == true && hitPoints < maxHitpoints) 102 | { 103 | if (currentRegenTime >= regenRate) 104 | { 105 | hitPoints = Mathf.Clamp(hitPoints + regenPoints, 0, maxHitpoints); 106 | currentRegenTime = 0; 107 | } 108 | else 109 | { 110 | currentRegenTime += Time.deltaTime; 111 | } 112 | onHealed.Invoke(); 113 | } 114 | } 115 | private IEnumerator ExecuteTimedHealthEffect(TimedHealthEffect effect) 116 | { 117 | for (int i = 0; i < effect.times; i++) 118 | { 119 | ModifyHealth(effect.modifier, effect.amount); 120 | 121 | yield return new WaitForSeconds(effect.interval); 122 | if (i == effect.times) 123 | { 124 | healthEffects.Remove(effect); 125 | } 126 | } 127 | } 128 | 129 | #endregion 130 | 131 | #region Core Functions: 132 | 133 | public void ModifyHealth(HealthModifiers modifier, int amount) 134 | { 135 | switch(modifier) 136 | { 137 | case HealthModifiers.damage: 138 | 139 | ApplyDamage(amount); 140 | 141 | break; 142 | 143 | case HealthModifiers.heal: 144 | 145 | Heal(amount); 146 | 147 | break; 148 | } 149 | } 150 | 151 | /// 152 | /// Starts a that will modify health over time. 153 | /// 154 | /// 155 | public void ModifyHealthOverTime(TimedHealthEffect effect) 156 | { 157 | healthEffects.Add(effect, StartCoroutine(ExecuteTimedHealthEffect(effect))); 158 | } 159 | 160 | /// 161 | /// Stops all timed health effects that use a specific health modifier. 162 | /// 163 | /// 164 | public void StopTimedEffectsWithModifier(HealthModifiers modifier) 165 | { 166 | for (int i = healthEffects.Count; i > 0; i--) 167 | { 168 | TimedHealthEffect effect = healthEffects.Keys.ElementAt(i); 169 | if(effect.modifier == modifier) 170 | { 171 | StopCoroutine(healthEffects[effect]); 172 | healthEffects.Remove(effect); 173 | } 174 | } 175 | } 176 | 177 | /// 178 | /// Stops a specific health effect by its name. 179 | /// 180 | /// 181 | public void StopTimedHealthEffect(string effectName) 182 | { 183 | for(int i = healthEffects.Count; i > 0; i--) 184 | { 185 | TimedHealthEffect effect = healthEffects.Keys.ElementAt(i); 186 | if (!string.IsNullOrEmpty(effectName)) 187 | { 188 | if (effect.name == effectName) 189 | { 190 | StopCoroutine(healthEffects[effect]); 191 | healthEffects.Remove(effect); 192 | } 193 | } 194 | else 195 | { 196 | StopCoroutine(healthEffects[effect]); 197 | healthEffects.Remove(effect); 198 | } 199 | } 200 | } 201 | 202 | public void StopAllTimedHealthEffects() 203 | { 204 | for (int i = healthEffects.Count; i > 0; i--) 205 | { 206 | TimedHealthEffect effect = healthEffects.Keys.ElementAt(i); 207 | StopCoroutine(healthEffects[effect]); 208 | healthEffects.Remove(effect); 209 | } 210 | } 211 | 212 | /// 213 | /// Applies damage, if there is bonus health damage will be applied to that component first. 214 | /// 215 | /// The amount of damage to apply. 216 | public void ApplyDamage(int amount) 217 | { 218 | if (invinsible == false && hitPoints > 0) 219 | { 220 | if (bonusHealth != null) 221 | { 222 | if (bonusHealth.hitPoints <= 0) 223 | { 224 | hitPoints -= amount; 225 | onReceivedDamage.Invoke(); 226 | } 227 | else 228 | { 229 | bonusHealth.ApplyDamage(amount); 230 | } 231 | } 232 | else 233 | { 234 | hitPoints -= amount; 235 | onReceivedDamage.Invoke(); 236 | } 237 | 238 | if (hitPoints <= 0) 239 | { 240 | onDead.Invoke(); 241 | } 242 | } 243 | } 244 | 245 | /// 246 | /// Instantly regenerates hitpoints if canRegen is true. 247 | /// 248 | public void ClearRegenCooldown() 249 | { 250 | currentRegenTime = 0; 251 | } 252 | 253 | /// 254 | /// Instantly heals the specified amount of hitpoints. 255 | /// 256 | /// The amount of hitpoints to heal. 257 | public void Heal(int amount) 258 | { 259 | if (hitPoints < maxHitpoints) 260 | { 261 | hitPoints += amount; 262 | if (maxHitpoints - hitPoints < 0) 263 | { 264 | if(overhealExpand == true) 265 | { 266 | SetMaxHitpoints(hitPoints); 267 | } 268 | hitPoints = maxHitpoints; 269 | } 270 | onHealed.Invoke(); 271 | } 272 | } 273 | 274 | /// 275 | /// Resets the hitpoints of all health and (optionally) all bonus health components in the chain to their original values. Useful for pooling. 276 | /// 277 | /// If true will reset the bonus health recursively until no bonus health is found. 278 | public void ResetHealth(bool resetBonusHealth = false) 279 | { 280 | hitPoints = originalHitpoints; 281 | if (bonusHealth != null && resetBonusHealth == true) 282 | { 283 | bonusHealth.ResetHealth(resetBonusHealth); 284 | } 285 | } 286 | 287 | /// 288 | /// Overrides the initial hitpoint value and adjusts the current hitpoints to fit within the new range. 289 | /// 290 | /// The new max value of hitpoints. 291 | public void SetMaxHitpoints(int amount) 292 | { 293 | if (amount != maxHitpoints && amount > 0) 294 | { 295 | if (amount > maxHitpoints) 296 | { 297 | hitPoints += (maxHitpoints - amount); 298 | } 299 | else 300 | { 301 | if (hitPoints > amount) 302 | { 303 | hitPoints = amount; 304 | } 305 | } 306 | maxHitpoints = amount; 307 | halfHealth = maxHitpoints / 2; 308 | } 309 | } 310 | 311 | /// 312 | /// Use to update healbar UI. 313 | /// 314 | /// UI slider to update. 315 | public void UpdateHealthbar(UnityEngine.UI.Slider healthbar) 316 | { 317 | if(healthbar.maxValue != maxHitpoints) 318 | { 319 | healthbar.maxValue = maxHitpoints; 320 | } 321 | healthbar.value = hitPoints; 322 | } 323 | 324 | /// 325 | /// Checks if the amount of hitpoints is below 50% of the intial value. 326 | /// 327 | /// true if hitpoints are below 50% 328 | public bool IsLessThanHalfHealth() 329 | { 330 | return halfHealth < hitPoints; 331 | } 332 | 333 | /// 334 | /// Checks if there are any heal/damage over time effects being apllied. 335 | /// 336 | /// true if there are effect playing. 337 | public bool TimedEffectsPlaying() 338 | { 339 | return healthEffects.Count > 0; 340 | } 341 | 342 | /// 343 | /// Checks if there is a specific timed health effect playing. 344 | /// 345 | /// The name of the effect to check for. 346 | /// true if an effect is found. 347 | public bool HasTimedHealthEffect(string effectName) 348 | { 349 | foreach(TimedHealthEffect key in healthEffects.Keys) 350 | { 351 | if(key.name == effectName) 352 | { 353 | return true; 354 | } 355 | } 356 | return false; 357 | } 358 | 359 | public void DebugTimedEffectCount() 360 | { 361 | Debug.LogFormat(gameObject, "|Health|: Has {0} timed health effects being applied.", healthEffects.Count); 362 | } 363 | 364 | public void DebugCurrentHealth() 365 | { 366 | Debug.LogFormat(gameObject, "|Health|: Hitpoints currently are: {0}", hitPoints); 367 | } 368 | 369 | #endregion 370 | } 371 | 372 | [Serializable] 373 | public struct TimedHealthEffect 374 | { 375 | [Tooltip("The name of the effect, used for stopping effects with this name.")] 376 | public string name; 377 | public HealthModifiers modifier; 378 | [Tooltip("The amount of healing or damage to apply.")] 379 | [Min(1)] 380 | public int amount; 381 | [Tooltip("The amount of times to modify health.")] 382 | [Min(1)] 383 | public int times; 384 | [Tooltip("Time interval in seconds between modifying health.")] 385 | [Min(0)] 386 | public float interval; 387 | } 388 | 389 | public enum HealthModifiers { damage, heal } 390 | } -------------------------------------------------------------------------------- /Runtime/Health.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bba5fb71024046749af5e8b7a9b5caf1 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: bda33c99099617d44802e6d58657fe68, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/HealthZone.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | using UnityEngine.Events; 4 | 5 | /* 6 | MIT License 7 | 8 | Copyright (c) 2022 Kitbashery 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | 28 | 29 | 30 | Need support or additional features? Please visit https://kitbashery.com/ 31 | */ 32 | 33 | namespace Kitbashery.Gameplay 34 | { 35 | /// 36 | /// Modifies the components of colliding s. 37 | /// 38 | [HelpURL("https://kitbashery.com/docs/game-kit/health-zone.html")] 39 | [AddComponentMenu("Kitbashery/Gameplay/Health Zone")] 40 | public class HealthZone : CollisionEvents 41 | { 42 | #region Properties: 43 | 44 | [Header("Health Zone:")] 45 | [Space] 46 | public HealthModifiers modifier = HealthModifiers.damage; 47 | [Tooltip("Amount of health to modify per frame.")] 48 | [Min(0)] 49 | public int amount = 1; 50 | 51 | /// 52 | /// Health components to apply damage to. 53 | /// 54 | [HideInInspector] 55 | public List targetHP = new List(); 56 | 57 | /// 58 | /// The last health components registered/unregisterd. 59 | /// 60 | [HideInInspector] 61 | public Health lastHealth; 62 | 63 | #endregion 64 | 65 | #if UNITY_EDITOR 66 | private void OnValidate() 67 | { 68 | //Autofill events: 69 | if (enterEvent == null) 70 | { 71 | enterEvent = new UnityEvent(); 72 | UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(enterEvent, RegisterTarget); 73 | } 74 | else if(EventContainsListenerWithMethod(enterEvent, "RegisterTarget") == false) 75 | { 76 | UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(enterEvent, RegisterTarget); 77 | } 78 | 79 | if (exitEvent == null) 80 | { 81 | exitEvent = new UnityEvent(); 82 | UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(exitEvent, UnregisterTarget); 83 | } 84 | else if(EventContainsListenerWithMethod(exitEvent, "UnregisterTarget") == false) 85 | { 86 | UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(exitEvent, UnregisterTarget); 87 | } 88 | 89 | if (stayEvent == null) 90 | { 91 | stayEvent = new UnityEvent(); 92 | UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(stayEvent, ModifyHealth); 93 | } 94 | else if (EventContainsListenerWithMethod(stayEvent, "ModifyHealth") == false) 95 | { 96 | UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(stayEvent, ModifyHealth); 97 | } 98 | } 99 | #endif 100 | 101 | #region Core Functions: 102 | 103 | /// 104 | /// Health change is updated per frame to all components in the target list. 105 | /// 106 | public void ModifyHealth() 107 | { 108 | if (targetHP.Count > 0) 109 | { 110 | foreach(Health hp in targetHP) 111 | { 112 | hp.ModifyHealth(modifier, amount); 113 | } 114 | } 115 | } 116 | 117 | /// 118 | /// Tries to get the component of the last collider that made contact and add it to the target list. 119 | /// 120 | public void RegisterTarget() 121 | { 122 | lastHealth = lastContact.gameObject.GetComponent(); 123 | if (lastHealth != null) 124 | { 125 | targetHP.Add(lastHealth); 126 | } 127 | } 128 | 129 | /// 130 | /// Tries to get the component of the last collider that left contact and removes it from the target list. 131 | /// 132 | public void UnregisterTarget() 133 | { 134 | lastHealth = lastContact.gameObject.GetComponent(); 135 | if(lastHealth != null) 136 | { 137 | targetHP.Remove(lastHealth); 138 | } 139 | } 140 | 141 | /// 142 | /// Adds the required listeners to the s in the base class. Call if adding this component via script. 143 | /// 144 | public void AddListeners() 145 | { 146 | enterEvent.AddListener(RegisterTarget); 147 | exitEvent.AddListener(UnregisterTarget); 148 | stayEvent.AddListener(ModifyHealth); 149 | } 150 | 151 | #endregion 152 | } 153 | } -------------------------------------------------------------------------------- /Runtime/HealthZone.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 19cd1953f62ae9040b5319c19cf3e9ca 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 98fa57431c5f8bb44b84110b86f3699c, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/ObjectPools.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | /* 6 | MIT License 7 | 8 | Copyright (c) 2022 Kitbashery 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | 28 | 29 | 30 | Need support or additional features? Please visit https://kitbashery.com/ 31 | */ 32 | 33 | namespace Kitbashery.Gameplay 34 | { 35 | /// 36 | /// A singleton class for managing multiple pools of s. 37 | /// 38 | [HelpURL("https://kitbashery.com/docs/game-kit/object-pools.html")] 39 | [DisallowMultipleComponent] 40 | [AddComponentMenu("Kitbashery/Gameplay/Object Pools")] 41 | public class ObjectPools : MonoBehaviour 42 | { 43 | #region Properties: 44 | 45 | public static ObjectPools Instance; 46 | 47 | /// 48 | /// A non-reorderable list of s. 49 | /// 50 | [NonReorderable] 51 | public List pools = new List(); 52 | 53 | private Dictionary namedPools = new Dictionary(); 54 | 55 | /// 56 | /// Temporary GameObject used when populating pools. 57 | /// 58 | private GameObject tmp; 59 | 60 | #endregion 61 | 62 | #region Initialization & Updates: 63 | 64 | void Awake() 65 | { 66 | if (Instance != null && Instance != this) 67 | { 68 | Destroy(this); 69 | } 70 | else 71 | { 72 | Instance = this; 73 | } 74 | } 75 | 76 | void Start() 77 | { 78 | CreatePools(); 79 | } 80 | 81 | #endregion 82 | 83 | #region Core Functions: 84 | 85 | public void CreatePools() 86 | { 87 | foreach (Pool pool in pools) 88 | { 89 | if (!namedPools.ContainsKey(pool.prefab.name)) 90 | { 91 | PopulatePool(pool); 92 | namedPools.Add(pool.prefab.name, pool); 93 | } 94 | else 95 | { 96 | Debug.LogWarningFormat("|Object Pool|: Failed to create pool ({0}) a pool already exisits for that prefab, concider renaming.", pool.prefab.name); 97 | } 98 | } 99 | tmp = null; 100 | } 101 | 102 | public void PopulatePool(Pool pool) 103 | { 104 | if (pool.pooledObjects.Count < pool.amount) 105 | { 106 | for (int i = 0; i < pool.amount; i++) 107 | { 108 | tmp = Instantiate(pool.prefab); 109 | tmp.SetActive(false); 110 | tmp.gameObject.hideFlags = pool.hideFlags; 111 | if (pool.sequencialNaming == true) 112 | { 113 | tmp.gameObject.name = pool.prefab.name + " " + i; 114 | } 115 | pool.pooledObjects.Add(tmp); 116 | } 117 | } 118 | } 119 | 120 | public void ExpandPool(Pool pool, int amount) 121 | { 122 | pool.amount += amount; 123 | PopulatePool(pool); 124 | } 125 | 126 | /// 127 | /// Destroys all objects in all pools. 128 | /// 129 | /// Preserve pooled GameObjects that are currently active in the scene. 130 | public void DestroyPools(bool omitActive) 131 | { 132 | foreach (Pool pool in pools) 133 | { 134 | for (int i = pool.pooledObjects.Count; i > 0; i--) 135 | { 136 | if (omitActive == false) 137 | { 138 | Destroy(pool.pooledObjects[i]); 139 | } 140 | else 141 | { 142 | if (pool.pooledObjects[i].activeSelf == false) 143 | { 144 | Destroy(pool.pooledObjects[i]); 145 | } 146 | } 147 | } 148 | 149 | pool.pooledObjects.Clear(); 150 | } 151 | } 152 | 153 | public void ActivatePooledObject(int index) 154 | { 155 | if (index <= pools.Count) 156 | { 157 | for (int i = 0; i < pools[index].amount; i++) 158 | { 159 | if (!pools[index].pooledObjects[i].activeInHierarchy) 160 | { 161 | pools[index].pooledObjects[i].SetActive(true); 162 | } 163 | } 164 | } 165 | else 166 | { 167 | Debug.LogWarningFormat("|Object Pool|: failed to activate GameObject from pool {0} GameObject will be null, make sure the index is within range.", index); 168 | } 169 | } 170 | 171 | public void ActivatePooledObject(string prefabName) 172 | { 173 | if (!string.IsNullOrEmpty(prefabName) && namedPools.ContainsKey(prefabName)) 174 | { 175 | for (int i = 0; i < namedPools[prefabName].amount; i++) 176 | { 177 | if (!namedPools[prefabName].pooledObjects[i].activeInHierarchy) 178 | { 179 | namedPools[prefabName].pooledObjects[i].SetActive(true); 180 | } 181 | } 182 | } 183 | else 184 | { 185 | Debug.LogWarningFormat("|Object Pool|: failed to activate GameObject from pool ({0}) GameObject will be null, make sure the name is correct.", name); 186 | } 187 | } 188 | 189 | /// 190 | /// Gets a pooled GameObject by the index of its pool. 191 | /// 192 | /// The index of a pool in . 193 | /// The first inactive prefab instance. 194 | public GameObject GetPooledObject(int index) 195 | { 196 | if (index <= pools.Count) 197 | { 198 | for (int i = 0; i < pools[index].amount; i++) 199 | { 200 | if (!pools[index].pooledObjects[i].activeInHierarchy) 201 | { 202 | return pools[index].pooledObjects[i]; 203 | } 204 | } 205 | } 206 | else 207 | { 208 | Debug.LogWarningFormat("|Object Pool|: failed to get GameObject from pool {0} GameObject will be null, make sure the index is within range.", index); 209 | } 210 | 211 | return null; 212 | } 213 | 214 | /// 215 | /// Gets a pooled GameObject by its prefab name. 216 | /// 217 | /// The name of the prefab to get an instance of. 218 | /// The first inactive prefab instance. 219 | public GameObject GetPooledObject(string prefabName) 220 | { 221 | if (!string.IsNullOrEmpty(prefabName) && namedPools.ContainsKey(prefabName)) 222 | { 223 | for (int i = 0; i < namedPools[prefabName].amount; i++) 224 | { 225 | if (!namedPools[prefabName].pooledObjects[i].activeInHierarchy) 226 | { 227 | return namedPools[prefabName].pooledObjects[i]; 228 | } 229 | } 230 | } 231 | else 232 | { 233 | Debug.LogWarningFormat("|Object Pool|: failed to get GameObject from pool ({0}) GameObject will be null, make sure the name is correct.", name); 234 | } 235 | 236 | return null; 237 | } 238 | 239 | #endregion 240 | } 241 | 242 | [Serializable] 243 | public struct Pool 244 | { 245 | [Tooltip("The GameObject to pool.")] 246 | public GameObject prefab; 247 | [Tooltip("The initial amount of GameObjects to instantiate.")] 248 | [Min(1)] 249 | public int amount; 250 | [Tooltip("HideFlags for prefabs instantiated via the pooling system. Useful for hiding pooled objects in the heirarchy.")] 251 | public HideFlags hideFlags; 252 | [Tooltip("Use numbered names for GameObjects instead of name(clone).")] 253 | public bool sequencialNaming; 254 | [Tooltip("The GameObjects currently pooled.")] 255 | public List pooledObjects; 256 | } 257 | 258 | [Serializable] 259 | public struct PoolID 260 | { 261 | [Tooltip("The index of a pool in the ObjectPools instance pool list.")] 262 | [Min(0)] 263 | public int poolIndex; 264 | 265 | [Tooltip("If specified the spawner will try to get GameObjects from the pool by the prefab name instead of index.")] 266 | public string prefabName; 267 | } 268 | } -------------------------------------------------------------------------------- /Runtime/ObjectPools.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0106a81881bee9248bb49427003b5364 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 73a4d41112a438a42947614be5d5cf9d, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/Projectile.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.Events; 3 | 4 | /* 5 | MIT License 6 | 7 | Copyright (c) 2022 Kitbashery 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy 10 | of this software and associated documentation files (the "Software"), to deal 11 | in the Software without restriction, including without limitation the rights 12 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | copies of the Software, and to permit persons to whom the Software is 14 | furnished to do so, subject to the following conditions: 15 | 16 | The above copyright notice and this permission notice shall be included in all 17 | copies or substantial portions of the Software. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | SOFTWARE. 26 | 27 | 28 | 29 | Need support or additional features? Please visit https://kitbashery.com/ 30 | */ 31 | 32 | namespace Kitbashery.Gameplay 33 | { 34 | /// 35 | /// A physics based projectile. 36 | /// 37 | [HelpURL("https://kitbashery.com/docs/game-kit/projectile.html")] 38 | [AddComponentMenu("Kitbashery/Physics/Projectile")] 39 | [RequireComponent(typeof(Rigidbody))] 40 | public class Projectile : CollisionEvents 41 | { 42 | #region Properties: 43 | 44 | [Header("Projectile:")] 45 | public Rigidbody rigid; 46 | 47 | [Space] 48 | [Tooltip("Should force be applied to the hit rigidbody?")] 49 | public bool applyForceOnImpact = true; 50 | [Tooltip("Force applied to the rigidbody of hit colliders.")] 51 | public float impactForce = 1f; 52 | [Tooltip("Initial velocity of the rigidbody.")] 53 | public float velocity = 500f; 54 | 55 | [Space] 56 | [Tooltip("Should health be modified on impact?")] 57 | public bool modifyHealthOnImpact = false; 58 | public TimedHealthEffect healthEffect; 59 | 60 | /// 61 | /// The last health component registered/unregisterd. 62 | /// 63 | private Health lastHealth; 64 | 65 | [Space] 66 | [Tooltip("Should the projectile be disabled on impact? (useful for pooling).")] 67 | public bool disableOnImpact = true; 68 | [Tooltip("How many times should the projectile be allowed to bounce before it can be disabled?")] 69 | [Min(0)] 70 | public int ricochets = 0; 71 | public UnityEvent onRicochet; 72 | [Min(0)] 73 | private int currentRicochets = 0; 74 | [Tooltip("Should the GameObject be deactivated after lifeTime has elapsed.")] 75 | public bool useLifeTime = true; 76 | [Tooltip("How long this projectile will live before being deactivated (in seconds).")] 77 | public float lifeTime = 10f; 78 | [Min(0)] 79 | private float life = 0f; 80 | 81 | [Space] 82 | public bool seekTarget = false; 83 | public Transform target; 84 | [Tooltip("Determines how a target should be selected if target is not initially defined.")] 85 | public TargetModes targetMode = TargetModes.targetFirst; 86 | [Tooltip("The layer(s) to search for a target in.")] 87 | public LayerMask layerMask; 88 | [Tooltip("How should the projectile interact with trigger colliders?")] 89 | public QueryTriggerInteraction triggerInteraction = QueryTriggerInteraction.Ignore; 90 | /// 91 | /// Raycast hits collected when the projectile searches for targets to seek. 92 | /// 93 | [HideInInspector] 94 | public RaycastHit[] hits; 95 | [Tooltip("The tag required for a GameObject to be set as a target. (leave blank if you don't need this).")] 96 | public string targetTag; 97 | [Tooltip("The range to search for a target in.")] 98 | public float searchRange = 10f; 99 | [Tooltip("The speed at which the projectile will travel to the target.")] 100 | public float seekSpeed = 10f; 101 | 102 | 103 | #endregion 104 | 105 | #region Initialziation & Updates: 106 | 107 | private void Awake() 108 | { 109 | if(rigid == null) 110 | { 111 | rigid = gameObject.GetComponent(); 112 | } 113 | } 114 | 115 | #if UNITY_EDITOR 116 | private void OnValidate() 117 | { 118 | //Autofill events: 119 | if(enterEvent == null) 120 | { 121 | enterEvent = new UnityEngine.Events.UnityEvent(); 122 | UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(enterEvent, Impact); 123 | 124 | healthEffect.amount = 1; 125 | healthEffect.times = 1; 126 | } 127 | else if (EventContainsListenerWithMethod(enterEvent, "Impact") == false) 128 | { 129 | UnityEditor.Events.UnityEventTools.AddVoidPersistentListener(enterEvent, Impact); 130 | } 131 | } 132 | #endif 133 | 134 | private void OnEnable() 135 | { 136 | if (seekTarget == true && target == null) 137 | { 138 | FindBestTarget(); 139 | } 140 | 141 | rigid.velocity = Vector3.zero; 142 | rigid.AddForce(transform.forward * velocity, ForceMode.Impulse); 143 | } 144 | 145 | private void OnDisable() 146 | { 147 | transform.position = Vector3.zero; 148 | transform.rotation = Quaternion.identity; 149 | lastHealth = null; 150 | target = null; 151 | life = 0; 152 | currentRicochets = 0; 153 | } 154 | 155 | private void Update() 156 | { 157 | if(useLifeTime == true) 158 | { 159 | life += Time.deltaTime; 160 | if (life >= lifeTime) 161 | { 162 | gameObject.SetActive(false); 163 | } 164 | } 165 | } 166 | 167 | private void FixedUpdate() 168 | { 169 | if (seekTarget == true && target != null) 170 | { 171 | transform.LookAt(target); 172 | rigid.AddForce((target.position - transform.position).normalized * seekSpeed); 173 | } 174 | } 175 | 176 | #endregion 177 | 178 | public void Impact() 179 | { 180 | if(lastContact != null) 181 | { 182 | if (applyForceOnImpact == true) 183 | { 184 | Vector3 hit = lastContact.ClosestPoint(transform.position); 185 | if(lastContact.attachedRigidbody != null) 186 | { 187 | lastContact.attachedRigidbody.AddForceAtPosition(Vector3.one * impactForce, hit); 188 | } 189 | } 190 | 191 | if (modifyHealthOnImpact == true) 192 | { 193 | lastHealth = lastContact.GetComponent(); 194 | if (healthEffect.times > 1) 195 | { 196 | lastHealth.ModifyHealthOverTime(healthEffect); 197 | } 198 | else 199 | { 200 | lastHealth.ModifyHealth(healthEffect.modifier, healthEffect.amount); 201 | } 202 | } 203 | } 204 | 205 | if(ricochets > 0 && lastCollision != null) 206 | { 207 | if(disableOnImpact == true && currentRicochets == ricochets) 208 | { 209 | gameObject.SetActive(false); 210 | } 211 | else 212 | { 213 | onRicochet.Invoke(); 214 | rigid.velocity = Vector3.zero; 215 | Vector3 richochet = -lastCollision.GetContact(0).normal; 216 | transform.LookAt(richochet); 217 | rigid.AddForce(richochet * (velocity / currentRicochets), ForceMode.Impulse); 218 | currentRicochets++; 219 | } 220 | } 221 | else 222 | { 223 | if(disableOnImpact == true) 224 | { 225 | gameObject.SetActive(false); 226 | } 227 | } 228 | } 229 | 230 | /// 231 | /// Call if adding this component via script. 232 | /// 233 | public void AddImpactListener() 234 | { 235 | enterEvent.AddListener(Impact); 236 | } 237 | 238 | /// 239 | /// Finds the best target for the projectile to seek to. 240 | /// 241 | public void FindBestTarget() 242 | { 243 | Physics.SphereCastNonAlloc(transform.position, searchRange, Vector3.zero, hits, Mathf.Infinity, layerMask, triggerInteraction); 244 | if (hits.Length > 0) 245 | { 246 | Transform bestTarget = null; 247 | 248 | switch (targetMode) 249 | { 250 | case TargetModes.targetFirst: 251 | 252 | foreach (RaycastHit hit in hits) 253 | { 254 | if (string.IsNullOrEmpty(targetTag) || hit.transform.gameObject.CompareTag(targetTag) == true) 255 | { 256 | bestTarget = hit.transform; 257 | } 258 | } 259 | 260 | break; 261 | 262 | case TargetModes.targetNearest: 263 | 264 | float nearestDistance = Mathf.Infinity; 265 | foreach (RaycastHit hit in hits) 266 | { 267 | if (string.IsNullOrEmpty(targetTag) || hit.transform.gameObject.CompareTag(targetTag) == true) 268 | { 269 | float distance = Vector3.Distance(transform.position, hit.transform.position); 270 | if (distance < nearestDistance) 271 | { 272 | nearestDistance = distance; 273 | bestTarget = hit.transform; 274 | } 275 | } 276 | } 277 | 278 | break; 279 | 280 | case TargetModes.targetFarthest: 281 | 282 | float farthestDistance = 0; 283 | foreach (RaycastHit hit in hits) 284 | { 285 | if (string.IsNullOrEmpty(targetTag) || hit.transform.gameObject.CompareTag(targetTag) == true) 286 | { 287 | float distance = Vector3.Distance(transform.position, hit.transform.position); 288 | if (distance > farthestDistance) 289 | { 290 | farthestDistance = distance; 291 | bestTarget = hit.transform; 292 | } 293 | } 294 | } 295 | 296 | break; 297 | } 298 | 299 | target = bestTarget; 300 | } 301 | } 302 | } 303 | 304 | public enum TargetModes { targetFirst, targetNearest, targetFarthest } 305 | } -------------------------------------------------------------------------------- /Runtime/Projectile.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 49df814edf10eda419221794ab9a80c1 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 54f72835463919a4b8cd30bfd216feb8, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/Spawner.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using UnityEngine; 5 | using UnityEngine.Events; 6 | 7 | /* 8 | MIT License 9 | 10 | Copyright (c) 2022 Kitbashery 11 | 12 | Permission is hereby granted, free of charge, to any person obtaining a copy 13 | of this software and associated documentation files (the "Software"), to deal 14 | in the Software without restriction, including without limitation the rights 15 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 16 | copies of the Software, and to permit persons to whom the Software is 17 | furnished to do so, subject to the following conditions: 18 | 19 | The above copyright notice and this permission notice shall be included in all 20 | copies or substantial portions of the Software. 21 | 22 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 26 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 27 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 28 | SOFTWARE. 29 | 30 | 31 | 32 | Need support or additional features? Please visit https://kitbashery.com/ 33 | */ 34 | 35 | namespace Kitbashery.Gameplay 36 | { 37 | /// 38 | /// Enables GameObjects pooled by in sequential waves. 39 | /// 40 | [HelpURL("https://kitbashery.com/docs/game-kit/spawner.html")] 41 | [AddComponentMenu("Kitbashery/Gameplay/Spawner")] 42 | public class Spawner : MonoBehaviour 43 | { 44 | #region Properties: 45 | 46 | [field: SerializeField] 47 | public bool canSpawn { get; set; } 48 | 49 | [field: SerializeField, Tooltip("Spawned GameObjects will be positioned in the direction the spawner is facing.")] 50 | public bool spawnForward { get; set; } = false; 51 | [field: SerializeField, Tooltip("How far forward to spawn a GameObject (if Spawn Forward is checked).")] 52 | public float forwardDistance { get; set; } = 0; 53 | public Vector3 spawnOffset; 54 | [Tooltip("Sequential information on what pool to spawn GameObjects from, how often and how many.")] 55 | public List waves = new List(); 56 | 57 | [HideInInspector] 58 | public GameObject lastSpawned; 59 | 60 | [HideInInspector] 61 | [Min(0)] 62 | public int currentWave = 0; 63 | 64 | [HideInInspector] 65 | [Min(0)] 66 | public int currentWaveSpawns = 0; 67 | 68 | private float currentTime = 0; 69 | 70 | #endregion 71 | 72 | #region Initialization & Updates: 73 | 74 | private void Start() 75 | { 76 | if (ObjectPools.Instance == null) 77 | { 78 | Debug.LogWarning("There is not an instance of ObjectPools in the scene. Disabling spawner."); 79 | canSpawn = false; 80 | } 81 | } 82 | 83 | // Update is called once per frame. 84 | void Update() 85 | { 86 | if (canSpawn == true) 87 | { 88 | if (waves.Count > 0) 89 | { 90 | if (currentWave > waves.Count) 91 | { 92 | currentWave = 0; 93 | } 94 | else 95 | { 96 | currentTime += Time.deltaTime; 97 | if (currentTime >= waves[currentWave].interval) 98 | { 99 | if (!string.IsNullOrEmpty(waves[currentWave].poolIdentifiers[currentWaveSpawns].prefabName)) 100 | { 101 | lastSpawned = ObjectPools.Instance.GetPooledObject(waves[currentWave].poolIdentifiers[currentWaveSpawns].prefabName); 102 | } 103 | else 104 | { 105 | lastSpawned = ObjectPools.Instance.GetPooledObject(waves[currentWave].poolIdentifiers[currentWaveSpawns].poolIndex); 106 | } 107 | 108 | if (lastSpawned != null) 109 | { 110 | waves[currentWave].onSpawn.Invoke(); 111 | 112 | lastSpawned.transform.rotation = transform.rotation; 113 | if (spawnForward == true) 114 | { 115 | lastSpawned.transform.position = transform.TransformPoint((transform.forward * forwardDistance) + spawnOffset); 116 | } 117 | else 118 | { 119 | lastSpawned.transform.position = transform.TransformPoint(spawnOffset); 120 | } 121 | 122 | lastSpawned.SetActive(true); 123 | } 124 | else 125 | { 126 | Debug.LogWarning("|Spawner|: Failed to spawn, make sure all wave amounts are less than or equal to the pool's max amount or increase the pool's amount.", gameObject); 127 | } 128 | 129 | currentWaveSpawns++; 130 | if (currentWaveSpawns == waves[currentWave].poolIdentifiers.Count) 131 | { 132 | currentWaveSpawns = 0; 133 | currentWave++; 134 | if (currentWave == waves.Count) 135 | { 136 | currentWave = 0; 137 | canSpawn = false; 138 | } 139 | waves[currentWave].onWaveComplete.Invoke(); 140 | } 141 | 142 | currentTime = 0; 143 | } 144 | } 145 | } 146 | else 147 | { 148 | Debug.LogWarning("|Spawner|: Trying to spawn but no waves are defined.", gameObject); 149 | } 150 | } 151 | } 152 | 153 | private void OnDrawGizmosSelected() 154 | { 155 | Gizmos.color = Color.green; 156 | if (spawnForward == true) 157 | { 158 | Gizmos.DrawSphere(transform.TransformPoint((transform.forward * forwardDistance) + spawnOffset), 0.1f); 159 | } 160 | else 161 | { 162 | Gizmos.DrawSphere(transform.position + spawnOffset, 0.1f); 163 | } 164 | } 165 | 166 | private IEnumerator Delay(float time) 167 | { 168 | canSpawn = false; 169 | yield return new WaitForSeconds(time); 170 | canSpawn = true; 171 | } 172 | 173 | #endregion 174 | 175 | #region Core Functions: 176 | 177 | public void DelaySpawn(float time) 178 | { 179 | StartCoroutine(Delay(time)); 180 | } 181 | 182 | public void SetWave(int wave) 183 | { 184 | if (wave <= waves.Count) 185 | { 186 | currentWave = 0; 187 | } 188 | else 189 | { 190 | Debug.LogWarning("|Spawner|: Tried to set the wave beyond the maximum amount of waves.", gameObject); 191 | } 192 | 193 | } 194 | 195 | /// 196 | /// Randomizes the spawns of a wave. 197 | /// 198 | /// The wave to randomize. 199 | /// The wave with randomized spawns. 200 | public Wave RandomizeWave(Wave wave) 201 | { 202 | List ids = new List(); 203 | for(int i = 0; i < wave.spawnAmount; i++) 204 | { 205 | PoolID id = new(); 206 | id.poolIndex = wave.randomPools[UnityEngine.Random.Range(0, wave.randomPools.Count)]; 207 | ids.Add(id); 208 | } 209 | wave.poolIdentifiers = ids; 210 | 211 | return wave; 212 | } 213 | 214 | /// 215 | /// Randomizes all waves that have randomWaves set to true. 216 | /// 217 | public void RandomizeWaves() 218 | { 219 | for(int i = 0; i < waves.Count; i++) 220 | { 221 | if (waves[i].randomizeWaves == true) 222 | { 223 | waves[i] = RandomizeWave(waves[i]); 224 | } 225 | } 226 | } 227 | 228 | public void DebugCurrentWave() 229 | { 230 | Debug.LogFormat(gameObject, "|Spawner|: Currently on wave {0} of {1} and has spawned {2} of {3} times.", currentWave, waves.Count, currentWaveSpawns, waves[currentWave].poolIdentifiers.Count); 231 | } 232 | 233 | public void RandomizeSpawnOffset(float radius) 234 | { 235 | UnityEngine.Random.InitState(spawnOffset.GetHashCode()); 236 | spawnOffset = UnityEngine.Random.insideUnitSphere * radius; 237 | } 238 | 239 | #endregion 240 | } 241 | 242 | /// 243 | /// Defines spawns used by to enable pooled GameObjects. 244 | /// 245 | [Serializable] 246 | public struct Wave 247 | { 248 | [Space] 249 | [Tooltip("Time in seconds between spawns.")] 250 | [Min(0)] 251 | public float interval; 252 | 253 | [Tooltip("The amount of spawns in this wave.")] 254 | public int spawnAmount; 255 | 256 | public UnityEvent onSpawn; 257 | 258 | public UnityEvent onWaveComplete; 259 | 260 | [Tooltip("Defines the prefabs to enable from a pool during this wave.")] 261 | public List poolIdentifiers; 262 | 263 | [Space] 264 | [Tooltip("Should spawns be randomized? (used instead of poolIdentifiers).")] 265 | public bool randomizeWaves; 266 | [Tooltip("Pool indices to select spawns from.")] 267 | public List randomPools; 268 | } 269 | } -------------------------------------------------------------------------------- /Runtime/Spawner.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a746ef034d374934ca8e42907c796477 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 530cffd1eb210d24c83d59eb68e3f69f, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/TimeManager.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using UnityEngine.Events; 5 | using UnityEngine.UI; 6 | using TMPro; 7 | 8 | #if ENABLE_INPUT_SYSTEM 9 | using UnityEngine.InputSystem; 10 | using UnityEngine.InputSystem.Controls; 11 | #endif 12 | 13 | namespace Kitbashery.Gameplay 14 | { 15 | /// 16 | /// Manages play/pause, framerate events and time scale effects. 17 | /// 18 | [HelpURL("https://kitbashery.com/docs/game-kit/time-manager.html")] 19 | [DisallowMultipleComponent] 20 | [AddComponentMenu("Kitbashery/Event/Time Manager")] 21 | public class TimeManager : MonoBehaviour 22 | { 23 | #region Properties: 24 | 25 | public static TimeManager Instance; 26 | 27 | [Header("Pause Settings:")] 28 | public KeyCode togglePauseKey = KeyCode.Escape; 29 | 30 | [field: SerializeField] 31 | public bool pauseAudio { get; set; } = true; 32 | [field: SerializeField] 33 | public bool pauseTime { get; set; } = true; 34 | [field: SerializeField] 35 | public bool showCursor { get; set; } = true; 36 | 37 | public UnityEvent onPause; 38 | 39 | public UnityEvent onUnPause; 40 | 41 | [HideInInspector] 42 | public bool paused = false; 43 | 44 | [HideInInspector] 45 | public bool modifyingTimeScale = false; 46 | 47 | [HideInInspector] 48 | public float currentTimeDuration = 0; 49 | 50 | [HideInInspector] 51 | public float currentTimeMultiplier = 0; 52 | 53 | private float initialTimeScale; 54 | 55 | [Header("FPS Counter:")] 56 | [Tooltip("Should fps counters be updated and fps events invoked?")] 57 | public bool debugFPS = false; 58 | public Text fpsCounter; 59 | public TMP_Text fpsCounterTMP; 60 | [Min(1)] 61 | public float targetFPS = 60; 62 | [HideInInspector] 63 | public float currentFPS; 64 | public UnityEvent onBelowTargetFPS; 65 | public UnityEvent onAboveTargetFPS; 66 | 67 | #endregion 68 | 69 | #region 70 | 71 | private void Awake() 72 | { 73 | if (Instance != null && Instance != this) 74 | { 75 | Destroy(this); 76 | } 77 | else 78 | { 79 | Instance = this; 80 | } 81 | 82 | initialTimeScale = Time.timeScale; 83 | } 84 | 85 | private void Update() 86 | { 87 | if(isPauseKeyPressed() == true) 88 | { 89 | TogglePause(); 90 | } 91 | 92 | if(debugFPS == true) 93 | { 94 | CountFPS(); 95 | } 96 | } 97 | 98 | private bool isPauseKeyPressed() 99 | { 100 | #if ENABLE_INPUT_SYSTEM 101 | return ((KeyControl)Keyboard.current[togglePauseKey.ToString()]).wasPressedThisFrame; 102 | #endif 103 | 104 | #if ENABLE_LEGACY_INPUT_MANAGER 105 | return Input.GetKeyDown(togglePauseKey) == true; 106 | #endif 107 | } 108 | 109 | private IEnumerator ModifyTimeScale() 110 | { 111 | Time.timeScale += currentTimeMultiplier; 112 | modifyingTimeScale = true; 113 | yield return new WaitForSeconds(currentTimeDuration); 114 | if (paused == false) 115 | { 116 | Time.timeScale = initialTimeScale; 117 | } 118 | else 119 | { 120 | Time.timeScale = 0; 121 | } 122 | currentTimeMultiplier = 0; 123 | currentTimeDuration = 0; 124 | modifyingTimeScale = false; 125 | } 126 | 127 | #endregion 128 | 129 | #region Methods: 130 | 131 | public void TogglePause() 132 | { 133 | if (paused == true) 134 | { 135 | if (pauseTime == true) 136 | { 137 | Time.timeScale = 0f; 138 | } 139 | 140 | if (pauseAudio == true) 141 | { 142 | AudioListener.pause = true; 143 | } 144 | 145 | if(showCursor == true) 146 | { 147 | Cursor.lockState = CursorLockMode.Confined; 148 | Cursor.visible = true; 149 | } 150 | onPause.Invoke(); 151 | } 152 | else 153 | { 154 | Time.timeScale = initialTimeScale; 155 | AudioListener.pause = false; 156 | if(showCursor == true) 157 | { 158 | Cursor.lockState = CursorLockMode.Locked; 159 | Cursor.visible = false; 160 | } 161 | onUnPause.Invoke(); 162 | } 163 | paused = !paused; 164 | } 165 | 166 | public void CountFPS() 167 | { 168 | currentFPS = 1f / Time.unscaledDeltaTime; 169 | 170 | if(fpsCounterTMP != null) 171 | { 172 | fpsCounterTMP.text = "FPS: " + ((int)currentFPS).ToString(); 173 | } 174 | else 175 | { 176 | if (fpsCounter != null) 177 | { 178 | fpsCounter.text = "FPS: " + ((int)currentFPS).ToString(); 179 | } 180 | } 181 | 182 | if(currentFPS < targetFPS) 183 | { 184 | onBelowTargetFPS.Invoke(); 185 | } 186 | else if(currentFPS > targetFPS) 187 | { 188 | onAboveTargetFPS.Invoke(); 189 | } 190 | } 191 | 192 | public void DebugFPS() 193 | { 194 | Debug.Log(((int)currentFPS).ToString()); 195 | } 196 | 197 | /// 198 | /// Scales the time of the game for the specified duration. 199 | /// 200 | /// How much to add to the timescale. 201 | /// The duration of the effect. 202 | /// Should the current multiplier be added onto. 203 | /// Should the current durration be added onto. 204 | public void ScaleTime(float multiplier, float duration, bool addMultiplier, bool addDuration) 205 | { 206 | if (modifyingTimeScale == true) 207 | { 208 | StopCoroutine(ModifyTimeScale()); 209 | if (addDuration == true) 210 | { 211 | currentTimeDuration += duration; 212 | } 213 | else 214 | { 215 | currentTimeDuration = duration; 216 | } 217 | 218 | if (addMultiplier == true) 219 | { 220 | currentTimeMultiplier += duration; 221 | } 222 | else 223 | { 224 | currentTimeMultiplier = multiplier; 225 | } 226 | StartCoroutine(ModifyTimeScale()); 227 | } 228 | else 229 | { 230 | currentTimeDuration = duration; 231 | currentTimeMultiplier = multiplier; 232 | StartCoroutine(ModifyTimeScale()); 233 | } 234 | } 235 | 236 | /// 237 | /// Slows the time scale to half speed (overrides ScaleTime effects). 238 | /// 239 | /// How long the slow motion effect lasts. 240 | public void SlowMoHalfSpeed(float duration) 241 | { 242 | if (modifyingTimeScale == true) 243 | { 244 | StopCoroutine(ModifyTimeScale()); 245 | } 246 | currentTimeDuration = duration; 247 | Time.timeScale = initialTimeScale / 2; 248 | currentTimeMultiplier = 0; 249 | StartCoroutine(ModifyTimeScale()); 250 | } 251 | 252 | #endregion 253 | } 254 | } 255 | -------------------------------------------------------------------------------- /Runtime/TimeManager.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d286f65bd2844b8498ac95cfbd8de857 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: e22227f5d8588bd409651653feb95a90, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Runtime/kitbashery.game-kit.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kitbashery.game-kit", 3 | "rootNamespace": "", 4 | "references": [ 5 | "GUID:6055be8ebefd69e48b49212b09b47b2f", 6 | "GUID:75469ad4d38634e559750d17036d5f7c" 7 | ], 8 | "includePlatforms": [], 9 | "excludePlatforms": [], 10 | "allowUnsafeCode": false, 11 | "overrideReferences": false, 12 | "precompiledReferences": [], 13 | "autoReferenced": true, 14 | "defineConstraints": [], 15 | "versionDefines": [], 16 | "noEngineReferences": false 17 | } -------------------------------------------------------------------------------- /Runtime/kitbashery.game-kit.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 10bd4f94ce0396a46b8d3cebc38a19dc 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Samples~/Demo.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f0e4cdcf495e3514fae9da2ad0155cb7 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Samples~/Demo/Demo Sphere.prefab: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1 &8584135303632376971 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: 2684473636813238548} 12 | - component: {fileID: 5421185522491994082} 13 | - component: {fileID: 4402657934764809078} 14 | - component: {fileID: 3009970984603776332} 15 | - component: {fileID: 5725633749661894332} 16 | - component: {fileID: 7524617555889825348} 17 | m_Layer: 0 18 | m_Name: Demo Sphere 19 | m_TagString: Untagged 20 | m_Icon: {fileID: 0} 21 | m_NavMeshLayer: 0 22 | m_StaticEditorFlags: 0 23 | m_IsActive: 1 24 | --- !u!4 &2684473636813238548 25 | Transform: 26 | m_ObjectHideFlags: 0 27 | m_CorrespondingSourceObject: {fileID: 0} 28 | m_PrefabInstance: {fileID: 0} 29 | m_PrefabAsset: {fileID: 0} 30 | m_GameObject: {fileID: 8584135303632376971} 31 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 32 | m_LocalPosition: {x: 0, y: 0, z: 0} 33 | m_LocalScale: {x: 1, y: 1, z: 1} 34 | m_ConstrainProportionsScale: 0 35 | m_Children: [] 36 | m_Father: {fileID: 0} 37 | m_RootOrder: 0 38 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 39 | --- !u!33 &5421185522491994082 40 | MeshFilter: 41 | m_ObjectHideFlags: 0 42 | m_CorrespondingSourceObject: {fileID: 0} 43 | m_PrefabInstance: {fileID: 0} 44 | m_PrefabAsset: {fileID: 0} 45 | m_GameObject: {fileID: 8584135303632376971} 46 | m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} 47 | --- !u!23 &4402657934764809078 48 | MeshRenderer: 49 | m_ObjectHideFlags: 0 50 | m_CorrespondingSourceObject: {fileID: 0} 51 | m_PrefabInstance: {fileID: 0} 52 | m_PrefabAsset: {fileID: 0} 53 | m_GameObject: {fileID: 8584135303632376971} 54 | m_Enabled: 1 55 | m_CastShadows: 1 56 | m_ReceiveShadows: 1 57 | m_DynamicOccludee: 1 58 | m_StaticShadowCaster: 0 59 | m_MotionVectors: 1 60 | m_LightProbeUsage: 1 61 | m_ReflectionProbeUsage: 1 62 | m_RayTracingMode: 2 63 | m_RayTraceProcedural: 0 64 | m_RenderingLayerMask: 1 65 | m_RendererPriority: 0 66 | m_Materials: 67 | - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} 68 | m_StaticBatchInfo: 69 | firstSubMesh: 0 70 | subMeshCount: 0 71 | m_StaticBatchRoot: {fileID: 0} 72 | m_ProbeAnchor: {fileID: 0} 73 | m_LightProbeVolumeOverride: {fileID: 0} 74 | m_ScaleInLightmap: 1 75 | m_ReceiveGI: 1 76 | m_PreserveUVs: 0 77 | m_IgnoreNormalsForChartDetection: 0 78 | m_ImportantGI: 0 79 | m_StitchLightmapSeams: 1 80 | m_SelectedEditorRenderState: 3 81 | m_MinimumChartSize: 4 82 | m_AutoUVMaxDistance: 0.5 83 | m_AutoUVMaxAngle: 89 84 | m_LightmapParameters: {fileID: 0} 85 | m_SortingLayerID: 0 86 | m_SortingLayer: 0 87 | m_SortingOrder: 0 88 | m_AdditionalVertexStreams: {fileID: 0} 89 | --- !u!135 &3009970984603776332 90 | SphereCollider: 91 | m_ObjectHideFlags: 0 92 | m_CorrespondingSourceObject: {fileID: 0} 93 | m_PrefabInstance: {fileID: 0} 94 | m_PrefabAsset: {fileID: 0} 95 | m_GameObject: {fileID: 8584135303632376971} 96 | m_Material: {fileID: 0} 97 | m_IsTrigger: 0 98 | m_Enabled: 1 99 | serializedVersion: 2 100 | m_Radius: 0.5 101 | m_Center: {x: 0, y: 0, z: 0} 102 | --- !u!114 &5725633749661894332 103 | MonoBehaviour: 104 | m_ObjectHideFlags: 0 105 | m_CorrespondingSourceObject: {fileID: 0} 106 | m_PrefabInstance: {fileID: 0} 107 | m_PrefabAsset: {fileID: 0} 108 | m_GameObject: {fileID: 8584135303632376971} 109 | m_Enabled: 1 110 | m_EditorHideFlags: 0 111 | m_Script: {fileID: 11500000, guid: bba5fb71024046749af5e8b7a9b5caf1, type: 3} 112 | m_Name: 113 | m_EditorClassIdentifier: 114 | invinsible: 0 115 | bonusHealth: {fileID: 0} 116 | hitPoints: 100 117 | canRegen: 0 118 | regenPoints: 1 119 | regenRate: 0.1 120 | onReceivedDamage: 121 | m_PersistentCalls: 122 | m_Calls: [] 123 | onHealed: 124 | m_PersistentCalls: 125 | m_Calls: [] 126 | onDead: 127 | m_PersistentCalls: 128 | m_Calls: [] 129 | --- !u!54 &7524617555889825348 130 | Rigidbody: 131 | m_ObjectHideFlags: 0 132 | m_CorrespondingSourceObject: {fileID: 0} 133 | m_PrefabInstance: {fileID: 0} 134 | m_PrefabAsset: {fileID: 0} 135 | m_GameObject: {fileID: 8584135303632376971} 136 | serializedVersion: 2 137 | m_Mass: 1 138 | m_Drag: 0 139 | m_AngularDrag: 0.05 140 | m_UseGravity: 1 141 | m_IsKinematic: 0 142 | m_Interpolate: 0 143 | m_Constraints: 0 144 | m_CollisionDetection: 0 145 | -------------------------------------------------------------------------------- /Samples~/Demo/Demo Sphere.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4a4d317d41134a94f8ca594bd9c5f6f3 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Samples~/Demo/Game Kit Demo.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: 10304, guid: 0000000000000000f000000000000000, type: 0} 30 | m_HaloStrength: 0.5 31 | m_FlareStrength: 1 32 | m_FlareFadeSpeed: 3 33 | m_HaloTexture: {fileID: 0} 34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} 35 | m_DefaultReflectionMode: 0 36 | m_DefaultReflectionResolution: 128 37 | m_ReflectionBounces: 1 38 | m_ReflectionIntensity: 1 39 | m_CustomReflection: {fileID: 0} 40 | m_Sun: {fileID: 0} 41 | m_IndirectSpecularColor: {r: 0.41679892, g: 0.44434357, b: 0.45980346, 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: 512 79 | m_PVRBounces: 2 80 | m_PVREnvironmentSampleCount: 256 81 | m_PVREnvironmentReferencePointCount: 2048 82 | m_PVRFilteringMode: 1 83 | m_PVRDenoiserTypeDirect: 1 84 | m_PVRDenoiserTypeIndirect: 1 85 | m_PVRDenoiserTypeAO: 1 86 | m_PVRFilterTypeDirect: 0 87 | m_PVRFilterTypeIndirect: 0 88 | m_PVRFilterTypeAO: 0 89 | m_PVREnvironmentMIS: 1 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 &9782536 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: 9782539} 135 | - component: {fileID: 9782538} 136 | - component: {fileID: 9782537} 137 | m_Layer: 0 138 | m_Name: Main Camera 139 | m_TagString: MainCamera 140 | m_Icon: {fileID: 0} 141 | m_NavMeshLayer: 0 142 | m_StaticEditorFlags: 0 143 | m_IsActive: 1 144 | --- !u!81 &9782537 145 | AudioListener: 146 | m_ObjectHideFlags: 0 147 | m_CorrespondingSourceObject: {fileID: 0} 148 | m_PrefabInstance: {fileID: 0} 149 | m_PrefabAsset: {fileID: 0} 150 | m_GameObject: {fileID: 9782536} 151 | m_Enabled: 1 152 | --- !u!20 &9782538 153 | Camera: 154 | m_ObjectHideFlags: 0 155 | m_CorrespondingSourceObject: {fileID: 0} 156 | m_PrefabInstance: {fileID: 0} 157 | m_PrefabAsset: {fileID: 0} 158 | m_GameObject: {fileID: 9782536} 159 | m_Enabled: 1 160 | serializedVersion: 2 161 | m_ClearFlags: 1 162 | m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} 163 | m_projectionMatrixMode: 1 164 | m_GateFitMode: 2 165 | m_FOVAxisMode: 0 166 | m_SensorSize: {x: 36, y: 24} 167 | m_LensShift: {x: 0, y: 0} 168 | m_FocalLength: 50 169 | m_NormalizedViewPortRect: 170 | serializedVersion: 2 171 | x: 0 172 | y: 0 173 | width: 1 174 | height: 1 175 | near clip plane: 0.3 176 | far clip plane: 1000 177 | field of view: 60 178 | orthographic: 0 179 | orthographic size: 5 180 | m_Depth: -1 181 | m_CullingMask: 182 | serializedVersion: 2 183 | m_Bits: 4294967295 184 | m_RenderingPath: -1 185 | m_TargetTexture: {fileID: 0} 186 | m_TargetDisplay: 0 187 | m_TargetEye: 3 188 | m_HDR: 1 189 | m_AllowMSAA: 1 190 | m_AllowDynamicResolution: 0 191 | m_ForceIntoRT: 0 192 | m_OcclusionCulling: 1 193 | m_StereoConvergence: 10 194 | m_StereoSeparation: 0.022 195 | --- !u!4 &9782539 196 | Transform: 197 | m_ObjectHideFlags: 0 198 | m_CorrespondingSourceObject: {fileID: 0} 199 | m_PrefabInstance: {fileID: 0} 200 | m_PrefabAsset: {fileID: 0} 201 | m_GameObject: {fileID: 9782536} 202 | m_LocalRotation: {x: 0.011410333, y: -0.9883825, z: 0.09698209, w: 0.11646631} 203 | m_LocalPosition: {x: 34.329803, y: 6.8915224, z: 18.13562} 204 | m_LocalScale: {x: 1, y: 1, z: 1} 205 | m_ConstrainProportionsScale: 0 206 | m_Children: [] 207 | m_Father: {fileID: 0} 208 | m_RootOrder: 0 209 | m_LocalEulerAnglesHint: {x: 0, y: -180, z: 0} 210 | --- !u!1 &43853249 211 | GameObject: 212 | m_ObjectHideFlags: 0 213 | m_CorrespondingSourceObject: {fileID: 0} 214 | m_PrefabInstance: {fileID: 0} 215 | m_PrefabAsset: {fileID: 0} 216 | serializedVersion: 6 217 | m_Component: 218 | - component: {fileID: 43853254} 219 | - component: {fileID: 43853251} 220 | - component: {fileID: 43853255} 221 | m_Layer: 0 222 | m_Name: Health Zone 223 | m_TagString: Untagged 224 | m_Icon: {fileID: 0} 225 | m_NavMeshLayer: 0 226 | m_StaticEditorFlags: 0 227 | m_IsActive: 0 228 | --- !u!65 &43853251 229 | BoxCollider: 230 | m_ObjectHideFlags: 0 231 | m_CorrespondingSourceObject: {fileID: 0} 232 | m_PrefabInstance: {fileID: 0} 233 | m_PrefabAsset: {fileID: 0} 234 | m_GameObject: {fileID: 43853249} 235 | m_Material: {fileID: 0} 236 | m_IsTrigger: 0 237 | m_Enabled: 1 238 | serializedVersion: 2 239 | m_Size: {x: 1, y: 1, z: 1} 240 | m_Center: {x: 0, y: 0, z: 0} 241 | --- !u!4 &43853254 242 | Transform: 243 | m_ObjectHideFlags: 0 244 | m_CorrespondingSourceObject: {fileID: 0} 245 | m_PrefabInstance: {fileID: 0} 246 | m_PrefabAsset: {fileID: 0} 247 | m_GameObject: {fileID: 43853249} 248 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 249 | m_LocalPosition: {x: 26.35, y: 0, z: 0} 250 | m_LocalScale: {x: 5, y: 1, z: 5} 251 | m_ConstrainProportionsScale: 0 252 | m_Children: [] 253 | m_Father: {fileID: 0} 254 | m_RootOrder: 6 255 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 256 | --- !u!114 &43853255 257 | MonoBehaviour: 258 | m_ObjectHideFlags: 0 259 | m_CorrespondingSourceObject: {fileID: 0} 260 | m_PrefabInstance: {fileID: 0} 261 | m_PrefabAsset: {fileID: 0} 262 | m_GameObject: {fileID: 43853249} 263 | m_Enabled: 1 264 | m_EditorHideFlags: 0 265 | m_Script: {fileID: 11500000, guid: 19cd1953f62ae9040b5319c19cf3e9ca, type: 3} 266 | m_Name: 267 | m_EditorClassIdentifier: 268 | isTrigger: 1 269 | maxCollisions: 50 270 | requiredTags: [] 271 | ignoredColliders: [] 272 | enterEvent: 273 | m_PersistentCalls: 274 | m_Calls: 275 | - m_Target: {fileID: 43853255} 276 | m_TargetAssemblyTypeName: Kitbashery.Gameplay.HealthZone, Assembly-CSharp 277 | m_MethodName: RegisterTarget 278 | m_Mode: 1 279 | m_Arguments: 280 | m_ObjectArgument: {fileID: 0} 281 | m_ObjectArgumentAssemblyTypeName: 282 | m_IntArgument: 0 283 | m_FloatArgument: 0 284 | m_StringArgument: 285 | m_BoolArgument: 0 286 | m_CallState: 2 287 | exitEvent: 288 | m_PersistentCalls: 289 | m_Calls: 290 | - m_Target: {fileID: 43853255} 291 | m_TargetAssemblyTypeName: Kitbashery.Gameplay.HealthZone, Assembly-CSharp 292 | m_MethodName: UnregisterTarget 293 | m_Mode: 1 294 | m_Arguments: 295 | m_ObjectArgument: {fileID: 0} 296 | m_ObjectArgumentAssemblyTypeName: 297 | m_IntArgument: 0 298 | m_FloatArgument: 0 299 | m_StringArgument: 300 | m_BoolArgument: 0 301 | m_CallState: 2 302 | stayEvent: 303 | m_PersistentCalls: 304 | m_Calls: 305 | - m_Target: {fileID: 43853255} 306 | m_TargetAssemblyTypeName: Kitbashery.Gameplay.HealthZone, Assembly-CSharp 307 | m_MethodName: ModifyHealth 308 | m_Mode: 1 309 | m_Arguments: 310 | m_ObjectArgument: {fileID: 0} 311 | m_ObjectArgumentAssemblyTypeName: 312 | m_IntArgument: 0 313 | m_FloatArgument: 0 314 | m_StringArgument: 315 | m_BoolArgument: 0 316 | m_CallState: 2 317 | lastContact: {fileID: 0} 318 | colliders: [] 319 | eventCollider: {fileID: 0} 320 | modifier: 0 321 | amount: 50 322 | targetHP: [] 323 | lastHealth: {fileID: 0} 324 | --- !u!1 &70724180 325 | GameObject: 326 | m_ObjectHideFlags: 0 327 | m_CorrespondingSourceObject: {fileID: 0} 328 | m_PrefabInstance: {fileID: 0} 329 | m_PrefabAsset: {fileID: 0} 330 | serializedVersion: 6 331 | m_Component: 332 | - component: {fileID: 70724182} 333 | - component: {fileID: 70724181} 334 | m_Layer: 0 335 | m_Name: Activation Events 336 | m_TagString: Untagged 337 | m_Icon: {fileID: 0} 338 | m_NavMeshLayer: 0 339 | m_StaticEditorFlags: 0 340 | m_IsActive: 1 341 | --- !u!114 &70724181 342 | MonoBehaviour: 343 | m_ObjectHideFlags: 0 344 | m_CorrespondingSourceObject: {fileID: 0} 345 | m_PrefabInstance: {fileID: 0} 346 | m_PrefabAsset: {fileID: 0} 347 | m_GameObject: {fileID: 70724180} 348 | m_Enabled: 1 349 | m_EditorHideFlags: 0 350 | m_Script: {fileID: 11500000, guid: a36c92081ad09b94593c7184174249da, type: 3} 351 | m_Name: 352 | m_EditorClassIdentifier: 353 | onAwake: 354 | m_PersistentCalls: 355 | m_Calls: [] 356 | onStart: 357 | m_PersistentCalls: 358 | m_Calls: 359 | - m_Target: {fileID: 1799891581} 360 | m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine 361 | m_MethodName: SetActive 362 | m_Mode: 6 363 | m_Arguments: 364 | m_ObjectArgument: {fileID: 0} 365 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 366 | m_IntArgument: 0 367 | m_FloatArgument: 0 368 | m_StringArgument: 369 | m_BoolArgument: 1 370 | m_CallState: 2 371 | - m_Target: {fileID: 163759811} 372 | m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine 373 | m_MethodName: SetActive 374 | m_Mode: 6 375 | m_Arguments: 376 | m_ObjectArgument: {fileID: 0} 377 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 378 | m_IntArgument: 0 379 | m_FloatArgument: 0 380 | m_StringArgument: 381 | m_BoolArgument: 1 382 | m_CallState: 2 383 | - m_Target: {fileID: 43853249} 384 | m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine 385 | m_MethodName: SetActive 386 | m_Mode: 6 387 | m_Arguments: 388 | m_ObjectArgument: {fileID: 0} 389 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 390 | m_IntArgument: 0 391 | m_FloatArgument: 0 392 | m_StringArgument: 393 | m_BoolArgument: 1 394 | m_CallState: 2 395 | - m_Target: {fileID: 1394021188} 396 | m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine 397 | m_MethodName: SetActive 398 | m_Mode: 6 399 | m_Arguments: 400 | m_ObjectArgument: {fileID: 0} 401 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 402 | m_IntArgument: 0 403 | m_FloatArgument: 0 404 | m_StringArgument: 405 | m_BoolArgument: 1 406 | m_CallState: 2 407 | - m_Target: {fileID: 751761738} 408 | m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine 409 | m_MethodName: SetActive 410 | m_Mode: 6 411 | m_Arguments: 412 | m_ObjectArgument: {fileID: 0} 413 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 414 | m_IntArgument: 0 415 | m_FloatArgument: 0 416 | m_StringArgument: 417 | m_BoolArgument: 1 418 | m_CallState: 2 419 | - m_Target: {fileID: 2065983280} 420 | m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine 421 | m_MethodName: SetActive 422 | m_Mode: 6 423 | m_Arguments: 424 | m_ObjectArgument: {fileID: 0} 425 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 426 | m_IntArgument: 0 427 | m_FloatArgument: 0 428 | m_StringArgument: 429 | m_BoolArgument: 1 430 | m_CallState: 2 431 | onEnable: 432 | m_PersistentCalls: 433 | m_Calls: [] 434 | onDisable: 435 | m_PersistentCalls: 436 | m_Calls: [] 437 | onDestroy: 438 | m_PersistentCalls: 439 | m_Calls: [] 440 | --- !u!4 &70724182 441 | Transform: 442 | m_ObjectHideFlags: 0 443 | m_CorrespondingSourceObject: {fileID: 0} 444 | m_PrefabInstance: {fileID: 0} 445 | m_PrefabAsset: {fileID: 0} 446 | m_GameObject: {fileID: 70724180} 447 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 448 | m_LocalPosition: {x: 25.196363, y: 4.657934, z: -1.9020252} 449 | m_LocalScale: {x: 1, y: 1, z: 1} 450 | m_ConstrainProportionsScale: 0 451 | m_Children: [] 452 | m_Father: {fileID: 0} 453 | m_RootOrder: 3 454 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 455 | --- !u!1 &137633614 456 | GameObject: 457 | m_ObjectHideFlags: 0 458 | m_CorrespondingSourceObject: {fileID: 0} 459 | m_PrefabInstance: {fileID: 0} 460 | m_PrefabAsset: {fileID: 0} 461 | serializedVersion: 6 462 | m_Component: 463 | - component: {fileID: 137633618} 464 | - component: {fileID: 137633617} 465 | - component: {fileID: 137633616} 466 | - component: {fileID: 137633615} 467 | m_Layer: 0 468 | m_Name: Cube 469 | m_TagString: Untagged 470 | m_Icon: {fileID: 0} 471 | m_NavMeshLayer: 0 472 | m_StaticEditorFlags: 0 473 | m_IsActive: 1 474 | --- !u!65 &137633615 475 | BoxCollider: 476 | m_ObjectHideFlags: 0 477 | m_CorrespondingSourceObject: {fileID: 0} 478 | m_PrefabInstance: {fileID: 0} 479 | m_PrefabAsset: {fileID: 0} 480 | m_GameObject: {fileID: 137633614} 481 | m_Material: {fileID: 0} 482 | m_IsTrigger: 0 483 | m_Enabled: 1 484 | serializedVersion: 2 485 | m_Size: {x: 1, y: 1, z: 1} 486 | m_Center: {x: 0, y: 0, z: 0} 487 | --- !u!23 &137633616 488 | MeshRenderer: 489 | m_ObjectHideFlags: 0 490 | m_CorrespondingSourceObject: {fileID: 0} 491 | m_PrefabInstance: {fileID: 0} 492 | m_PrefabAsset: {fileID: 0} 493 | m_GameObject: {fileID: 137633614} 494 | m_Enabled: 1 495 | m_CastShadows: 0 496 | m_ReceiveShadows: 1 497 | m_DynamicOccludee: 1 498 | m_StaticShadowCaster: 0 499 | m_MotionVectors: 1 500 | m_LightProbeUsage: 1 501 | m_ReflectionProbeUsage: 1 502 | m_RayTracingMode: 2 503 | m_RayTraceProcedural: 0 504 | m_RenderingLayerMask: 1 505 | m_RendererPriority: 0 506 | m_Materials: 507 | - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} 508 | m_StaticBatchInfo: 509 | firstSubMesh: 0 510 | subMeshCount: 0 511 | m_StaticBatchRoot: {fileID: 0} 512 | m_ProbeAnchor: {fileID: 0} 513 | m_LightProbeVolumeOverride: {fileID: 0} 514 | m_ScaleInLightmap: 1 515 | m_ReceiveGI: 1 516 | m_PreserveUVs: 0 517 | m_IgnoreNormalsForChartDetection: 0 518 | m_ImportantGI: 0 519 | m_StitchLightmapSeams: 1 520 | m_SelectedEditorRenderState: 3 521 | m_MinimumChartSize: 4 522 | m_AutoUVMaxDistance: 0.5 523 | m_AutoUVMaxAngle: 89 524 | m_LightmapParameters: {fileID: 0} 525 | m_SortingLayerID: 0 526 | m_SortingLayer: 0 527 | m_SortingOrder: 0 528 | m_AdditionalVertexStreams: {fileID: 0} 529 | --- !u!33 &137633617 530 | MeshFilter: 531 | m_ObjectHideFlags: 0 532 | m_CorrespondingSourceObject: {fileID: 0} 533 | m_PrefabInstance: {fileID: 0} 534 | m_PrefabAsset: {fileID: 0} 535 | m_GameObject: {fileID: 137633614} 536 | m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} 537 | --- !u!4 &137633618 538 | Transform: 539 | m_ObjectHideFlags: 0 540 | m_CorrespondingSourceObject: {fileID: 0} 541 | m_PrefabInstance: {fileID: 0} 542 | m_PrefabAsset: {fileID: 0} 543 | m_GameObject: {fileID: 137633614} 544 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 545 | m_LocalPosition: {x: -27.888596, y: -1.3829961, z: -8.741816} 546 | m_LocalScale: {x: 100, y: 10, z: 1} 547 | m_ConstrainProportionsScale: 0 548 | m_Children: [] 549 | m_Father: {fileID: 2059835720} 550 | m_RootOrder: 1 551 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 552 | --- !u!1 &163759811 553 | GameObject: 554 | m_ObjectHideFlags: 0 555 | m_CorrespondingSourceObject: {fileID: 0} 556 | m_PrefabInstance: {fileID: 0} 557 | m_PrefabAsset: {fileID: 0} 558 | serializedVersion: 6 559 | m_Component: 560 | - component: {fileID: 163759813} 561 | - component: {fileID: 163759812} 562 | m_Layer: 0 563 | m_Name: Health 564 | m_TagString: Untagged 565 | m_Icon: {fileID: 0} 566 | m_NavMeshLayer: 0 567 | m_StaticEditorFlags: 0 568 | m_IsActive: 0 569 | --- !u!114 &163759812 570 | MonoBehaviour: 571 | m_ObjectHideFlags: 0 572 | m_CorrespondingSourceObject: {fileID: 0} 573 | m_PrefabInstance: {fileID: 0} 574 | m_PrefabAsset: {fileID: 0} 575 | m_GameObject: {fileID: 163759811} 576 | m_Enabled: 1 577 | m_EditorHideFlags: 0 578 | m_Script: {fileID: 11500000, guid: bba5fb71024046749af5e8b7a9b5caf1, type: 3} 579 | m_Name: 580 | m_EditorClassIdentifier: 581 | k__BackingField: 0 582 | bonusHealth: {fileID: 0} 583 | hitPoints: 100 584 | k__BackingField: 0 585 | k__BackingField: 0 586 | regenPoints: 1 587 | regenRate: 0.1 588 | onReceivedDamage: 589 | m_PersistentCalls: 590 | m_Calls: [] 591 | onHealed: 592 | m_PersistentCalls: 593 | m_Calls: [] 594 | onDead: 595 | m_PersistentCalls: 596 | m_Calls: [] 597 | --- !u!4 &163759813 598 | Transform: 599 | m_ObjectHideFlags: 0 600 | m_CorrespondingSourceObject: {fileID: 0} 601 | m_PrefabInstance: {fileID: 0} 602 | m_PrefabAsset: {fileID: 0} 603 | m_GameObject: {fileID: 163759811} 604 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 605 | m_LocalPosition: {x: 25.196363, y: 4.657934, z: -1.9020252} 606 | m_LocalScale: {x: 1, y: 1, z: 1} 607 | m_ConstrainProportionsScale: 0 608 | m_Children: [] 609 | m_Father: {fileID: 0} 610 | m_RootOrder: 5 611 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 612 | --- !u!1 &298043554 613 | GameObject: 614 | m_ObjectHideFlags: 0 615 | m_CorrespondingSourceObject: {fileID: 0} 616 | m_PrefabInstance: {fileID: 0} 617 | m_PrefabAsset: {fileID: 0} 618 | serializedVersion: 6 619 | m_Component: 620 | - component: {fileID: 298043558} 621 | - component: {fileID: 298043557} 622 | - component: {fileID: 298043556} 623 | - component: {fileID: 298043555} 624 | m_Layer: 0 625 | m_Name: Force Field 626 | m_TagString: Untagged 627 | m_Icon: {fileID: 0} 628 | m_NavMeshLayer: 0 629 | m_StaticEditorFlags: 0 630 | m_IsActive: 1 631 | --- !u!114 &298043555 632 | MonoBehaviour: 633 | m_ObjectHideFlags: 0 634 | m_CorrespondingSourceObject: {fileID: 0} 635 | m_PrefabInstance: {fileID: 0} 636 | m_PrefabAsset: {fileID: 0} 637 | m_GameObject: {fileID: 298043554} 638 | m_Enabled: 1 639 | m_EditorHideFlags: 0 640 | m_Script: {fileID: 11500000, guid: 3ec71563c819ad94e91452ec834dbc36, type: 3} 641 | m_Name: 642 | m_EditorClassIdentifier: 643 | isTrigger: 1 644 | maxCollisions: 50 645 | requiredTags: [] 646 | ignoredColliders: [] 647 | enterEvent: 648 | m_PersistentCalls: 649 | m_Calls: 650 | - m_Target: {fileID: 298043555} 651 | m_TargetAssemblyTypeName: Kitbashery.Gameplay.ForceField, Assembly-CSharp 652 | m_MethodName: RegisterRigidbody 653 | m_Mode: 1 654 | m_Arguments: 655 | m_ObjectArgument: {fileID: 0} 656 | m_ObjectArgumentAssemblyTypeName: 657 | m_IntArgument: 0 658 | m_FloatArgument: 0 659 | m_StringArgument: 660 | m_BoolArgument: 0 661 | m_CallState: 2 662 | exitEvent: 663 | m_PersistentCalls: 664 | m_Calls: 665 | - m_Target: {fileID: 298043555} 666 | m_TargetAssemblyTypeName: Kitbashery.Gameplay.ForceField, Assembly-CSharp 667 | m_MethodName: UnregisterRigidbody 668 | m_Mode: 1 669 | m_Arguments: 670 | m_ObjectArgument: {fileID: 0} 671 | m_ObjectArgumentAssemblyTypeName: 672 | m_IntArgument: 0 673 | m_FloatArgument: 0 674 | m_StringArgument: 675 | m_BoolArgument: 0 676 | m_CallState: 2 677 | stayEvent: 678 | m_PersistentCalls: 679 | m_Calls: [] 680 | lastContact: {fileID: 0} 681 | colliders: [] 682 | eventCollider: {fileID: 0} 683 | rigidbodies: [] 684 | mode: 0 685 | force: 500 686 | forceDirection: {x: 0, y: 0, z: 1} 687 | wind: {fileID: 298043557} 688 | --- !u!65 &298043556 689 | BoxCollider: 690 | m_ObjectHideFlags: 0 691 | m_CorrespondingSourceObject: {fileID: 0} 692 | m_PrefabInstance: {fileID: 0} 693 | m_PrefabAsset: {fileID: 0} 694 | m_GameObject: {fileID: 298043554} 695 | m_Material: {fileID: 0} 696 | m_IsTrigger: 1 697 | m_Enabled: 1 698 | serializedVersion: 2 699 | m_Size: {x: 30, y: 15, z: 15} 700 | m_Center: {x: 0, y: 0, z: 0} 701 | --- !u!182 &298043557 702 | WindZone: 703 | m_ObjectHideFlags: 0 704 | m_CorrespondingSourceObject: {fileID: 0} 705 | m_PrefabInstance: {fileID: 0} 706 | m_PrefabAsset: {fileID: 0} 707 | m_GameObject: {fileID: 298043554} 708 | m_Enabled: 1 709 | m_Mode: 0 710 | m_Radius: 20 711 | m_WindMain: 1 712 | m_WindTurbulence: 1 713 | m_WindPulseMagnitude: 0.5 714 | m_WindPulseFrequency: 0.01 715 | --- !u!4 &298043558 716 | Transform: 717 | m_ObjectHideFlags: 0 718 | m_CorrespondingSourceObject: {fileID: 0} 719 | m_PrefabInstance: {fileID: 0} 720 | m_PrefabAsset: {fileID: 0} 721 | m_GameObject: {fileID: 298043554} 722 | m_LocalRotation: {x: -0, y: -0.7782817, z: -0, w: 0.6279153} 723 | m_LocalPosition: {x: 19.46, y: 6.3, z: 7.72} 724 | m_LocalScale: {x: 1, y: 1, z: 1} 725 | m_ConstrainProportionsScale: 0 726 | m_Children: [] 727 | m_Father: {fileID: 0} 728 | m_RootOrder: 10 729 | m_LocalEulerAnglesHint: {x: 0, y: -102.207, z: 0} 730 | --- !u!1 &403969857 731 | GameObject: 732 | m_ObjectHideFlags: 0 733 | m_CorrespondingSourceObject: {fileID: 0} 734 | m_PrefabInstance: {fileID: 0} 735 | m_PrefabAsset: {fileID: 0} 736 | serializedVersion: 6 737 | m_Component: 738 | - component: {fileID: 403969860} 739 | - component: {fileID: 403969859} 740 | - component: {fileID: 403969858} 741 | m_Layer: 5 742 | m_Name: FPS Counter 743 | m_TagString: Untagged 744 | m_Icon: {fileID: 0} 745 | m_NavMeshLayer: 0 746 | m_StaticEditorFlags: 0 747 | m_IsActive: 1 748 | --- !u!114 &403969858 749 | MonoBehaviour: 750 | m_ObjectHideFlags: 0 751 | m_CorrespondingSourceObject: {fileID: 0} 752 | m_PrefabInstance: {fileID: 0} 753 | m_PrefabAsset: {fileID: 0} 754 | m_GameObject: {fileID: 403969857} 755 | m_Enabled: 1 756 | m_EditorHideFlags: 0 757 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 758 | m_Name: 759 | m_EditorClassIdentifier: 760 | m_Material: {fileID: 0} 761 | m_Color: {r: 0, g: 0, b: 0, a: 1} 762 | m_RaycastTarget: 1 763 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 764 | m_Maskable: 1 765 | m_OnCullStateChanged: 766 | m_PersistentCalls: 767 | m_Calls: [] 768 | m_FontData: 769 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 770 | m_FontSize: 14 771 | m_FontStyle: 0 772 | m_BestFit: 0 773 | m_MinSize: 10 774 | m_MaxSize: 40 775 | m_Alignment: 5 776 | m_AlignByGeometry: 0 777 | m_RichText: 1 778 | m_HorizontalOverflow: 0 779 | m_VerticalOverflow: 0 780 | m_LineSpacing: 1 781 | m_Text: 'FPS: ' 782 | --- !u!222 &403969859 783 | CanvasRenderer: 784 | m_ObjectHideFlags: 0 785 | m_CorrespondingSourceObject: {fileID: 0} 786 | m_PrefabInstance: {fileID: 0} 787 | m_PrefabAsset: {fileID: 0} 788 | m_GameObject: {fileID: 403969857} 789 | m_CullTransparentMesh: 1 790 | --- !u!224 &403969860 791 | RectTransform: 792 | m_ObjectHideFlags: 0 793 | m_CorrespondingSourceObject: {fileID: 0} 794 | m_PrefabInstance: {fileID: 0} 795 | m_PrefabAsset: {fileID: 0} 796 | m_GameObject: {fileID: 403969857} 797 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 798 | m_LocalPosition: {x: 0, y: 0, z: 0} 799 | m_LocalScale: {x: 1, y: 1, z: 1} 800 | m_ConstrainProportionsScale: 0 801 | m_Children: [] 802 | m_Father: {fileID: 1277680943} 803 | m_RootOrder: 1 804 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 805 | m_AnchorMin: {x: 1, y: 0} 806 | m_AnchorMax: {x: 1, y: 0} 807 | m_AnchoredPosition: {x: -63.0186, y: 64.40802} 808 | m_SizeDelta: {x: 126.0372, y: 128.816} 809 | m_Pivot: {x: 0.5, y: 0.5} 810 | --- !u!1 &751761738 811 | GameObject: 812 | m_ObjectHideFlags: 0 813 | m_CorrespondingSourceObject: {fileID: 0} 814 | m_PrefabInstance: {fileID: 0} 815 | m_PrefabAsset: {fileID: 0} 816 | serializedVersion: 6 817 | m_Component: 818 | - component: {fileID: 751761742} 819 | - component: {fileID: 751761744} 820 | - component: {fileID: 751761745} 821 | - component: {fileID: 751761740} 822 | - component: {fileID: 751761747} 823 | - component: {fileID: 751761746} 824 | m_Layer: 0 825 | m_Name: Projectile 826 | m_TagString: Untagged 827 | m_Icon: {fileID: 0} 828 | m_NavMeshLayer: 0 829 | m_StaticEditorFlags: 0 830 | m_IsActive: 0 831 | --- !u!54 &751761740 832 | Rigidbody: 833 | m_ObjectHideFlags: 0 834 | m_CorrespondingSourceObject: {fileID: 0} 835 | m_PrefabInstance: {fileID: 0} 836 | m_PrefabAsset: {fileID: 0} 837 | m_GameObject: {fileID: 751761738} 838 | serializedVersion: 2 839 | m_Mass: 1 840 | m_Drag: 0 841 | m_AngularDrag: 0.05 842 | m_UseGravity: 1 843 | m_IsKinematic: 0 844 | m_Interpolate: 0 845 | m_Constraints: 0 846 | m_CollisionDetection: 0 847 | --- !u!4 &751761742 848 | Transform: 849 | m_ObjectHideFlags: 0 850 | m_CorrespondingSourceObject: {fileID: 0} 851 | m_PrefabInstance: {fileID: 0} 852 | m_PrefabAsset: {fileID: 0} 853 | m_GameObject: {fileID: 751761738} 854 | m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} 855 | m_LocalPosition: {x: 17.79, y: 4.657934, z: 0.14} 856 | m_LocalScale: {x: 1, y: 1, z: 1} 857 | m_ConstrainProportionsScale: 0 858 | m_Children: [] 859 | m_Father: {fileID: 0} 860 | m_RootOrder: 8 861 | m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} 862 | --- !u!33 &751761744 863 | MeshFilter: 864 | m_ObjectHideFlags: 0 865 | m_CorrespondingSourceObject: {fileID: 0} 866 | m_PrefabInstance: {fileID: 0} 867 | m_PrefabAsset: {fileID: 0} 868 | m_GameObject: {fileID: 751761738} 869 | m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} 870 | --- !u!23 &751761745 871 | MeshRenderer: 872 | m_ObjectHideFlags: 0 873 | m_CorrespondingSourceObject: {fileID: 0} 874 | m_PrefabInstance: {fileID: 0} 875 | m_PrefabAsset: {fileID: 0} 876 | m_GameObject: {fileID: 751761738} 877 | m_Enabled: 1 878 | m_CastShadows: 1 879 | m_ReceiveShadows: 1 880 | m_DynamicOccludee: 1 881 | m_StaticShadowCaster: 0 882 | m_MotionVectors: 1 883 | m_LightProbeUsage: 1 884 | m_ReflectionProbeUsage: 1 885 | m_RayTracingMode: 2 886 | m_RayTraceProcedural: 0 887 | m_RenderingLayerMask: 1 888 | m_RendererPriority: 0 889 | m_Materials: 890 | - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} 891 | m_StaticBatchInfo: 892 | firstSubMesh: 0 893 | subMeshCount: 0 894 | m_StaticBatchRoot: {fileID: 0} 895 | m_ProbeAnchor: {fileID: 0} 896 | m_LightProbeVolumeOverride: {fileID: 0} 897 | m_ScaleInLightmap: 1 898 | m_ReceiveGI: 1 899 | m_PreserveUVs: 0 900 | m_IgnoreNormalsForChartDetection: 0 901 | m_ImportantGI: 0 902 | m_StitchLightmapSeams: 1 903 | m_SelectedEditorRenderState: 3 904 | m_MinimumChartSize: 4 905 | m_AutoUVMaxDistance: 0.5 906 | m_AutoUVMaxAngle: 89 907 | m_LightmapParameters: {fileID: 0} 908 | m_SortingLayerID: 0 909 | m_SortingLayer: 0 910 | m_SortingOrder: 0 911 | m_AdditionalVertexStreams: {fileID: 0} 912 | --- !u!114 &751761746 913 | MonoBehaviour: 914 | m_ObjectHideFlags: 0 915 | m_CorrespondingSourceObject: {fileID: 0} 916 | m_PrefabInstance: {fileID: 0} 917 | m_PrefabAsset: {fileID: 0} 918 | m_GameObject: {fileID: 751761738} 919 | m_Enabled: 1 920 | m_EditorHideFlags: 0 921 | m_Script: {fileID: 11500000, guid: 49df814edf10eda419221794ab9a80c1, type: 3} 922 | m_Name: 923 | m_EditorClassIdentifier: 924 | isTrigger: 1 925 | maxCollisions: 50 926 | requiredTags: [] 927 | ignoredColliders: [] 928 | enterEvent: 929 | m_PersistentCalls: 930 | m_Calls: 931 | - m_Target: {fileID: 751761746} 932 | m_TargetAssemblyTypeName: Kitbashery.Gameplay.Projectile, Assembly-CSharp 933 | m_MethodName: Impact 934 | m_Mode: 1 935 | m_Arguments: 936 | m_ObjectArgument: {fileID: 0} 937 | m_ObjectArgumentAssemblyTypeName: 938 | m_IntArgument: 0 939 | m_FloatArgument: 0 940 | m_StringArgument: 941 | m_BoolArgument: 0 942 | m_CallState: 2 943 | exitEvent: 944 | m_PersistentCalls: 945 | m_Calls: [] 946 | stayEvent: 947 | m_PersistentCalls: 948 | m_Calls: [] 949 | lastContact: {fileID: 0} 950 | colliders: [] 951 | eventCollider: {fileID: 0} 952 | rigid: {fileID: 751761740} 953 | applyForceOnImpact: 1 954 | impactForce: 1 955 | velocity: 50 956 | modifyHealthOnImpact: 0 957 | healthEffect: 958 | name: 959 | modifier: 0 960 | amount: 1 961 | times: 1 962 | interval: 0 963 | disableOnImpact: 1 964 | ricochets: 0 965 | onRicochet: 966 | m_PersistentCalls: 967 | m_Calls: [] 968 | useLifeTime: 1 969 | lifeTime: 10 970 | seekTarget: 0 971 | target: {fileID: 0} 972 | targetMode: 0 973 | layerMask: 974 | serializedVersion: 2 975 | m_Bits: 0 976 | triggerInteraction: 1 977 | targetTag: 978 | searchRange: 10 979 | seekSpeed: 10 980 | --- !u!135 &751761747 981 | SphereCollider: 982 | m_ObjectHideFlags: 0 983 | m_CorrespondingSourceObject: {fileID: 0} 984 | m_PrefabInstance: {fileID: 0} 985 | m_PrefabAsset: {fileID: 0} 986 | m_GameObject: {fileID: 751761738} 987 | m_Material: {fileID: 0} 988 | m_IsTrigger: 0 989 | m_Enabled: 1 990 | serializedVersion: 2 991 | m_Radius: 0.5000001 992 | m_Center: {x: 0, y: 0, z: 0} 993 | --- !u!1 &1277680942 994 | GameObject: 995 | m_ObjectHideFlags: 0 996 | m_CorrespondingSourceObject: {fileID: 0} 997 | m_PrefabInstance: {fileID: 0} 998 | m_PrefabAsset: {fileID: 0} 999 | serializedVersion: 6 1000 | m_Component: 1001 | - component: {fileID: 1277680943} 1002 | - component: {fileID: 1277680947} 1003 | - component: {fileID: 1277680946} 1004 | - component: {fileID: 1277680945} 1005 | - component: {fileID: 1277680944} 1006 | m_Layer: 5 1007 | m_Name: Canvas 1008 | m_TagString: Untagged 1009 | m_Icon: {fileID: 0} 1010 | m_NavMeshLayer: 0 1011 | m_StaticEditorFlags: 0 1012 | m_IsActive: 1 1013 | --- !u!224 &1277680943 1014 | RectTransform: 1015 | m_ObjectHideFlags: 0 1016 | m_CorrespondingSourceObject: {fileID: 0} 1017 | m_PrefabInstance: {fileID: 0} 1018 | m_PrefabAsset: {fileID: 0} 1019 | m_GameObject: {fileID: 1277680942} 1020 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 1021 | m_LocalPosition: {x: 0, y: 0, z: 0} 1022 | m_LocalScale: {x: 0, y: 0, z: 0} 1023 | m_ConstrainProportionsScale: 0 1024 | m_Children: 1025 | - {fileID: 1655496403} 1026 | - {fileID: 403969860} 1027 | m_Father: {fileID: 2059835720} 1028 | m_RootOrder: 3 1029 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1030 | m_AnchorMin: {x: 0, y: 0} 1031 | m_AnchorMax: {x: 0, y: 0} 1032 | m_AnchoredPosition: {x: 0, y: 0} 1033 | m_SizeDelta: {x: 0, y: 0} 1034 | m_Pivot: {x: 0, y: 0} 1035 | --- !u!222 &1277680944 1036 | CanvasRenderer: 1037 | m_ObjectHideFlags: 0 1038 | m_CorrespondingSourceObject: {fileID: 0} 1039 | m_PrefabInstance: {fileID: 0} 1040 | m_PrefabAsset: {fileID: 0} 1041 | m_GameObject: {fileID: 1277680942} 1042 | m_CullTransparentMesh: 1 1043 | --- !u!114 &1277680945 1044 | MonoBehaviour: 1045 | m_ObjectHideFlags: 0 1046 | m_CorrespondingSourceObject: {fileID: 0} 1047 | m_PrefabInstance: {fileID: 0} 1048 | m_PrefabAsset: {fileID: 0} 1049 | m_GameObject: {fileID: 1277680942} 1050 | m_Enabled: 1 1051 | m_EditorHideFlags: 0 1052 | m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} 1053 | m_Name: 1054 | m_EditorClassIdentifier: 1055 | m_IgnoreReversedGraphics: 1 1056 | m_BlockingObjects: 0 1057 | m_BlockingMask: 1058 | serializedVersion: 2 1059 | m_Bits: 4294967295 1060 | --- !u!114 &1277680946 1061 | MonoBehaviour: 1062 | m_ObjectHideFlags: 0 1063 | m_CorrespondingSourceObject: {fileID: 0} 1064 | m_PrefabInstance: {fileID: 0} 1065 | m_PrefabAsset: {fileID: 0} 1066 | m_GameObject: {fileID: 1277680942} 1067 | m_Enabled: 1 1068 | m_EditorHideFlags: 0 1069 | m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} 1070 | m_Name: 1071 | m_EditorClassIdentifier: 1072 | m_UiScaleMode: 1 1073 | m_ReferencePixelsPerUnit: 100 1074 | m_ScaleFactor: 1 1075 | m_ReferenceResolution: {x: 800, y: 600} 1076 | m_ScreenMatchMode: 0 1077 | m_MatchWidthOrHeight: 0.5 1078 | m_PhysicalUnit: 3 1079 | m_FallbackScreenDPI: 96 1080 | m_DefaultSpriteDPI: 96 1081 | m_DynamicPixelsPerUnit: 1 1082 | m_PresetInfoIsWorld: 0 1083 | --- !u!223 &1277680947 1084 | Canvas: 1085 | m_ObjectHideFlags: 0 1086 | m_CorrespondingSourceObject: {fileID: 0} 1087 | m_PrefabInstance: {fileID: 0} 1088 | m_PrefabAsset: {fileID: 0} 1089 | m_GameObject: {fileID: 1277680942} 1090 | m_Enabled: 1 1091 | serializedVersion: 3 1092 | m_RenderMode: 0 1093 | m_Camera: {fileID: 0} 1094 | m_PlaneDistance: 100 1095 | m_PixelPerfect: 0 1096 | m_ReceivesEvents: 1 1097 | m_OverrideSorting: 0 1098 | m_OverridePixelPerfect: 0 1099 | m_SortingBucketNormalizedSize: 0 1100 | m_AdditionalShaderChannelsFlag: 0 1101 | m_SortingLayerID: 0 1102 | m_SortingOrder: 0 1103 | m_TargetDisplay: 0 1104 | --- !u!1 &1394021188 1105 | GameObject: 1106 | m_ObjectHideFlags: 0 1107 | m_CorrespondingSourceObject: {fileID: 0} 1108 | m_PrefabInstance: {fileID: 0} 1109 | m_PrefabAsset: {fileID: 0} 1110 | serializedVersion: 6 1111 | m_Component: 1112 | - component: {fileID: 1394021190} 1113 | - component: {fileID: 1394021189} 1114 | m_Layer: 0 1115 | m_Name: Object Pools 1116 | m_TagString: Untagged 1117 | m_Icon: {fileID: 0} 1118 | m_NavMeshLayer: 0 1119 | m_StaticEditorFlags: 0 1120 | m_IsActive: 0 1121 | --- !u!114 &1394021189 1122 | MonoBehaviour: 1123 | m_ObjectHideFlags: 0 1124 | m_CorrespondingSourceObject: {fileID: 0} 1125 | m_PrefabInstance: {fileID: 0} 1126 | m_PrefabAsset: {fileID: 0} 1127 | m_GameObject: {fileID: 1394021188} 1128 | m_Enabled: 1 1129 | m_EditorHideFlags: 0 1130 | m_Script: {fileID: 11500000, guid: 0106a81881bee9248bb49427003b5364, type: 3} 1131 | m_Name: 1132 | m_EditorClassIdentifier: 1133 | pools: 1134 | - prefab: {fileID: 8584135303632376971, guid: 4a4d317d41134a94f8ca594bd9c5f6f3, type: 3} 1135 | amount: 50 1136 | hideFlags: 0 1137 | sequencialNaming: 1 1138 | pooledObjects: [] 1139 | --- !u!4 &1394021190 1140 | Transform: 1141 | m_ObjectHideFlags: 0 1142 | m_CorrespondingSourceObject: {fileID: 0} 1143 | m_PrefabInstance: {fileID: 0} 1144 | m_PrefabAsset: {fileID: 0} 1145 | m_GameObject: {fileID: 1394021188} 1146 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 1147 | m_LocalPosition: {x: 0, y: 0, z: 0} 1148 | m_LocalScale: {x: 1, y: 1, z: 1} 1149 | m_ConstrainProportionsScale: 0 1150 | m_Children: [] 1151 | m_Father: {fileID: 0} 1152 | m_RootOrder: 7 1153 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1154 | --- !u!1 &1402257230 1155 | GameObject: 1156 | m_ObjectHideFlags: 0 1157 | m_CorrespondingSourceObject: {fileID: 0} 1158 | m_PrefabInstance: {fileID: 0} 1159 | m_PrefabAsset: {fileID: 0} 1160 | serializedVersion: 6 1161 | m_Component: 1162 | - component: {fileID: 1402257232} 1163 | - component: {fileID: 1402257231} 1164 | m_Layer: 0 1165 | m_Name: Directional Light 1166 | m_TagString: Untagged 1167 | m_Icon: {fileID: 0} 1168 | m_NavMeshLayer: 0 1169 | m_StaticEditorFlags: 0 1170 | m_IsActive: 1 1171 | --- !u!108 &1402257231 1172 | Light: 1173 | m_ObjectHideFlags: 0 1174 | m_CorrespondingSourceObject: {fileID: 0} 1175 | m_PrefabInstance: {fileID: 0} 1176 | m_PrefabAsset: {fileID: 0} 1177 | m_GameObject: {fileID: 1402257230} 1178 | m_Enabled: 1 1179 | serializedVersion: 10 1180 | m_Type: 1 1181 | m_Shape: 0 1182 | m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} 1183 | m_Intensity: 1 1184 | m_Range: 10 1185 | m_SpotAngle: 30 1186 | m_InnerSpotAngle: 21.80208 1187 | m_CookieSize: 10 1188 | m_Shadows: 1189 | m_Type: 2 1190 | m_Resolution: -1 1191 | m_CustomResolution: -1 1192 | m_Strength: 1 1193 | m_Bias: 0.05 1194 | m_NormalBias: 0.4 1195 | m_NearPlane: 0.2 1196 | m_CullingMatrixOverride: 1197 | e00: 1 1198 | e01: 0 1199 | e02: 0 1200 | e03: 0 1201 | e10: 0 1202 | e11: 1 1203 | e12: 0 1204 | e13: 0 1205 | e20: 0 1206 | e21: 0 1207 | e22: 1 1208 | e23: 0 1209 | e30: 0 1210 | e31: 0 1211 | e32: 0 1212 | e33: 1 1213 | m_UseCullingMatrixOverride: 0 1214 | m_Cookie: {fileID: 0} 1215 | m_DrawHalo: 0 1216 | m_Flare: {fileID: 0} 1217 | m_RenderMode: 0 1218 | m_CullingMask: 1219 | serializedVersion: 2 1220 | m_Bits: 4294967295 1221 | m_RenderingLayerMask: 1 1222 | m_Lightmapping: 4 1223 | m_LightShadowCasterMode: 0 1224 | m_AreaSize: {x: 1, y: 1} 1225 | m_BounceIntensity: 1 1226 | m_ColorTemperature: 6570 1227 | m_UseColorTemperature: 0 1228 | m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} 1229 | m_UseBoundingSphereOverride: 0 1230 | m_UseViewFrustumForShadowCasterCull: 1 1231 | m_ShadowRadius: 0 1232 | m_ShadowAngle: 0 1233 | --- !u!4 &1402257232 1234 | Transform: 1235 | m_ObjectHideFlags: 0 1236 | m_CorrespondingSourceObject: {fileID: 0} 1237 | m_PrefabInstance: {fileID: 0} 1238 | m_PrefabAsset: {fileID: 0} 1239 | m_GameObject: {fileID: 1402257230} 1240 | m_LocalRotation: {x: 0.99904823, y: -0, z: -0, w: 0.0436195} 1241 | m_LocalPosition: {x: -27.888596, y: 14.617004, z: -4.2418156} 1242 | m_LocalScale: {x: 1, y: 1, z: 1} 1243 | m_ConstrainProportionsScale: 0 1244 | m_Children: [] 1245 | m_Father: {fileID: 2059835720} 1246 | m_RootOrder: 0 1247 | m_LocalEulerAnglesHint: {x: 175, y: 0, z: 0} 1248 | --- !u!1 &1594541299 1249 | GameObject: 1250 | m_ObjectHideFlags: 0 1251 | m_CorrespondingSourceObject: {fileID: 0} 1252 | m_PrefabInstance: {fileID: 0} 1253 | m_PrefabAsset: {fileID: 0} 1254 | serializedVersion: 6 1255 | m_Component: 1256 | - component: {fileID: 1594541300} 1257 | - component: {fileID: 1594541302} 1258 | - component: {fileID: 1594541301} 1259 | m_Layer: 0 1260 | m_Name: EventSystem 1261 | m_TagString: Untagged 1262 | m_Icon: {fileID: 0} 1263 | m_NavMeshLayer: 0 1264 | m_StaticEditorFlags: 0 1265 | m_IsActive: 1 1266 | --- !u!4 &1594541300 1267 | Transform: 1268 | m_ObjectHideFlags: 0 1269 | m_CorrespondingSourceObject: {fileID: 0} 1270 | m_PrefabInstance: {fileID: 0} 1271 | m_PrefabAsset: {fileID: 0} 1272 | m_GameObject: {fileID: 1594541299} 1273 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 1274 | m_LocalPosition: {x: -27.888596, y: -5.382996, z: -4.2418156} 1275 | m_LocalScale: {x: 1, y: 1, z: 1} 1276 | m_ConstrainProportionsScale: 0 1277 | m_Children: [] 1278 | m_Father: {fileID: 2059835720} 1279 | m_RootOrder: 4 1280 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1281 | --- !u!114 &1594541301 1282 | MonoBehaviour: 1283 | m_ObjectHideFlags: 0 1284 | m_CorrespondingSourceObject: {fileID: 0} 1285 | m_PrefabInstance: {fileID: 0} 1286 | m_PrefabAsset: {fileID: 0} 1287 | m_GameObject: {fileID: 1594541299} 1288 | m_Enabled: 1 1289 | m_EditorHideFlags: 0 1290 | m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} 1291 | m_Name: 1292 | m_EditorClassIdentifier: 1293 | m_HorizontalAxis: Horizontal 1294 | m_VerticalAxis: Vertical 1295 | m_SubmitButton: Submit 1296 | m_CancelButton: Cancel 1297 | m_InputActionsPerSecond: 10 1298 | m_RepeatDelay: 0.5 1299 | m_ForceModuleActive: 0 1300 | --- !u!114 &1594541302 1301 | MonoBehaviour: 1302 | m_ObjectHideFlags: 0 1303 | m_CorrespondingSourceObject: {fileID: 0} 1304 | m_PrefabInstance: {fileID: 0} 1305 | m_PrefabAsset: {fileID: 0} 1306 | m_GameObject: {fileID: 1594541299} 1307 | m_Enabled: 1 1308 | m_EditorHideFlags: 0 1309 | m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} 1310 | m_Name: 1311 | m_EditorClassIdentifier: 1312 | m_FirstSelected: {fileID: 0} 1313 | m_sendNavigationEvents: 1 1314 | m_DragThreshold: 10 1315 | --- !u!1 &1655496402 1316 | GameObject: 1317 | m_ObjectHideFlags: 0 1318 | m_CorrespondingSourceObject: {fileID: 0} 1319 | m_PrefabInstance: {fileID: 0} 1320 | m_PrefabAsset: {fileID: 0} 1321 | serializedVersion: 6 1322 | m_Component: 1323 | - component: {fileID: 1655496403} 1324 | - component: {fileID: 1655496405} 1325 | - component: {fileID: 1655496404} 1326 | m_Layer: 5 1327 | m_Name: Text 1328 | m_TagString: Untagged 1329 | m_Icon: {fileID: 0} 1330 | m_NavMeshLayer: 0 1331 | m_StaticEditorFlags: 0 1332 | m_IsActive: 1 1333 | --- !u!224 &1655496403 1334 | RectTransform: 1335 | m_ObjectHideFlags: 0 1336 | m_CorrespondingSourceObject: {fileID: 0} 1337 | m_PrefabInstance: {fileID: 0} 1338 | m_PrefabAsset: {fileID: 0} 1339 | m_GameObject: {fileID: 1655496402} 1340 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 1341 | m_LocalPosition: {x: 0, y: 0, z: 0} 1342 | m_LocalScale: {x: 1, y: 1, z: 1} 1343 | m_ConstrainProportionsScale: 0 1344 | m_Children: [] 1345 | m_Father: {fileID: 1277680943} 1346 | m_RootOrder: 0 1347 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1348 | m_AnchorMin: {x: 0, y: 1} 1349 | m_AnchorMax: {x: 1, y: 1} 1350 | m_AnchoredPosition: {x: 0, y: -64.40802} 1351 | m_SizeDelta: {x: 0, y: 128.81601} 1352 | m_Pivot: {x: 0.5, y: 0.5} 1353 | --- !u!114 &1655496404 1354 | MonoBehaviour: 1355 | m_ObjectHideFlags: 0 1356 | m_CorrespondingSourceObject: {fileID: 0} 1357 | m_PrefabInstance: {fileID: 0} 1358 | m_PrefabAsset: {fileID: 0} 1359 | m_GameObject: {fileID: 1655496402} 1360 | m_Enabled: 1 1361 | m_EditorHideFlags: 0 1362 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 1363 | m_Name: 1364 | m_EditorClassIdentifier: 1365 | m_Material: {fileID: 0} 1366 | m_Color: {r: 0, g: 0, b: 0, a: 1} 1367 | m_RaycastTarget: 1 1368 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 1369 | m_Maskable: 1 1370 | m_OnCullStateChanged: 1371 | m_PersistentCalls: 1372 | m_Calls: [] 1373 | m_FontData: 1374 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 1375 | m_FontSize: 14 1376 | m_FontStyle: 0 1377 | m_BestFit: 0 1378 | m_MinSize: 10 1379 | m_MaxSize: 40 1380 | m_Alignment: 0 1381 | m_AlignByGeometry: 0 1382 | m_RichText: 1 1383 | m_HorizontalOverflow: 0 1384 | m_VerticalOverflow: 0 1385 | m_LineSpacing: 1 1386 | m_Text: 'Take a look at each GameObject in the hierarchy and examine the scripts. 1387 | 1388 | For 1389 | in depth documentation & scripting examples visit kitbashery.com' 1390 | --- !u!222 &1655496405 1391 | CanvasRenderer: 1392 | m_ObjectHideFlags: 0 1393 | m_CorrespondingSourceObject: {fileID: 0} 1394 | m_PrefabInstance: {fileID: 0} 1395 | m_PrefabAsset: {fileID: 0} 1396 | m_GameObject: {fileID: 1655496402} 1397 | m_CullTransparentMesh: 1 1398 | --- !u!1 &1799891581 1399 | GameObject: 1400 | m_ObjectHideFlags: 0 1401 | m_CorrespondingSourceObject: {fileID: 0} 1402 | m_PrefabInstance: {fileID: 0} 1403 | m_PrefabAsset: {fileID: 0} 1404 | serializedVersion: 6 1405 | m_Component: 1406 | - component: {fileID: 1799891582} 1407 | - component: {fileID: 1799891586} 1408 | - component: {fileID: 1799891585} 1409 | - component: {fileID: 1799891584} 1410 | - component: {fileID: 1799891583} 1411 | m_Layer: 0 1412 | m_Name: Collision Events Example 1413 | m_TagString: Untagged 1414 | m_Icon: {fileID: 0} 1415 | m_NavMeshLayer: 0 1416 | m_StaticEditorFlags: 0 1417 | m_IsActive: 0 1418 | --- !u!4 &1799891582 1419 | Transform: 1420 | m_ObjectHideFlags: 0 1421 | m_CorrespondingSourceObject: {fileID: 0} 1422 | m_PrefabInstance: {fileID: 0} 1423 | m_PrefabAsset: {fileID: 0} 1424 | m_GameObject: {fileID: 1799891581} 1425 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 1426 | m_LocalPosition: {x: 35, y: 0, z: 0} 1427 | m_LocalScale: {x: 5, y: 1, z: 5} 1428 | m_ConstrainProportionsScale: 0 1429 | m_Children: [] 1430 | m_Father: {fileID: 0} 1431 | m_RootOrder: 4 1432 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1433 | --- !u!114 &1799891583 1434 | MonoBehaviour: 1435 | m_ObjectHideFlags: 0 1436 | m_CorrespondingSourceObject: {fileID: 0} 1437 | m_PrefabInstance: {fileID: 0} 1438 | m_PrefabAsset: {fileID: 0} 1439 | m_GameObject: {fileID: 1799891581} 1440 | m_Enabled: 1 1441 | m_EditorHideFlags: 0 1442 | m_Script: {fileID: 11500000, guid: cb65b08cef889c14eb78493d5ae0aee8, type: 3} 1443 | m_Name: 1444 | m_EditorClassIdentifier: 1445 | isTrigger: 0 1446 | maxCollisions: 50 1447 | requiredTags: [] 1448 | ignoredColliders: [] 1449 | enterEvent: 1450 | m_PersistentCalls: 1451 | m_Calls: 1452 | - m_Target: {fileID: 1799891583} 1453 | m_TargetAssemblyTypeName: Kitbashery.core.CollisionEvents, Assembly-CSharp 1454 | m_MethodName: DebugLastCollision 1455 | m_Mode: 1 1456 | m_Arguments: 1457 | m_ObjectArgument: {fileID: 0} 1458 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 1459 | m_IntArgument: 0 1460 | m_FloatArgument: 0 1461 | m_StringArgument: test 1462 | m_BoolArgument: 0 1463 | m_CallState: 2 1464 | exitEvent: 1465 | m_PersistentCalls: 1466 | m_Calls: [] 1467 | stayEvent: 1468 | m_PersistentCalls: 1469 | m_Calls: [] 1470 | lastContact: {fileID: 0} 1471 | colliders: [] 1472 | eventCollider: {fileID: 0} 1473 | --- !u!65 &1799891584 1474 | BoxCollider: 1475 | m_ObjectHideFlags: 0 1476 | m_CorrespondingSourceObject: {fileID: 0} 1477 | m_PrefabInstance: {fileID: 0} 1478 | m_PrefabAsset: {fileID: 0} 1479 | m_GameObject: {fileID: 1799891581} 1480 | m_Material: {fileID: 0} 1481 | m_IsTrigger: 0 1482 | m_Enabled: 1 1483 | serializedVersion: 2 1484 | m_Size: {x: 1, y: 1, z: 1} 1485 | m_Center: {x: 0, y: 0, z: 0} 1486 | --- !u!23 &1799891585 1487 | MeshRenderer: 1488 | m_ObjectHideFlags: 0 1489 | m_CorrespondingSourceObject: {fileID: 0} 1490 | m_PrefabInstance: {fileID: 0} 1491 | m_PrefabAsset: {fileID: 0} 1492 | m_GameObject: {fileID: 1799891581} 1493 | m_Enabled: 1 1494 | m_CastShadows: 1 1495 | m_ReceiveShadows: 1 1496 | m_DynamicOccludee: 1 1497 | m_StaticShadowCaster: 0 1498 | m_MotionVectors: 1 1499 | m_LightProbeUsage: 1 1500 | m_ReflectionProbeUsage: 1 1501 | m_RayTracingMode: 2 1502 | m_RayTraceProcedural: 0 1503 | m_RenderingLayerMask: 1 1504 | m_RendererPriority: 0 1505 | m_Materials: 1506 | - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} 1507 | m_StaticBatchInfo: 1508 | firstSubMesh: 0 1509 | subMeshCount: 0 1510 | m_StaticBatchRoot: {fileID: 0} 1511 | m_ProbeAnchor: {fileID: 0} 1512 | m_LightProbeVolumeOverride: {fileID: 0} 1513 | m_ScaleInLightmap: 1 1514 | m_ReceiveGI: 1 1515 | m_PreserveUVs: 0 1516 | m_IgnoreNormalsForChartDetection: 0 1517 | m_ImportantGI: 0 1518 | m_StitchLightmapSeams: 1 1519 | m_SelectedEditorRenderState: 3 1520 | m_MinimumChartSize: 4 1521 | m_AutoUVMaxDistance: 0.5 1522 | m_AutoUVMaxAngle: 89 1523 | m_LightmapParameters: {fileID: 0} 1524 | m_SortingLayerID: 0 1525 | m_SortingLayer: 0 1526 | m_SortingOrder: 0 1527 | m_AdditionalVertexStreams: {fileID: 0} 1528 | --- !u!33 &1799891586 1529 | MeshFilter: 1530 | m_ObjectHideFlags: 0 1531 | m_CorrespondingSourceObject: {fileID: 0} 1532 | m_PrefabInstance: {fileID: 0} 1533 | m_PrefabAsset: {fileID: 0} 1534 | m_GameObject: {fileID: 1799891581} 1535 | m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} 1536 | --- !u!1 &1800656260 1537 | GameObject: 1538 | m_ObjectHideFlags: 0 1539 | m_CorrespondingSourceObject: {fileID: 0} 1540 | m_PrefabInstance: {fileID: 0} 1541 | m_PrefabAsset: {fileID: 0} 1542 | serializedVersion: 6 1543 | m_Component: 1544 | - component: {fileID: 1800656262} 1545 | - component: {fileID: 1800656261} 1546 | m_Layer: 0 1547 | m_Name: Time Manager 1548 | m_TagString: Untagged 1549 | m_Icon: {fileID: 0} 1550 | m_NavMeshLayer: 0 1551 | m_StaticEditorFlags: 0 1552 | m_IsActive: 1 1553 | --- !u!114 &1800656261 1554 | MonoBehaviour: 1555 | m_ObjectHideFlags: 0 1556 | m_CorrespondingSourceObject: {fileID: 0} 1557 | m_PrefabInstance: {fileID: 0} 1558 | m_PrefabAsset: {fileID: 0} 1559 | m_GameObject: {fileID: 1800656260} 1560 | m_Enabled: 1 1561 | m_EditorHideFlags: 0 1562 | m_Script: {fileID: 11500000, guid: d286f65bd2844b8498ac95cfbd8de857, type: 3} 1563 | m_Name: 1564 | m_EditorClassIdentifier: 1565 | togglePauseKey: 27 1566 | k__BackingField: 1 1567 | k__BackingField: 1 1568 | k__BackingField: 1 1569 | onPause: 1570 | m_PersistentCalls: 1571 | m_Calls: [] 1572 | onUnPause: 1573 | m_PersistentCalls: 1574 | m_Calls: [] 1575 | paused: 0 1576 | modifyingTimeScale: 0 1577 | currentTimeDuration: 0 1578 | currentTimeMultiplier: 0 1579 | debugFPS: 1 1580 | fpsCounter: {fileID: 403969858} 1581 | fpsCounterTMP: {fileID: 0} 1582 | targetFPS: 60 1583 | currentFPS: 0 1584 | onBelowTargetFPS: 1585 | m_PersistentCalls: 1586 | m_Calls: [] 1587 | onAboveTargetFPS: 1588 | m_PersistentCalls: 1589 | m_Calls: [] 1590 | --- !u!4 &1800656262 1591 | Transform: 1592 | m_ObjectHideFlags: 0 1593 | m_CorrespondingSourceObject: {fileID: 0} 1594 | m_PrefabInstance: {fileID: 0} 1595 | m_PrefabAsset: {fileID: 0} 1596 | m_GameObject: {fileID: 1800656260} 1597 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 1598 | m_LocalPosition: {x: 8.36747, y: -6.7522144, z: 12.91202} 1599 | m_LocalScale: {x: 1, y: 1, z: 1} 1600 | m_ConstrainProportionsScale: 0 1601 | m_Children: [] 1602 | m_Father: {fileID: 0} 1603 | m_RootOrder: 2 1604 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1605 | --- !u!1 &1856537689 1606 | GameObject: 1607 | m_ObjectHideFlags: 0 1608 | m_CorrespondingSourceObject: {fileID: 0} 1609 | m_PrefabInstance: {fileID: 0} 1610 | m_PrefabAsset: {fileID: 0} 1611 | serializedVersion: 6 1612 | m_Component: 1613 | - component: {fileID: 1856537693} 1614 | - component: {fileID: 1856537692} 1615 | - component: {fileID: 1856537691} 1616 | - component: {fileID: 1856537690} 1617 | m_Layer: 0 1618 | m_Name: Plane 1619 | m_TagString: Untagged 1620 | m_Icon: {fileID: 0} 1621 | m_NavMeshLayer: 0 1622 | m_StaticEditorFlags: 0 1623 | m_IsActive: 1 1624 | --- !u!64 &1856537690 1625 | MeshCollider: 1626 | m_ObjectHideFlags: 0 1627 | m_CorrespondingSourceObject: {fileID: 0} 1628 | m_PrefabInstance: {fileID: 0} 1629 | m_PrefabAsset: {fileID: 0} 1630 | m_GameObject: {fileID: 1856537689} 1631 | m_Material: {fileID: 0} 1632 | m_IsTrigger: 0 1633 | m_Enabled: 1 1634 | serializedVersion: 4 1635 | m_Convex: 0 1636 | m_CookingOptions: 30 1637 | m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} 1638 | --- !u!23 &1856537691 1639 | MeshRenderer: 1640 | m_ObjectHideFlags: 0 1641 | m_CorrespondingSourceObject: {fileID: 0} 1642 | m_PrefabInstance: {fileID: 0} 1643 | m_PrefabAsset: {fileID: 0} 1644 | m_GameObject: {fileID: 1856537689} 1645 | m_Enabled: 1 1646 | m_CastShadows: 0 1647 | m_ReceiveShadows: 1 1648 | m_DynamicOccludee: 1 1649 | m_StaticShadowCaster: 0 1650 | m_MotionVectors: 1 1651 | m_LightProbeUsage: 1 1652 | m_ReflectionProbeUsage: 1 1653 | m_RayTracingMode: 2 1654 | m_RayTraceProcedural: 0 1655 | m_RenderingLayerMask: 1 1656 | m_RendererPriority: 0 1657 | m_Materials: 1658 | - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} 1659 | m_StaticBatchInfo: 1660 | firstSubMesh: 0 1661 | subMeshCount: 0 1662 | m_StaticBatchRoot: {fileID: 0} 1663 | m_ProbeAnchor: {fileID: 0} 1664 | m_LightProbeVolumeOverride: {fileID: 0} 1665 | m_ScaleInLightmap: 1 1666 | m_ReceiveGI: 1 1667 | m_PreserveUVs: 0 1668 | m_IgnoreNormalsForChartDetection: 0 1669 | m_ImportantGI: 0 1670 | m_StitchLightmapSeams: 1 1671 | m_SelectedEditorRenderState: 3 1672 | m_MinimumChartSize: 4 1673 | m_AutoUVMaxDistance: 0.5 1674 | m_AutoUVMaxAngle: 89 1675 | m_LightmapParameters: {fileID: 0} 1676 | m_SortingLayerID: 0 1677 | m_SortingLayer: 0 1678 | m_SortingOrder: 0 1679 | m_AdditionalVertexStreams: {fileID: 0} 1680 | --- !u!33 &1856537692 1681 | MeshFilter: 1682 | m_ObjectHideFlags: 0 1683 | m_CorrespondingSourceObject: {fileID: 0} 1684 | m_PrefabInstance: {fileID: 0} 1685 | m_PrefabAsset: {fileID: 0} 1686 | m_GameObject: {fileID: 1856537689} 1687 | m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} 1688 | --- !u!4 &1856537693 1689 | Transform: 1690 | m_ObjectHideFlags: 0 1691 | m_CorrespondingSourceObject: {fileID: 0} 1692 | m_PrefabInstance: {fileID: 0} 1693 | m_PrefabAsset: {fileID: 0} 1694 | m_GameObject: {fileID: 1856537689} 1695 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 1696 | m_LocalPosition: {x: -27.888596, y: -5.882996, z: -4.2418156} 1697 | m_LocalScale: {x: 10, y: 1, z: 1} 1698 | m_ConstrainProportionsScale: 0 1699 | m_Children: [] 1700 | m_Father: {fileID: 2059835720} 1701 | m_RootOrder: 2 1702 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1703 | --- !u!1 &2059835719 1704 | GameObject: 1705 | m_ObjectHideFlags: 0 1706 | m_CorrespondingSourceObject: {fileID: 0} 1707 | m_PrefabInstance: {fileID: 0} 1708 | m_PrefabAsset: {fileID: 0} 1709 | serializedVersion: 6 1710 | m_Component: 1711 | - component: {fileID: 2059835720} 1712 | m_Layer: 0 1713 | m_Name: Demo Environment--------------------------------- 1714 | m_TagString: Untagged 1715 | m_Icon: {fileID: 0} 1716 | m_NavMeshLayer: 0 1717 | m_StaticEditorFlags: 0 1718 | m_IsActive: 1 1719 | --- !u!4 &2059835720 1720 | Transform: 1721 | m_ObjectHideFlags: 0 1722 | m_CorrespondingSourceObject: {fileID: 0} 1723 | m_PrefabInstance: {fileID: 0} 1724 | m_PrefabAsset: {fileID: 0} 1725 | m_GameObject: {fileID: 2059835719} 1726 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 1727 | m_LocalPosition: {x: 27.888596, y: 5.382996, z: 4.2418156} 1728 | m_LocalScale: {x: 1, y: 1, z: 1} 1729 | m_ConstrainProportionsScale: 0 1730 | m_Children: 1731 | - {fileID: 1402257232} 1732 | - {fileID: 137633618} 1733 | - {fileID: 1856537693} 1734 | - {fileID: 1277680943} 1735 | - {fileID: 1594541300} 1736 | m_Father: {fileID: 0} 1737 | m_RootOrder: 1 1738 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1739 | --- !u!1 &2065983280 1740 | GameObject: 1741 | m_ObjectHideFlags: 0 1742 | m_CorrespondingSourceObject: {fileID: 0} 1743 | m_PrefabInstance: {fileID: 0} 1744 | m_PrefabAsset: {fileID: 0} 1745 | serializedVersion: 6 1746 | m_Component: 1747 | - component: {fileID: 2065983282} 1748 | - component: {fileID: 2065983281} 1749 | m_Layer: 0 1750 | m_Name: Spawner 1751 | m_TagString: Untagged 1752 | m_Icon: {fileID: 0} 1753 | m_NavMeshLayer: 0 1754 | m_StaticEditorFlags: 0 1755 | m_IsActive: 0 1756 | --- !u!114 &2065983281 1757 | MonoBehaviour: 1758 | m_ObjectHideFlags: 0 1759 | m_CorrespondingSourceObject: {fileID: 0} 1760 | m_PrefabInstance: {fileID: 0} 1761 | m_PrefabAsset: {fileID: 0} 1762 | m_GameObject: {fileID: 2065983280} 1763 | m_Enabled: 1 1764 | m_EditorHideFlags: 0 1765 | m_Script: {fileID: 11500000, guid: a746ef034d374934ca8e42907c796477, type: 3} 1766 | m_Name: 1767 | m_EditorClassIdentifier: 1768 | k__BackingField: 1 1769 | k__BackingField: 0 1770 | k__BackingField: 0 1771 | spawnOffset: {x: 0, y: 0, z: 0} 1772 | waves: 1773 | - interval: 1 1774 | spawnAmount: 50 1775 | onSpawn: 1776 | m_PersistentCalls: 1777 | m_Calls: 1778 | - m_Target: {fileID: 2065983281} 1779 | m_TargetAssemblyTypeName: Kitbashery.core.Spawner, Assembly-CSharp 1780 | m_MethodName: RandomizeSpawnOffset 1781 | m_Mode: 4 1782 | m_Arguments: 1783 | m_ObjectArgument: {fileID: 0} 1784 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 1785 | m_IntArgument: 0 1786 | m_FloatArgument: 2 1787 | m_StringArgument: 1788 | m_BoolArgument: 0 1789 | m_CallState: 2 1790 | onWaveComplete: 1791 | m_PersistentCalls: 1792 | m_Calls: [] 1793 | poolIdentifiers: 1794 | - poolIndex: 0 1795 | prefabName: 1796 | - poolIndex: 0 1797 | prefabName: 1798 | - poolIndex: 0 1799 | prefabName: 1800 | - poolIndex: 0 1801 | prefabName: 1802 | - poolIndex: 0 1803 | prefabName: 1804 | - poolIndex: 0 1805 | prefabName: 1806 | - poolIndex: 0 1807 | prefabName: 1808 | - poolIndex: 0 1809 | prefabName: 1810 | - poolIndex: 0 1811 | prefabName: 1812 | - poolIndex: 0 1813 | prefabName: 1814 | - poolIndex: 0 1815 | prefabName: 1816 | - poolIndex: 0 1817 | prefabName: 1818 | - poolIndex: 0 1819 | prefabName: 1820 | - poolIndex: 0 1821 | prefabName: 1822 | - poolIndex: 0 1823 | prefabName: 1824 | - poolIndex: 0 1825 | prefabName: 1826 | - poolIndex: 0 1827 | prefabName: 1828 | - poolIndex: 0 1829 | prefabName: 1830 | - poolIndex: 0 1831 | prefabName: 1832 | - poolIndex: 0 1833 | prefabName: 1834 | - poolIndex: 0 1835 | prefabName: 1836 | - poolIndex: 0 1837 | prefabName: 1838 | - poolIndex: 0 1839 | prefabName: 1840 | - poolIndex: 0 1841 | prefabName: 1842 | - poolIndex: 0 1843 | prefabName: 1844 | - poolIndex: 0 1845 | prefabName: 1846 | - poolIndex: 0 1847 | prefabName: 1848 | - poolIndex: 0 1849 | prefabName: 1850 | - poolIndex: 0 1851 | prefabName: 1852 | - poolIndex: 0 1853 | prefabName: 1854 | - poolIndex: 0 1855 | prefabName: 1856 | - poolIndex: 0 1857 | prefabName: 1858 | - poolIndex: 0 1859 | prefabName: 1860 | - poolIndex: 0 1861 | prefabName: 1862 | - poolIndex: 0 1863 | prefabName: 1864 | - poolIndex: 0 1865 | prefabName: 1866 | - poolIndex: 0 1867 | prefabName: 1868 | - poolIndex: 0 1869 | prefabName: 1870 | - poolIndex: 0 1871 | prefabName: 1872 | - poolIndex: 0 1873 | prefabName: 1874 | - poolIndex: 0 1875 | prefabName: 1876 | - poolIndex: 0 1877 | prefabName: 1878 | - poolIndex: 0 1879 | prefabName: 1880 | - poolIndex: 0 1881 | prefabName: 1882 | - poolIndex: 0 1883 | prefabName: 1884 | - poolIndex: 0 1885 | prefabName: 1886 | - poolIndex: 0 1887 | prefabName: 1888 | - poolIndex: 0 1889 | prefabName: 1890 | - poolIndex: 0 1891 | prefabName: 1892 | - poolIndex: 0 1893 | prefabName: 1894 | randomizeWaves: 0 1895 | randomPools: 1896 | lastSpawned: {fileID: 0} 1897 | currentWave: 0 1898 | currentWaveSpawns: 0 1899 | --- !u!4 &2065983282 1900 | Transform: 1901 | m_ObjectHideFlags: 0 1902 | m_CorrespondingSourceObject: {fileID: 0} 1903 | m_PrefabInstance: {fileID: 0} 1904 | m_PrefabAsset: {fileID: 0} 1905 | m_GameObject: {fileID: 2065983280} 1906 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 1907 | m_LocalPosition: {x: 34.3, y: 6.134, z: -0.58} 1908 | m_LocalScale: {x: 1, y: 1, z: 1} 1909 | m_ConstrainProportionsScale: 0 1910 | m_Children: [] 1911 | m_Father: {fileID: 0} 1912 | m_RootOrder: 9 1913 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1914 | -------------------------------------------------------------------------------- /Samples~/Demo/Game Kit Demo.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4d45633fa6fda2a4e99780910cdcfff3 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "com.kitbashery.game-kit", 3 | "version": "1.1.1", 4 | "displayName": "Game Kit", 5 | "description": "A collection of feature rich gameplay systems.", 6 | "unity": "2021.3", 7 | "unityRelease": "0f1", 8 | "documentationUrl": "https://kitbashery.com/docs/game-kit", 9 | "changelogUrl": "https://github.com/Kitbashery/Game-Kit/commits/Latest", 10 | "licensesUrl": "https://github.com/Kitbashery/Game-Kit/blob/main/.github/LICENSE", 11 | "keywords": [ 12 | "Gameplay", 13 | "Physics", 14 | "Events" 15 | ], 16 | "author": { 17 | "name": "Kitbashery", 18 | "email": "kitbashery@gmail.com", 19 | "url": "https://www.kitbashery.com" 20 | }, 21 | "type": "tool", 22 | "samples": [ 23 | { 24 | "displayName": "Demo Scene(s)", 25 | "description": "Game Kit Demo scene(s).", 26 | "path": "Samples~/Demo" 27 | } 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /package.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 78c0764e80e7b634bb16be5b3fac7e30 3 | PackageManifestImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | --------------------------------------------------------------------------------