├── ProjectSettings ├── ProjectVersion.txt ├── ClusterInputManager.asset ├── PresetManager.asset ├── EditorBuildSettings.asset ├── XRSettings.asset ├── TimeManager.asset ├── VFXManager.asset ├── AudioManager.asset ├── TagManager.asset ├── UnityConnectSettings.asset ├── EditorSettings.asset ├── DynamicsManager.asset ├── NavMeshAreas.asset ├── Physics2DSettings.asset ├── GraphicsSettings.asset ├── QualitySettings.asset ├── InputManager.asset ├── InputManager - Copy.asset └── ProjectSettings.asset ├── Assets ├── Test RPG Scene │ ├── NavMesh.asset │ └── NavMesh.asset.meta ├── Prefabs │ ├── ENEMY.prefab.meta │ ├── Hit Effect.prefab.meta │ ├── Level_Panel.prefab.meta │ ├── SkillTree_Container.prefab.meta │ ├── Pickup.prefab │ ├── World Jump Text.prefab │ ├── SkillTree Panel.prefab │ └── ENEMY.prefab ├── Data.meta ├── Prefabs.meta ├── Scenes.meta ├── Scripts.meta ├── Sprites.meta ├── Animation.meta ├── Data │ ├── Attacks.meta │ ├── Skills.meta │ ├── PlayerTarget.asset.meta │ ├── Skills │ │ ├── Blocking.asset.meta │ │ ├── Kicking.asset.meta │ │ ├── Punching.asset.meta │ │ ├── Two Handed.asset.meta │ │ ├── Punching.asset │ │ ├── Blocking.asset │ │ ├── Kicking.asset │ │ └── Two Handed.asset │ ├── Attacks │ │ ├── Kick Attack.asset.meta │ │ ├── Punch Attack.asset.meta │ │ ├── Player's Attacks.asset.meta │ │ ├── Two Hand Sword.asset.meta │ │ ├── Kick Attack.asset │ │ ├── Punch Attack.asset │ │ ├── Two Hand Sword.asset │ │ └── Player's Attacks.asset │ └── PlayerTarget.asset ├── TextMesh Pro.meta ├── Imported Assets.meta ├── Scripts │ ├── Utility.meta │ ├── Skills System.meta │ ├── Enemy.cs.meta │ ├── Enemy │ │ ├── Enemy.cs.meta │ │ ├── EnemyMover.cs.meta │ │ ├── EnemyMover.cs │ │ └── Enemy.cs │ ├── SkillUser.cs.meta │ ├── InputController.cs.meta │ ├── Attacks │ │ ├── AttackList.cs.meta │ │ ├── AttackType.cs.meta │ │ ├── AttackList.cs │ │ └── AttackType.cs │ ├── Skills System │ │ ├── Skill.cs.meta │ │ ├── AllSkills_UI.cs.meta │ │ ├── Level_UI.cs.meta │ │ ├── Skill_UI.cs.meta │ │ ├── SkillsSelectionControl.cs.meta │ │ ├── AllSkills_UI.cs │ │ ├── Skill_UI.cs │ │ ├── Level_UI.cs │ │ ├── Skill.cs │ │ └── SkillsSelectionControl.cs │ ├── Utility │ │ ├── DotShower.cs.meta │ │ ├── EventMessager.cs.meta │ │ ├── SkyboxChanger.cs.meta │ │ ├── JumpTextController.cs.meta │ │ ├── MeshColliderFixer.cs.meta │ │ ├── TargetTransform.cs.meta │ │ ├── AnimationEventFinder.cs.meta │ │ ├── EnvironmentGenerator.cs.meta │ │ ├── MultiModelCharacter.cs.meta │ │ ├── TargetTransform.cs │ │ ├── MeshColliderFixer.cs │ │ ├── SkyboxChanger.cs │ │ ├── EventMessager.cs │ │ ├── MultiModelCharacter.cs │ │ ├── DotShower.cs │ │ ├── AnimationEventFinder.cs │ │ ├── EnvironmentGenerator.cs │ │ └── JumpTextController.cs │ ├── Basic Dummy Scripts │ │ ├── DummyPickup.cs.meta │ │ └── DummyPickup.cs │ ├── Follow Camera Readme.README │ ├── Enemy.cs │ ├── InputController.cs │ ├── SkillUser.cs │ ├── FollowCamera.cs │ └── CombatControl.cs ├── Animation │ ├── SkillTree_Container.controller.meta │ └── SkillTree_Container.controller └── ExplosiveLLC Changes └── README.md /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2019.3.9f1 2 | m_EditorVersionWithRevision: 2019.3.9f1 (e6e740a1c473) 3 | -------------------------------------------------------------------------------- /Assets/Test RPG Scene/NavMesh.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KampinKarl1/Free-RPG-Tutorial-with-Skyrim-Like-Skill-System-/HEAD/Assets/Test RPG Scene/NavMesh.asset -------------------------------------------------------------------------------- /ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /ProjectSettings/PresetManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1386491679 &1 4 | PresetManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_DefaultPresets: {} 8 | -------------------------------------------------------------------------------- /Assets/Prefabs/ENEMY.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0ddd217944301d042a5bd30b69ff5cc6 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Data.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e0ace97b2eb5c51488039f4e92df95f9 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Prefabs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ec624d1323aa7bc4ca0f382c5c47a0d4 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Prefabs/Hit Effect.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f9e00929364ea1f47a0c783152d784ca 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Prefabs/Level_Panel.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f955516292aaa1343b914c06885993d8 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4a264ded4213deb41a89143156b488bc 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 16ac7a7ad2ee1774b99e7f1e3f1d7390 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Sprites.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 05f152f00fe591146a63a35d921e824f 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Animation.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: aa823401ad4d8a0428092939d97a56be 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Data/Attacks.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 98b78255ad428214ca3542750ff8b594 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Data/Skills.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 40530c68a0028d648b39f796c1eb1eeb 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Prefabs/SkillTree_Container.prefab.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e5598aaf82dfbb7479e8a321b50b26f9 3 | PrefabImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/TextMesh Pro.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f54d1bd14bd3ca042bd867b519fee8cc 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Imported Assets.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e21a680ce01d0ec489c064301d02b6b4 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a7bf18801bb7a624a84e59a68edc069d 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: [] 8 | m_configObjects: {} 9 | -------------------------------------------------------------------------------- /Assets/Scripts/Skills System.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 363f8626bc3132b4aaac981cfa61aafe 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /ProjectSettings/XRSettings.asset: -------------------------------------------------------------------------------- 1 | { 2 | "m_SettingKeys": [ 3 | "VR Device Disabled", 4 | "VR Device User Alert" 5 | ], 6 | "m_SettingValues": [ 7 | "False", 8 | "False" 9 | ] 10 | } -------------------------------------------------------------------------------- /Assets/Data/PlayerTarget.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f12f41573ee27c44da6dbbb938802f32 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Data/Skills/Blocking.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: eb2a1717ad90dd344860a69bfd74a59e 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Data/Skills/Kicking.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d6bf2936b13014646906d13e448667a9 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Data/Skills/Punching.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3e0a46ece2fb5234a86bd7632b9f1158 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Data/Attacks/Kick Attack.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 92bb1bd97aea67c42b186cca6417bb41 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Data/Attacks/Punch Attack.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3723e31d2a88ff74195d4370e4c925e5 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Data/Skills/Two Handed.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4f27082bb0739d042bed50113a9fc4c0 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Test RPG Scene/NavMesh.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3d5b4edc5064ef14d91ff683264759a3 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Data/Attacks/Player's Attacks.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6a54f3c23bb66304cb059694125cf72d 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Data/Attacks/Two Hand Sword.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d9ade9bf90ae8ca45bd0ccf288536e9e 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Animation/SkillTree_Container.controller.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6ff1000de89be9a419450ffd5a287a98 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.33333334 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /Assets/Scripts/Enemy.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 77a903fcbbfee3f45827b9536832ec73 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Enemy/Enemy.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 77a903fcbbfee3f45827b9536832ec73 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/SkillUser.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e607f4a856b1cfd48901ed6c9d7d5203 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Enemy/EnemyMover.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b2e8c63adce4f9648a1fcc1b0c8f08f8 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/InputController.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 60c201a7c0735fc4992ef56c36fe6cd7 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Attacks/AttackList.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3b807e56044edbc4797c04ca9ff8540f 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Attacks/AttackType.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4e95b6d7b62d4c74e987ea1e7cb21ac7 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Skills System/Skill.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6810cc81c031bd448ae2b498f83fc398 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/DotShower.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8bb0f3b7eb8092a469a0a91a8a844538 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/EventMessager.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b028254b197a89e4bb651d761c3287ae 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/SkyboxChanger.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 97edbed2c57d4fa44931a0ca39b0271b 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Skills System/AllSkills_UI.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bf3e9ebd51dacb94e8a7e30e2db596e9 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Skills System/Level_UI.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cfb0d12f3b216b946905b86606d48e3e 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Skills System/Skill_UI.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: eb931c9a7864d9946b5aeef364665c99 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/JumpTextController.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cf92e4907ff6be64daf209a55447593c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/MeshColliderFixer.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0cf2aa58f7070814daf3f4f99f8c0e20 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/TargetTransform.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 45b793a16be28b24cbd474025e57b6c0 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Basic Dummy Scripts/DummyPickup.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6963e638aaa96a748b8b036bb8338a99 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/AnimationEventFinder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 734915839a3a22e42bd116e66b971858 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/EnvironmentGenerator.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5f30b905b4832274bac1fa4f91420990 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/MultiModelCharacter.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c19b6a358f03175469d66bd590b61d69 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Skills System/SkillsSelectionControl.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 446f97602d98eed4283054e947546331 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/TargetTransform.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | 6 | [CreateAssetMenu] 7 | public class TargetTransform : ScriptableObject 8 | { 9 | private Transform target = null; 10 | public Transform Value => target; 11 | 12 | public void SetTarget(Transform t) => target = t; 13 | } 14 | -------------------------------------------------------------------------------- /ProjectSettings/VFXManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!937362698 &1 4 | VFXManager: 5 | m_ObjectHideFlags: 0 6 | m_IndirectShader: {fileID: 0} 7 | m_CopyBufferShader: {fileID: 0} 8 | m_SortShader: {fileID: 0} 9 | m_StripUpdateShader: {fileID: 0} 10 | m_RenderPipeSettingsPath: 11 | m_FixedTimeStep: 0.016666668 12 | m_MaxDeltaTime: 0.05 13 | -------------------------------------------------------------------------------- /Assets/Data/PlayerTarget.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 45b793a16be28b24cbd474025e57b6c0, type: 3} 13 | m_Name: PlayerTarget 14 | m_EditorClassIdentifier: 15 | -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Volume: 1 8 | Rolloff Scale: 1 9 | Doppler Factor: 1 10 | Default Speaker Mode: 2 11 | m_SampleRate: 0 12 | m_DSPBufferSize: 1024 13 | m_VirtualVoiceCount: 512 14 | m_RealVoiceCount: 32 15 | m_SpatializerPlugin: 16 | m_AmbisonicDecoderPlugin: 17 | m_DisableAudio: 0 18 | m_VirtualizeEffects: 1 19 | m_RequestedDSPBufferSize: 1024 20 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/MeshColliderFixer.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class MeshColliderFixer : MonoBehaviour 6 | { 7 | private void Awake() 8 | { 9 | MeshCollider[] meshCols = FindObjectsOfType(); 10 | 11 | for (int i = 0; i < meshCols.Length; ++i) 12 | { 13 | if (!meshCols[i].GetComponent()) 14 | meshCols[i].gameObject.AddComponent(); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/SkyboxChanger.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class SkyboxChanger : MonoBehaviour 6 | { 7 | private Material currentSkybox = null; 8 | [SerializeField] Material levelupSkybox = null; 9 | [SerializeField] Material normalSkybox = null; 10 | 11 | public void ChangeSkybox() 12 | { 13 | currentSkybox = currentSkybox == normalSkybox ? levelupSkybox : normalSkybox; 14 | 15 | RenderSettings.skybox = currentSkybox; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Assets/Scripts/Attacks/AttackList.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | [CreateAssetMenu(menuName = ("Attacks/New Attack List"))] 6 | public class AttackList : ScriptableObject 7 | { 8 | [SerializeField] private List attacks = new List(); 9 | public List Attacks => attacks; 10 | 11 | public void InitializeAttacks() 12 | { 13 | if (attacks.Count == 0) 14 | return; 15 | 16 | foreach (AttackType a in attacks) 17 | a.InitializeAttackType(); 18 | } 19 | } -------------------------------------------------------------------------------- /Assets/Data/Skills/Punching.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 6810cc81c031bd448ae2b498f83fc398, type: 3} 13 | m_Name: Punching 14 | m_EditorClassIdentifier: 15 | skillName: Punching 16 | description: Hand to hand combat ability. 17 | currentLevel: 1 18 | xpToNextLevel: 150 19 | xpScalePerLevel: 15 20 | currentXP: 32 21 | -------------------------------------------------------------------------------- /Assets/Data/Skills/Blocking.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 6810cc81c031bd448ae2b498f83fc398, type: 3} 13 | m_Name: Blocking 14 | m_EditorClassIdentifier: 15 | skillName: Blocking 16 | description: One's ability to absorb or deflect damage. 17 | currentLevel: 0 18 | xpToNextLevel: 75 19 | xpScalePerLevel: 50 20 | currentXP: 0 21 | -------------------------------------------------------------------------------- /Assets/Data/Skills/Kicking.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 6810cc81c031bd448ae2b498f83fc398, type: 3} 13 | m_Name: Kicking 14 | m_EditorClassIdentifier: 15 | skillName: Kicking 16 | description: The ability to use one's legs to inflict damage. 17 | currentLevel: 1 18 | xpToNextLevel: 150 19 | xpScalePerLevel: 50 20 | currentXP: 95 21 | -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: 7 | - Collide 8 | - Shadow 9 | - Enemy 10 | layers: 11 | - Default 12 | - TransparentFX 13 | - Ignore Raycast 14 | - 15 | - Water 16 | - UI 17 | - 18 | - 19 | - TempCast 20 | - Walkable 21 | - Enemy 22 | - 23 | - 24 | - 25 | - 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - 40 | - 41 | - 42 | - 43 | m_SortingLayers: 44 | - name: Default 45 | uniqueID: 0 46 | locked: 0 47 | -------------------------------------------------------------------------------- /Assets/Data/Attacks/Kick Attack.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 4e95b6d7b62d4c74e987ea1e7cb21ac7, type: 3} 13 | m_Name: Kick Attack 14 | m_EditorClassIdentifier: 15 | governingSkill: {fileID: 11400000, guid: d6bf2936b13014646906d13e448667a9, type: 2} 16 | baseDamage: 30 17 | increasePerLevel: 3 18 | baseXPAttack: 15 19 | baseXPKill: 35 20 | -------------------------------------------------------------------------------- /Assets/Data/Attacks/Punch Attack.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 4e95b6d7b62d4c74e987ea1e7cb21ac7, type: 3} 13 | m_Name: Punch Attack 14 | m_EditorClassIdentifier: 15 | governingSkill: {fileID: 11400000, guid: 3e0a46ece2fb5234a86bd7632b9f1158, type: 2} 16 | baseDamage: 15 17 | increasePerLevel: 5 18 | baseXPAttack: 10 19 | baseXPKill: 50 20 | -------------------------------------------------------------------------------- /Assets/Data/Attacks/Two Hand Sword.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 4e95b6d7b62d4c74e987ea1e7cb21ac7, type: 3} 13 | m_Name: Two Hand Sword 14 | m_EditorClassIdentifier: 15 | governingSkill: {fileID: 11400000, guid: 4f27082bb0739d042bed50113a9fc4c0, type: 2} 16 | baseDamage: 25 17 | increasePerLevel: 2 18 | baseXPAttack: 25 19 | baseXPKill: 75 20 | -------------------------------------------------------------------------------- /Assets/Data/Skills/Two Handed.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 6810cc81c031bd448ae2b498f83fc398, type: 3} 13 | m_Name: Two Handed 14 | m_EditorClassIdentifier: 15 | skillName: Two-Handed Weapons 16 | description: Increase skill in two handed weapon handling. 17 | currentLevel: 1 18 | xpToNextLevel: 250 19 | xpScalePerLevel: 50 20 | currentXP: 202 21 | -------------------------------------------------------------------------------- /Assets/Data/Attacks/Player's Attacks.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 11500000, guid: 3b807e56044edbc4797c04ca9ff8540f, type: 3} 13 | m_Name: Player's Attacks 14 | m_EditorClassIdentifier: 15 | attacks: 16 | - {fileID: 11400000, guid: 3723e31d2a88ff74195d4370e4c925e5, type: 2} 17 | - {fileID: 11400000, guid: 92bb1bd97aea67c42b186cca6417bb41, type: 2} 18 | - {fileID: 11400000, guid: d9ade9bf90ae8ca45bd0ccf288536e9e, type: 2} 19 | -------------------------------------------------------------------------------- /Assets/Scripts/Basic Dummy Scripts/DummyPickup.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class DummyPickup : MonoBehaviour 6 | { 7 | [SerializeField] private AudioClip pickupNoise = null; 8 | 9 | private void OnCollisionEnter(Collision collision) 10 | { 11 | if (collision.collider.CompareTag("Player")) 12 | 13 | Pickup(); 14 | } 15 | 16 | private void Pickup() 17 | { 18 | AudioSource.PlayClipAtPoint(pickupNoise, transform.position); 19 | 20 | int randAmt = Random.Range(50, 500); 21 | 22 | JumpTextController.PlayWorldJumpMessageAt($"+${randAmt}", transform.position); 23 | 24 | Destroy(gameObject); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/EventMessager.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class EventMessager : MonoBehaviour 6 | { 7 | void Start() 8 | { 9 | if (!JumpTextController.Instance) 10 | { 11 | throw new System.Exception("Event messager won't work without something to print messages to the screen"); 12 | } 13 | 14 | SkillUser[] skillUsers = FindObjectsOfType(); 15 | 16 | foreach (SkillUser u in skillUsers) 17 | { 18 | foreach (Skill s in u.Skills) 19 | { 20 | s.onSkillIncrease += delegate { JumpTextController.PlayScreenMessage($"{u.name} leveled up {s.Name} to {s.CurrentLevel}!"); }; 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Assets/Scripts/Enemy/EnemyMover.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using UnityEngine.AI; 5 | using System.Linq; 6 | 7 | public class EnemyMover : MonoBehaviour 8 | { 9 | [SerializeField] private NavMeshAgent agent = null; 10 | 11 | private bool CollidingWithPlayer(GameObject colliderObj) => colliderObj.CompareTag("Player"); 12 | 13 | private void Start() 14 | { 15 | 16 | } 17 | 18 | private void OnTriggerEnter(Collider other) 19 | { 20 | if (CollidingWithPlayer(other.gameObject)) 21 | MoveAwayFromPlayer(other.transform); 22 | } 23 | 24 | private void OnTriggerExit(Collider other) 25 | { 26 | } 27 | 28 | private void MoveAwayFromPlayer(Transform player) 29 | { 30 | Vector3 dest = transform.position - player.position; 31 | agent.SetDestination(dest); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 1 7 | m_Enabled: 0 8 | m_TestMode: 0 9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events 10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events 11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com 12 | m_TestInitMode: 0 13 | CrashReportingSettings: 14 | m_EventUrl: https://perf-events.cloud.unity3d.com 15 | m_Enabled: 0 16 | m_LogBufferSize: 10 17 | m_CaptureEditorExceptions: 1 18 | UnityPurchasingSettings: 19 | m_Enabled: 0 20 | m_TestMode: 0 21 | UnityAnalyticsSettings: 22 | m_Enabled: 0 23 | m_TestMode: 0 24 | m_InitializeOnStartup: 1 25 | UnityAdsSettings: 26 | m_Enabled: 0 27 | m_InitializeOnStartup: 1 28 | m_TestMode: 0 29 | m_IosGameId: 30 | m_AndroidGameId: 31 | m_GameIds: {} 32 | m_GameId: 33 | PerformanceReportingSettings: 34 | m_Enabled: 0 35 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/MultiModelCharacter.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using UnityEngine.UIElements; 5 | 6 | public class MultiModelCharacter : MonoBehaviour 7 | { 8 | [SerializeField] private GameObject activeModel = null; 9 | [SerializeField, Tooltip("Set as true if you want to keep the current model active")] 10 | private bool keepCurrent = false; 11 | [SerializeField] private List modelsToChooseFrom = new List(); 12 | 13 | void Start() 14 | { 15 | if (modelsToChooseFrom.Count == 0) 16 | return; 17 | 18 | foreach (GameObject model in modelsToChooseFrom) 19 | model.SetActive(false); 20 | 21 | if (keepCurrent) 22 | { 23 | activeModel.SetActive(true); 24 | return; 25 | } 26 | 27 | activeModel = modelsToChooseFrom[Random.Range(0, modelsToChooseFrom.Count)]; 28 | activeModel.SetActive(true); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Assets/Scripts/Follow Camera Readme.README: -------------------------------------------------------------------------------- 1 | Create a Gameobject and name it CameraBoom (or whatever). 2 | Child the Object to your player - Or the object it's going to follow. 3 | Reset it's position in the Transform component. 4 | Unchild the object. 5 | 6 | Child the main camera to the object/Camera Boom. 7 | In the 'Game' tab of the inspector, give the Camera object an offset from the object you want it to follow 8 | A position of X: -.25, Y: 7, Z: -7 9 | and rotation of X:30, Y: 2, Z: 0 is pretty good to focus on the back of the followed object. 10 | 11 | 12 | Attach the FollowCamera.cs script to the CameraBoom and set the player to the target object field. 13 | 14 | The script uses Input.GetAxis and the Mouse Y and Mouse X defaults to rotate around the target. 15 | 16 | If you're using an XBox Controller, make sure to set Edit/Project Settings/Input Manager/Axes - "Mouse X" to Type.Joystick axis on the 4th axis, "Mouse Y" to the 5th axis, 17 | Gravity and Sensitivity for both to 1 and Dead to .2 (.2 will ignore minute movements or irregularities with the joysticks. 18 | -------------------------------------------------------------------------------- /Assets/Scripts/Skills System/AllSkills_UI.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class AllSkills_UI : MonoBehaviour 6 | { 7 | [SerializeField] private SkillUser player = null; 8 | [SerializeField] private SkillsSelectionControl skillsControl = null; 9 | 10 | [SerializeField] private GameObject skillUIPrefab = null; 11 | 12 | [SerializeField] private Transform contentParent = null; 13 | 14 | private void Start() 15 | { 16 | InitializeSkills(); 17 | } 18 | 19 | private void InitializeSkills() 20 | { 21 | int numSkills = player.Skills.Count; 22 | GameObject[] skillsObjs = new GameObject[numSkills]; 23 | 24 | for (int i = 0; i < numSkills; ++i) 25 | { 26 | GameObject skillObj = Instantiate(skillUIPrefab, contentParent); 27 | skillsObjs[i] = skillObj; 28 | 29 | skillObj.GetComponent().InitializeSkillTreeUI(player.Skills[i]); 30 | } 31 | 32 | skillsControl.InitializeSkillInput(skillsObjs); 33 | 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Assets/Scripts/Skills System/Skill_UI.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using UnityEngine.UI; 5 | using TMPro; 6 | 7 | public class Skill_UI : MonoBehaviour 8 | { 9 | private Skill skill = null; 10 | 11 | [SerializeField] private TextMeshProUGUI skillName = null; 12 | [SerializeField] private TextMeshProUGUI skillLevel = null; 13 | [SerializeField] private Image levelBar = null; 14 | 15 | public void InitializeSkillTreeUI(Skill skill) 16 | { 17 | this.skill = skill; 18 | 19 | skillName.text = skill.Name; 20 | skillLevel.text = skill.CurrentLevel.ToString(); 21 | 22 | levelBar.fillAmount = skill.Progress; 23 | 24 | skill.onSkillIncrease += UpdateLevel; 25 | skill.onChangeXP += UpdateXP; 26 | } 27 | 28 | private void UpdateLevel(int level) => skillLevel.text = level.ToString(); 29 | 30 | private void UpdateXP(float progress) => levelBar.fillAmount = progress; 31 | 32 | private void OnDisable() 33 | { 34 | skill.onChangeXP -= UpdateXP; 35 | skill.onSkillIncrease -= UpdateLevel; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/DotShower.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using TMPro; 5 | 6 | public class DotShower : MonoBehaviour 7 | { 8 | [SerializeField] Transform playerTransform = null; 9 | [SerializeField] TextMeshProUGUI dotShowerText = null; 10 | [SerializeField] TargetTransform target = null; 11 | [SerializeField] Vector3 heightOffset = new Vector3(); 12 | 13 | void Start() 14 | { 15 | heightOffset = new Vector3(0,playerTransform.localScale.y + 3.50f, 0); 16 | } 17 | 18 | void Update() 19 | { 20 | if (target.Value == null) 21 | return; 22 | 23 | transform.position = playerTransform.position + heightOffset; 24 | 25 | Vector3 dir = playerTransform.forward - target.Value.position; 26 | 27 | Quaternion lookDir = Quaternion.LookRotation(dir); 28 | 29 | transform.rotation = Quaternion.Euler(0f, lookDir.y, 0f); 30 | 31 | float dot = Vector3.Dot(playerTransform.forward.normalized, target.Value.position.normalized); 32 | 33 | dotShowerText.text = $"{target.Value.name} @dir: {dot}"; 34 | } 35 | } 36 | 37 | -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 9 7 | m_ExternalVersionControlSupport: Visible Meta Files 8 | m_SerializationMode: 2 9 | m_LineEndingsForNewScripts: 0 10 | m_DefaultBehaviorMode: 0 11 | m_PrefabRegularEnvironment: {fileID: 0} 12 | m_PrefabUIEnvironment: {fileID: 0} 13 | m_SpritePackerMode: 0 14 | m_SpritePackerPaddingPower: 1 15 | m_EtcTextureCompressorBehavior: 1 16 | m_EtcTextureFastCompressor: 1 17 | m_EtcTextureNormalCompressor: 2 18 | m_EtcTextureBestCompressor: 4 19 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref 20 | m_ProjectGenerationRootNamespace: 21 | m_CollabEditorSettings: 22 | inProgressEnabled: 1 23 | m_EnableTextureStreamingInEditMode: 1 24 | m_EnableTextureStreamingInPlayMode: 1 25 | m_AsyncShaderCompilation: 1 26 | m_EnterPlayModeOptionsEnabled: 0 27 | m_EnterPlayModeOptions: 3 28 | m_ShowLightmapResolutionOverlay: 1 29 | m_UseLegacyProbeSampleCount: 0 30 | m_AssetPipelineMode: 1 31 | m_CacheServerMode: 0 32 | m_CacheServerEndpoint: 33 | m_CacheServerNamespacePrefix: default 34 | m_CacheServerEnableDownload: 1 35 | m_CacheServerEnableUpload: 1 36 | -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 11 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_SleepThreshold: 0.005 11 | m_DefaultContactOffset: 0.01 12 | m_DefaultSolverIterations: 6 13 | m_DefaultSolverVelocityIterations: 1 14 | m_QueriesHitBackfaces: 0 15 | m_QueriesHitTriggers: 1 16 | m_EnableAdaptiveForce: 0 17 | m_ClothInterCollisionDistance: 0 18 | m_ClothInterCollisionStiffness: 0 19 | m_ContactsGeneration: 1 20 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21 | m_AutoSimulation: 1 22 | m_AutoSyncTransforms: 0 23 | m_ReuseCollisionCallbacks: 1 24 | m_ClothInterCollisionSettingsToggle: 0 25 | m_ContactPairsMode: 0 26 | m_BroadphaseType: 0 27 | m_WorldBounds: 28 | m_Center: {x: 0, y: 0, z: 0} 29 | m_Extent: {x: 250, y: 250, z: 250} 30 | m_WorldSubdivisions: 8 31 | m_FrictionType: 0 32 | m_EnableEnhancedDeterminism: 0 33 | m_EnableUnifiedHeightmaps: 1 34 | m_DefaultMaxAngluarSpeed: 7 35 | -------------------------------------------------------------------------------- /Assets/ExplosiveLLC Changes: -------------------------------------------------------------------------------- 1 | Changes to RPGCharacterMovementControllerFREE.cs 2 | 3 | Under the variables already included (around line 70) 4 | 5 | Add: 6 | //Targeting Properties 7 | 8 | private Vector3 StrafeTarget => rpgCharacterController.HasTarget ? rpgCharacterController.TargetPos : CurrentLookDir; 9 | private Vector3 CurrentLookDir => transform.forward + transform.position; 10 | //to make the char. move around in a combat stance in the direction you're facing: 11 | //private Vector3 CurrentLookDir => new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")) + transform.position; 12 | 13 | Find calls to "Strafing" by using 'ctrl/cmd + f : Strafing(' 14 | 15 | Change the parameter to Strafing (StrafeTarget); 16 | 17 | 18 | Changes to RPGCharacterControllerFREE.cs 19 | 20 | Change target from public to private. 21 | 22 | private GameObject target = null; 23 | 24 | Add this under the target variable (or whereever). 25 | 26 | //--------------ADD THIS TO RPGCharacterControllerFREE.cs SCRIPT!----------------- 27 | 28 | public void SetTarget(GameObject t) => target = t; 29 | public bool HasTarget => target != null; 30 | public GameObject GetTarget() => target; 31 | public Vector3 TargetPos => target.transform.position; 32 | 33 | //-------------------------------------------------------------------------------- 34 | -------------------------------------------------------------------------------- /Assets/Scripts/Skills System/Level_UI.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using UnityEngine.UI; 5 | using TMPro; 6 | 7 | public class Level_UI : MonoBehaviour 8 | { 9 | [SerializeField] private SkillUser user = null; 10 | 11 | [SerializeField] private TextMeshProUGUI levelText = null; 12 | [SerializeField] private TextMeshProUGUI perksToIncreaseText = null; 13 | [SerializeField] private Image levelProgressImage = null; 14 | 15 | void Awake() 16 | { 17 | if (user) 18 | { 19 | user.onPlayerChange += UpdateUI; 20 | 21 | user.onChangeXP += UpdateProgressBar; 22 | user.onLevelUp += UpdateLevel; 23 | user.onPerkIncrease += UpdatePerks; 24 | } 25 | } 26 | 27 | private void UpdateProgressBar(float progress) => levelProgressImage.fillAmount = progress; 28 | 29 | private void UpdateLevel(int level) => levelText.text = level.ToString(); 30 | 31 | private void UpdatePerks(int perks) => perksToIncreaseText.text = "Perks to increase: " + perks.ToString(); 32 | 33 | private void UpdateUI(int level, int perks, float progress) 34 | { 35 | levelText.text = level.ToString(); 36 | 37 | perksToIncreaseText.text = "Perks to increase: " + perks.ToString(); 38 | 39 | levelProgressImage.fillAmount = progress; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Assets/Scripts/Attacks/AttackType.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | [CreateAssetMenu (menuName = "Attacks/New Attack Type")] 6 | public class AttackType : ScriptableObject 7 | { 8 | [SerializeField] private Skill governingSkill = null; 9 | [SerializeField] private float baseDamage = 0; 10 | [SerializeField] private float increasePerLevel = 0; 11 | [SerializeField] private float baseXPAttack = 0; 12 | [SerializeField] private float baseXPKill = 0; 13 | 14 | private float currentDamage = 0; 15 | private float currentXPAttack = 0; 16 | private float currentXPKill; 17 | 18 | public Skill GetGoverningSkill => governingSkill; 19 | public float GetDamage => currentDamage; 20 | public float GetXPForAttack => currentXPAttack; 21 | public float GetXPForKill => currentXPKill; 22 | 23 | public void InitializeAttackType() 24 | { 25 | currentDamage = baseDamage; 26 | currentXPAttack = baseXPAttack; 27 | currentXPKill = baseXPKill; 28 | 29 | for (int i = 0; i < governingSkill.CurrentLevel; ++i) 30 | IncreaseSkill(i); 31 | 32 | governingSkill.onSkillIncrease += IncreaseSkill; 33 | } 34 | 35 | private void IncreaseSkill(int skillLevel) 36 | { 37 | currentDamage += increasePerLevel; 38 | currentXPAttack += baseXPAttack + (1 * skillLevel); 39 | currentXPKill += baseXPKill + (1 * skillLevel); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 2 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | accuratePlacement: 0 88 | debug: 89 | m_Flags: 0 90 | m_SettingNames: 91 | - Humanoid 92 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/AnimationEventFinder.cs: -------------------------------------------------------------------------------- 1 | 2 | #if UNITY_EDITOR 3 | using System.Collections; 4 | using System.Collections.Generic; 5 | using UnityEngine; 6 | using UnityEditor; 7 | 8 | public class AnimationEventFinder : MonoBehaviour 9 | { 10 | [SerializeField] GameObject[] animationFBX_Array = null; 11 | 12 | [Header("Leave at 0 or empty except to pass to event")] 13 | [SerializeField] private float eventFloatParam = 0; 14 | [SerializeField] private int eventIntParam = 0; 15 | [SerializeField] private string eventStringParam = ""; 16 | [SerializeField] private Object eventObjectRefParam = null; 17 | 18 | private void Start() 19 | { 20 | List anims = new List(); 21 | 22 | foreach (GameObject fbx in animationFBX_Array) 23 | { 24 | foreach (AnimationClip clip in AnimationUtility.GetAnimationClips(fbx)) 25 | { 26 | anims.Add(clip); 27 | } 28 | } 29 | 30 | PassParametersToAnimationEvents(anims, eventFloatParam, eventIntParam, eventStringParam, eventObjectRefParam); 31 | } 32 | 33 | private void PassParametersToAnimationEvents(List clips, float f, int i, string s, Object o) 34 | { 35 | foreach (AnimationClip clip in clips) 36 | { 37 | AnimationEvent [] events = AnimationUtility.GetAnimationEvents(clip); 38 | 39 | foreach (AnimationEvent e in events) 40 | { 41 | e.floatParameter = f; 42 | e.intParameter = i; 43 | e.stringParameter = s; 44 | e.objectReferenceParameter = o; 45 | } 46 | } 47 | } 48 | } 49 | #endif -------------------------------------------------------------------------------- /Assets/Scripts/Skills System/Skill.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | [CreateAssetMenu] 6 | public class Skill : ScriptableObject 7 | { 8 | [SerializeField] private string skillName = "New Skill Tree"; 9 | [SerializeField] private string description = "Does stuff"; 10 | [SerializeField] private int currentLevel = 0; 11 | [SerializeField] private float xpToNextLevel = 1; 12 | [SerializeField, Tooltip("The amount xpToNextLevel increases (times level) when gaining a level")] 13 | private float xpScalePerLevel = 50; 14 | [SerializeField] private float currentXP = 0; 15 | 16 | 17 | public string Name => skillName; 18 | public string Description => description; 19 | 20 | public int CurrentLevel => currentLevel; 21 | public float Progress => currentXP / xpToNextLevel; 22 | 23 | public delegate void OnSkillIncrease(int level); 24 | public delegate void OnChangeXP(float progress); 25 | 26 | public OnSkillIncrease onSkillIncrease; 27 | public OnChangeXP onChangeXP; 28 | 29 | public void IncreaseSkill(float xp) 30 | { 31 | Debug.Log("Earned " + xp.ToString() +" xp"); 32 | currentXP += xp; 33 | 34 | if (currentXP >= xpToNextLevel) 35 | { 36 | do 37 | { 38 | currentLevel++; 39 | 40 | currentXP -= xpToNextLevel; 41 | 42 | xpToNextLevel += xpScalePerLevel * currentLevel; 43 | 44 | onSkillIncrease?.Invoke(currentLevel); 45 | } 46 | while (currentXP >= xpToNextLevel); 47 | } 48 | 49 | onChangeXP?.Invoke(Progress); 50 | } 51 | 52 | private void OnValidate() 53 | { 54 | if (xpToNextLevel < 1) 55 | { 56 | Debug.LogError("XP to next level being less than one will cause stack overflow"); 57 | xpToNextLevel = 1; 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Assets/Scripts/Enemy.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class Enemy : MonoBehaviour 6 | { 7 | private Transform player = null; 8 | 9 | [SerializeField] private float health = 100; 10 | public float Health => health; 11 | 12 | private void Start() 13 | { 14 | player = GameObject.FindGameObjectWithTag("Player").transform; 15 | 16 | InitializeHitEffect(); 17 | } 18 | 19 | private void Update() 20 | { 21 | transform.LookAt(player); 22 | } 23 | 24 | public void ReceiveDamage(float damage) 25 | { 26 | //So we dont get credit for multiple kills on the same object 27 | if (health <= 0) 28 | return; 29 | 30 | health -= damage; 31 | 32 | DoHitEffect(); 33 | 34 | if (health <= 0) 35 | Die(); 36 | } 37 | 38 | private void Die() 39 | { 40 | Destroy(gameObject); 41 | } 42 | 43 | #region Stuff for Particles 44 | const float HIT_FX_DUR = .75f; 45 | [SerializeField] private GameObject hitEffectPrefab = null; 46 | private GameObject hitEffect = null; 47 | private ParticleSystem ps = null; 48 | #endregion 49 | #region Helper 50 | private void InitializeHitEffect() 51 | { 52 | hitEffect = Instantiate(hitEffectPrefab, transform.position, transform.rotation); 53 | hitEffect.SetActive(false); 54 | 55 | ps = hitEffect.GetComponentInChildren(); 56 | } 57 | 58 | private void DoHitEffect() 59 | { 60 | StartCoroutine(HitEffect()); 61 | } 62 | 63 | private IEnumerator HitEffect() 64 | { 65 | hitEffect.SetActive(true); 66 | hitEffect.transform.position = transform.position + new Vector3(0, transform.localScale.y / 2, 0); 67 | ps.Play(); 68 | yield return new WaitForSeconds(HIT_FX_DUR); 69 | hitEffect.SetActive(false); 70 | } 71 | #endregion 72 | } 73 | -------------------------------------------------------------------------------- /Assets/Scripts/InputController.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class InputController : MonoBehaviour 6 | { 7 | //-------------------------- 8 | [SerializeField] private SkyboxChanger skyboxChanger = null; 9 | [SerializeField] private SkillsSelectionControl skillsControl = null; 10 | [SerializeField] private CombatControl combatControl = null; 11 | [SerializeField] private RPGCharacterAnimsFREE.RPGCharacterWeaponControllerFREE weapons = null; 12 | //-------------------------- 13 | 14 | //-------------------------- 15 | [SerializeField] KeyCode changeSkillPanelStatus = KeyCode.Tab; 16 | [SerializeField] KeyCode scrollLeft_Skill = KeyCode.A; 17 | [SerializeField] KeyCode scrollRight_Skill = KeyCode.D; 18 | [SerializeField] private KeyCode skyboxKey = KeyCode.Delete; 19 | [SerializeField] private KeyCode swapWeapon = KeyCode.Y; 20 | //-------------------------- 21 | 22 | void Update() 23 | { 24 | //Targetting 25 | if (Input.GetAxisRaw("Target") != 0) 26 | combatControl.LookForTarget(); 27 | 28 | //Skills 29 | 30 | if (Input.GetKey(scrollRight_Skill) && skillsControl && skillsControl.SkillPanelOpen) 31 | skillsControl.SelectElementRight(); 32 | 33 | if (Input.GetKey(scrollLeft_Skill) && skillsControl && skillsControl.SkillPanelOpen) 34 | skillsControl.SelectElementLeft(); 35 | 36 | if (Input.GetKey(changeSkillPanelStatus) && skillsControl && skillsControl.SkillPanelOpen) 37 | skillsControl.CloseSkills(); 38 | if (Input.GetKey(changeSkillPanelStatus) && skillsControl && !skillsControl.SkillPanelOpen) 39 | skillsControl.OpenSkills(); 40 | 41 | //Skybox 42 | if (Input.GetKeyDown(skyboxKey) && skyboxChanger) 43 | skyboxChanger.ChangeSkybox(); 44 | 45 | //Weapons 46 | if (Input.GetKeyDown(swapWeapon) && weapons) 47 | { 48 | weapons.SwitchWeaponTwoHand(1); 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /Assets/Scripts/Enemy/Enemy.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class Enemy : MonoBehaviour 6 | { 7 | private Transform player = null; 8 | 9 | [SerializeField] private GameObject prototypePickup = null; 10 | 11 | [SerializeField] private float health = 100; 12 | public float Health => health; 13 | 14 | private void Start() 15 | { 16 | player = GameObject.FindGameObjectWithTag("Player").transform; 17 | 18 | InitializeHitEffect(); 19 | } 20 | 21 | private void Update() 22 | { 23 | transform.LookAt(player); 24 | } 25 | 26 | public void ReceiveDamage(float damage) 27 | { 28 | //So we dont get credit for multiple kills on the same object 29 | if (health <= 0) 30 | return; 31 | 32 | health -= damage; 33 | 34 | DoHitEffect(); 35 | 36 | if (health <= 0) 37 | Die(); 38 | } 39 | 40 | private void Die() 41 | { 42 | prototypePickup.transform.SetParent(null); 43 | prototypePickup.SetActive(true); 44 | 45 | Destroy(gameObject); 46 | } 47 | 48 | #region Stuff for Particles 49 | const float HIT_FX_DUR = .75f; 50 | [SerializeField] private GameObject hitEffectPrefab = null; 51 | private GameObject hitEffect = null; 52 | private ParticleSystem ps = null; 53 | #endregion 54 | #region Helper 55 | private void InitializeHitEffect() 56 | { 57 | hitEffect = Instantiate(hitEffectPrefab, transform.position, transform.rotation); 58 | hitEffect.SetActive(false); 59 | 60 | ps = hitEffect.GetComponentInChildren(); 61 | } 62 | 63 | private void DoHitEffect() 64 | { 65 | StartCoroutine(HitEffect()); 66 | } 67 | 68 | private IEnumerator HitEffect() 69 | { 70 | hitEffect.SetActive(true); 71 | hitEffect.transform.position = transform.position + new Vector3(0, transform.localScale.y / 2, 0); 72 | ps.Play(); 73 | yield return new WaitForSeconds(HIT_FX_DUR); 74 | hitEffect.SetActive(false); 75 | } 76 | #endregion 77 | } 78 | -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 4 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_JobOptions: 23 | serializedVersion: 2 24 | useMultithreading: 0 25 | useConsistencySorting: 0 26 | m_InterpolationPosesPerJob: 100 27 | m_NewContactsPerJob: 30 28 | m_CollideContactsPerJob: 100 29 | m_ClearFlagsPerJob: 200 30 | m_ClearBodyForcesPerJob: 200 31 | m_SyncDiscreteFixturesPerJob: 50 32 | m_SyncContinuousFixturesPerJob: 50 33 | m_FindNearestContactsPerJob: 100 34 | m_UpdateTriggerContactsPerJob: 100 35 | m_IslandSolverCostThreshold: 100 36 | m_IslandSolverBodyCostScale: 1 37 | m_IslandSolverContactCostScale: 10 38 | m_IslandSolverJointCostScale: 10 39 | m_IslandSolverBodiesPerJob: 50 40 | m_IslandSolverContactsPerJob: 50 41 | m_AutoSimulation: 1 42 | m_QueriesHitTriggers: 1 43 | m_QueriesStartInColliders: 1 44 | m_CallbacksOnDisable: 1 45 | m_ReuseCollisionCallbacks: 1 46 | m_AutoSyncTransforms: 0 47 | m_AlwaysShowColliders: 0 48 | m_ShowColliderSleep: 1 49 | m_ShowColliderContacts: 0 50 | m_ShowColliderAABB: 0 51 | m_ContactArrowScale: 0.2 52 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 53 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 54 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 55 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 56 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 57 | -------------------------------------------------------------------------------- /Assets/Scripts/SkillUser.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class SkillUser : MonoBehaviour 6 | { 7 | [SerializeField] private List skills = new List(); 8 | [SerializeField] private int currentLevel = 0; 9 | [SerializeField] private int perks = 0; 10 | [SerializeField] private float xpToNextLevel = 0; 11 | [SerializeField] private float progressTowardNextLevel = 0; 12 | 13 | public List Skills => skills; 14 | public int CurrentLevel => currentLevel; 15 | public float ProgressToNextLevel => progressTowardNextLevel / xpToNextLevel; 16 | 17 | public delegate void OnLevelUp(int level); 18 | public delegate void OnPerkIncrease(int perks); 19 | public delegate void OnChangeXP(float progress); 20 | public delegate void OnPlayerChange(int lvl, int prks, float progress); 21 | 22 | public OnLevelUp onLevelUp; 23 | public OnPerkIncrease onPerkIncrease; 24 | public OnChangeXP onChangeXP; 25 | public OnPlayerChange onPlayerChange; 26 | 27 | private void Start() 28 | { 29 | foreach (Skill s in skills) 30 | { 31 | s.onSkillIncrease += IncreasePerks; 32 | s.onSkillIncrease += delegate { GainExperience(s.CurrentLevel * 30); }; 33 | } 34 | 35 | onPlayerChange?.Invoke(currentLevel, perks, ProgressToNextLevel); 36 | } 37 | 38 | public void GainExperience(float xp) 39 | { 40 | progressTowardNextLevel += xp; 41 | 42 | if (progressTowardNextLevel >= xpToNextLevel) 43 | LevelUp(progressTowardNextLevel - xpToNextLevel); 44 | 45 | onChangeXP?.Invoke(ProgressToNextLevel); 46 | } 47 | 48 | private void LevelUp(float rolloverXP) 49 | { 50 | progressTowardNextLevel = rolloverXP; 51 | 52 | xpToNextLevel += 100 * currentLevel; 53 | 54 | currentLevel++; 55 | 56 | onLevelUp?.Invoke(currentLevel); 57 | } 58 | 59 | private void IncreasePerks(int level) 60 | { 61 | perks++; 62 | onPerkIncrease?.Invoke(perks); 63 | } 64 | 65 | private void OnValidate() 66 | { 67 | onPlayerChange?.Invoke(currentLevel, perks, ProgressToNextLevel); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 13 7 | m_Deferred: 8 | m_Mode: 1 9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} 10 | m_DeferredReflections: 11 | m_Mode: 1 12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 1 15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} 16 | m_LegacyDeferred: 17 | m_Mode: 1 18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} 19 | m_DepthNormals: 20 | m_Mode: 1 21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 22 | m_MotionVectors: 23 | m_Mode: 1 24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LightHalo: 26 | m_Mode: 1 27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 28 | m_LensFlare: 29 | m_Mode: 1 30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 31 | m_AlwaysIncludedShaders: 32 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 33 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 37 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 38 | m_PreloadedShaders: [] 39 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, 40 | type: 0} 41 | m_CustomRenderPipeline: {fileID: 0} 42 | m_TransparencySortMode: 0 43 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 44 | m_DefaultRenderingPath: 1 45 | m_DefaultMobileRenderingPath: 1 46 | m_TierSettings: [] 47 | m_LightmapStripping: 0 48 | m_FogStripping: 0 49 | m_InstancingStripping: 0 50 | m_LightmapKeepPlain: 1 51 | m_LightmapKeepDirCombined: 1 52 | m_LightmapKeepDynamicPlain: 1 53 | m_LightmapKeepDynamicDirCombined: 1 54 | m_LightmapKeepShadowMask: 1 55 | m_LightmapKeepSubtractive: 1 56 | m_FogKeepLinear: 1 57 | m_FogKeepExp: 1 58 | m_FogKeepExp2: 1 59 | m_AlbedoSwatchInfos: [] 60 | m_LightsUseLinearIntensity: 0 61 | m_LightsUseColorTemperature: 0 62 | m_LogWhenShaderIsCompiled: 0 63 | m_AllowEnlightenSupportForUpgradedProject: 0 64 | -------------------------------------------------------------------------------- /Assets/Scripts/FollowCamera.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.EventSystems; 3 | 4 | namespace Cameras 5 | { 6 | public class FollowCamera : MonoBehaviour 7 | { 8 | [SerializeField] private Transform target = null; 9 | [SerializeField] private float horizRotateSpeed = 3.0f; 10 | [SerializeField] private float vertRotateSpeed = 1.0f; 11 | 12 | [Space, Header("Rotation Limits")] 13 | [SerializeField] float maxVertRot = 45f; 14 | [SerializeField, Tooltip("In euler angles (Inspector units) the closest to the floor you want the camera to be. This will automatically be" + 15 | " converted to work with Quaternions.")] 16 | float minVertRot = -38f; 17 | 18 | float minVertRot_Actual = -1f; 19 | float betweenLimits = -1f; 20 | 21 | private void Start() 22 | { 23 | CalculateLimits(); 24 | } 25 | 26 | //In case the limits are changed in Play mode 27 | private void OnValidate() 28 | { 29 | if (Application.isPlaying) 30 | CalculateLimits(); 31 | } 32 | 33 | void Update() 34 | { 35 | transform.position = target.position; 36 | 37 | float mouseMoveY = Input.GetAxis("Mouse Y"); 38 | float mouseMoveX = Input.GetAxis("Mouse X"); 39 | 40 | transform.RotateAround(transform.position, transform.right, mouseMoveY * vertRotateSpeed); 41 | transform.RotateAround(transform.position, Vector3.up, mouseMoveX * horizRotateSpeed); 42 | 43 | float xAngle = transform.rotation.eulerAngles.x; 44 | 45 | if (xAngle < minVertRot_Actual && xAngle > maxVertRot) 46 | { 47 | float dist = Mathf.Abs(xAngle - minVertRot_Actual); 48 | 49 | xAngle = dist < betweenLimits ? minVertRot_Actual : maxVertRot; 50 | } 51 | float y = transform.rotation.eulerAngles.y; 52 | 53 | transform.rotation = Quaternion.Euler(xAngle, y, 0); 54 | } 55 | 56 | private bool PointerWithinBounds() 57 | { 58 | if (EventSystem.current.IsPointerOverGameObject()) //This is annoying as fuck 59 | return false; 60 | 61 | Vector2 pointerPos = Input.mousePosition; 62 | 63 | if (pointerPos.x > Screen.width || pointerPos.x < 0) 64 | return false; 65 | if (pointerPos.y > Screen.height || pointerPos.y < 0) 66 | return false; 67 | 68 | return true; 69 | } 70 | 71 | void CalculateLimits() 72 | { 73 | minVertRot_Actual = minVertRot < 0 ? 360 + minVertRot : 360 - minVertRot; 74 | 75 | betweenLimits = minVertRot_Actual / 2; 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/EnvironmentGenerator.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class EnvironmentGenerator : MonoBehaviour 6 | { 7 | [System.Serializable] 8 | struct EnvironmentalObject 9 | { 10 | [SerializeField] private GameObject prefab; 11 | [SerializeField] private float percent; 12 | 13 | public GameObject Prefab => prefab; 14 | public float PercentOfAll => percent *.01f; 15 | } 16 | 17 | [SerializeField, Tooltip ("The layermask for objects that we don't want to put environment objects on.")] 18 | LayerMask unwantedMask = 1 << 0; 19 | LayerMask groundMask = 1 << 0; 20 | 21 | [SerializeField] private float spawnRadius = 10f; 22 | 23 | [SerializeField] int numObjectsToSpawn = 10; 24 | 25 | [SerializeField] List spawnList = new List(); 26 | 27 | List hashes = new List(); 28 | 29 | void Start() 30 | { 31 | InitializeLayerMasks(); 32 | 33 | SpawnObjects(); 34 | } 35 | 36 | private void InitializeLayerMasks() 37 | { 38 | groundMask = 1 << LayerMask.NameToLayer("Walkable"); 39 | } 40 | 41 | private void SpawnObjects() 42 | { 43 | for (int i = 0; i < spawnList.Count; i++) 44 | { 45 | float numToSpawn = spawnList[i].PercentOfAll * numObjectsToSpawn; 46 | print("Should spawn about " + numToSpawn.ToString() + " objects of type " + spawnList[i].Prefab.name) ; 47 | 48 | for (int j = 0; j < (int) numToSpawn; ++j) 49 | { 50 | Vector3 pos = GetRandomPos(); 51 | 52 | if (OnGroundAndNotOverlapping(pos)) 53 | { 54 | GameObject o = Instantiate(spawnList[i].Prefab, pos, Quaternion.identity, transform); 55 | o.transform.localScale = new Vector3(Random.Range(.5f, 1.2f), Random.Range(.5f, 1.2f), Random.Range(.5f, 1.2f)); 56 | } 57 | } 58 | } 59 | } 60 | 61 | private Vector3 GetRandomPos() 62 | { 63 | float x = transform.position.x + Random.insideUnitSphere.x * spawnRadius; 64 | float z = transform.position.z + Random.insideUnitSphere.z * spawnRadius; 65 | 66 | Vector3 randpos = new Vector3(x, 0, z); 67 | 68 | RaycastHit hit; 69 | if (Physics.Raycast(randpos + new Vector3(0, 50f, 0), Vector3.down, out hit, 100f)) 70 | randpos.y = hit.point.y; 71 | 72 | int hash = randpos.GetHashCode(); 73 | 74 | if (!hashes.Contains(hash)) 75 | hashes.Add(hash); 76 | else 77 | return GetRandomPos(); 78 | 79 | return randpos; 80 | } 81 | 82 | private bool OnGroundAndNotOverlapping(Vector3 pos) 83 | { 84 | if (Physics.CheckSphere(pos, 2.0f, unwantedMask)) 85 | return false; 86 | if (Physics.Raycast(pos + Vector3.up, Vector3.down, 5.0f, groundMask)) 87 | return true; 88 | return false; 89 | } 90 | 91 | #if UNITY_EDITOR 92 | private void OnDrawGizmosSelected() 93 | { 94 | Gizmos.color = Color.blue; 95 | 96 | Gizmos.DrawWireSphere(transform.position, spawnRadius); 97 | } 98 | #endif 99 | } 100 | -------------------------------------------------------------------------------- /Assets/Scripts/Utility/JumpTextController.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using TMPro; 5 | 6 | public class JumpTextController : MonoBehaviour 7 | { 8 | private static JumpTextController instance = null; 9 | public static JumpTextController Instance => instance; 10 | 11 | private void Awake() 12 | { 13 | instance = this; 14 | } 15 | 16 | [SerializeField] private GameObject screenMessage = null; 17 | [SerializeField] private Transform worldCanvas = null; 18 | 19 | [SerializeField] TextMeshProUGUI worldMessageText = null; 20 | [SerializeField] TextMeshProUGUI screenMessageText = null; 21 | 22 | [SerializeField] private Color startColor = Color.red; 23 | [SerializeField] private Color endColor = new Color(Color.white.r, Color.white.g, Color.white.b, 0); 24 | 25 | [SerializeField] private float animateTime = 2.0f; 26 | [SerializeField] private float speed = 5.0f; 27 | 28 | private void Start() 29 | { 30 | screenMessage.SetActive(false); 31 | } 32 | 33 | public static void PlayScreenMessage(string msg) 34 | { 35 | if (instance) 36 | instance.DoMsg(msg); 37 | } 38 | 39 | public static void PlayWorldJumpMessageAt(string msg, Vector3 pos) 40 | { 41 | if (instance) 42 | instance.DoJumpMsgAt(msg, pos); 43 | } 44 | 45 | private void DoMsg(string msg) 46 | { 47 | screenMessageText.text = msg; 48 | 49 | StartCoroutine(DoScreenMessage()); 50 | } 51 | 52 | private void DoJumpMsgAt (string msg, Vector3 pos) 53 | { 54 | worldCanvas.Rotate(Vector3.up, 55 | Quaternion.Angle( 56 | Camera.main.transform.rotation, 57 | transform.rotation)); 58 | 59 | worldMessageText.text = msg; 60 | worldCanvas.position = pos + new Vector3(0, 1, 0); 61 | 62 | StartCoroutine(DoWorldMessage()); 63 | } 64 | 65 | private IEnumerator DoWorldMessage() 66 | { 67 | worldMessageText.gameObject.SetActive(true); 68 | 69 | 70 | float countdown = animateTime; 71 | while (countdown > 0) 72 | { 73 | worldCanvas.Translate(Vector3.up * speed * Time.deltaTime); 74 | countdown -= Time.deltaTime; 75 | yield return new WaitForSeconds(Time.deltaTime); 76 | } 77 | worldMessageText.gameObject.SetActive(false); 78 | } 79 | 80 | private IEnumerator DoScreenMessage() 81 | { 82 | screenMessage.SetActive(true); 83 | 84 | screenMessageText.color = startColor; 85 | 86 | //Show message at full alpha for this time 87 | yield return new WaitForSeconds(animateTime); 88 | 89 | float DEC_ALPHA = .5f; //time over which alpha will be dec 90 | float countdown = DEC_ALPHA; 91 | while (countdown > 0) 92 | { 93 | screenMessageText.color = 94 | new Color(screenMessageText.color.r, 95 | screenMessageText.color.g, 96 | screenMessageText.color.b, 97 | screenMessageText.color.a - Time.deltaTime/DEC_ALPHA); 98 | 99 | countdown -= Time.deltaTime; 100 | yield return null; 101 | } 102 | screenMessage.SetActive(false); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /Assets/Scripts/CombatControl.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using RPGCharacterAnimsFREE; 5 | 6 | public class CombatControl : MonoBehaviour 7 | { 8 | private RPGCharacterControllerFREE controller = null; 9 | 10 | [SerializeField] 11 | private SkillUser player = null; 12 | 13 | private Vector3 heightOffset = new Vector3(0, 1, 0); 14 | private LayerMask enemyLayermask = 1 << 10; 15 | 16 | [Header("Attributes")] 17 | [SerializeField] 18 | private float attackDistance = 3.0f; 19 | 20 | [SerializeField] 21 | private AttackList attackList = null; 22 | 23 | public delegate void OnUseAttack(AttackType typeOfAttack); 24 | public OnUseAttack onUseAttack; 25 | 26 | private void Start() 27 | { 28 | controller = GetComponentInParent(); 29 | 30 | heightOffset = new Vector3(0, transform.localScale.y / 2, 0); 31 | 32 | if (LayerMask.NameToLayer("Enemy") > -1 && //If enemy layer exists 33 | enemyLayermask != 1 << LayerMask.NameToLayer("Enemy")) //but our enemymask isn't setup 34 | enemyLayermask = 1 << LayerMask.NameToLayer("Enemy"); 35 | 36 | attackList.InitializeAttacks(); 37 | } 38 | 39 | public void LookForTarget() 40 | { 41 | GameObject targetObj = FindClosestEnemy(); 42 | 43 | 44 | //If the controller doesnt have a target but theres an enemy nearby 45 | //OR 46 | //The controller has a target but there ISN'T an enemy nearby 47 | if (targetObj != null 48 | || 49 | controller.HasTarget && targetObj == null) 50 | { 51 | controller.SetTarget(targetObj); 52 | } 53 | } 54 | 55 | private GameObject FindClosestEnemy() 56 | { 57 | Collider[] cols = Physics.OverlapSphere(transform.position, attackDistance, enemyLayermask); 58 | 59 | if (cols.Length == 0) 60 | return null; 61 | 62 | GameObject closestEnemyObj = null; 63 | 64 | float close = Mathf.Infinity; 65 | 66 | for (int i = 0; i < cols.Length; i++) 67 | { 68 | float dist = Vector3.Distance(transform.position, cols[i].transform.position); 69 | if (dist < close) 70 | { 71 | close = dist; 72 | closestEnemyObj = cols[i].gameObject; 73 | } 74 | } 75 | return closestEnemyObj; 76 | } 77 | 78 | //This is called from Animation Events 79 | public void Hit(Object attack) 80 | { 81 | Ray ray = new Ray(transform.position + heightOffset, transform.forward); 82 | RaycastHit hit; 83 | 84 | AttackType a = attack as AttackType; 85 | 86 | if (Physics.Raycast(ray, out hit, attackDistance, enemyLayermask)) 87 | { 88 | Enemy e; 89 | if (hit.collider.TryGetComponent(out e)) 90 | { 91 | e.ReceiveDamage(a.GetDamage); 92 | 93 | float xp = e.Health > 0 ? a.GetXPForAttack : a.GetXPForKill; 94 | 95 | a.GetGoverningSkill.IncreaseSkill(xp); 96 | } 97 | } 98 | 99 | onUseAttack?.Invoke(a); 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /Assets/Scripts/Skills System/SkillsSelectionControl.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using UnityEngine.UI; 5 | public class SkillsSelectionControl : MonoBehaviour 6 | { 7 | [SerializeField] ScrollRect scrollRect = null; 8 | [SerializeField] Transform cameraTransform = null; 9 | [SerializeField] GameObject skillsPanel = null; 10 | 11 | Button[] buttons = null; 12 | 13 | private enum Direction { Left, Right } 14 | 15 | private int currentSelection = 0; 16 | [SerializeField] private float scrollSpeed = 5f; 17 | [SerializeField] private float timeBetweenSelections = .25f; 18 | private float cooldown = 0; 19 | 20 | public bool SkillPanelOpen => skillsPanel.activeSelf; 21 | 22 | public void InitializeSkillInput(GameObject [] skillObjects) 23 | { 24 | 25 | buttons = new Button[skillObjects.Length]; 26 | 27 | int i = 0; 28 | foreach (GameObject o in skillObjects) 29 | { 30 | buttons[i] = o.GetComponent