├── .gitmodules ├── _config.yml ├── ImpossibleOddsLogo.png ├── ProjectSettings ├── ProjectVersion.txt ├── ClusterInputManager.asset ├── PresetManager.asset ├── NetworkManager.asset ├── XRSettings.asset ├── Packages │ ├── com.unity.polybrush │ │ └── Settings.json │ ├── com.unity.settings-manager │ │ └── Settings.json │ └── com.unity.probuilder │ │ └── Settings.json ├── VersionControlSettings.asset ├── TimeManager.asset ├── VFXManager.asset ├── AudioManager.asset ├── TimelineSettings.asset ├── EditorBuildSettings.asset ├── TagManager.asset ├── UnityConnectSettings.asset ├── PackageManagerSettings.asset ├── EditorSettings.asset ├── DynamicsManager.asset ├── Physics2DSettings.asset ├── NavMeshAreas.asset ├── QualitySettings.asset ├── GraphicsSettings.asset ├── InputManager.asset └── ProjectSettings.asset ├── Docs └── Images │ ├── BoxBounds.png │ ├── QuickSetup.png │ ├── InputProvider.png │ ├── Settings_Full.png │ ├── TacticalCameraComponent.png │ └── Settings_WorldInteraction.png ├── Assets ├── AssetStoreTools │ ├── Editor │ │ ├── AssetStoreTools.dll │ │ └── AssetStoreTools.dll.meta │ ├── AS_Checklist.asset.meta │ ├── Editor.meta │ └── AS_Checklist.asset ├── Impossible Odds │ ├── TacticalCamera │ │ ├── Runtime │ │ │ ├── AssemblyInfo.cs │ │ │ ├── Abstract.meta │ │ │ ├── Utility.meta │ │ │ ├── Interfaces.meta │ │ │ ├── ImpossibleOdds.TacticalCamera.asmdef.meta │ │ │ ├── AssemblyInfo.cs.meta │ │ │ ├── TacticalCamera.cs.meta │ │ │ ├── Utility │ │ │ │ ├── FadeState.cs.meta │ │ │ │ ├── ValueRange.cs.meta │ │ │ │ ├── FadeState.cs │ │ │ │ └── ValueRange.cs │ │ │ ├── TacticalCameraBoxBounds.cs.meta │ │ │ ├── TacticalCameraSettings.cs.meta │ │ │ ├── TacticalCameraCompositeBounds.cs.meta │ │ │ ├── TacticalCameraInputProvider.cs.meta │ │ │ ├── Interfaces │ │ │ │ ├── ITacticalCameraBounds.cs.meta │ │ │ │ ├── ITacticalCameraSettings.cs.meta │ │ │ │ ├── ITacticalCameraInputProvider.cs.meta │ │ │ │ ├── ITacticalCameraBounds.cs │ │ │ │ ├── ITacticalCameraInputProvider.cs │ │ │ │ └── ITacticalCameraSettings.cs │ │ │ ├── Abstract │ │ │ │ ├── AbstractTacticalCameraBounds.cs.meta │ │ │ │ ├── AbstractTacticalCameraInputProvider.cs.meta │ │ │ │ ├── AbstractTacticalCameraBounds.cs │ │ │ │ └── AbstractTacticalCameraInputProvider.cs │ │ │ ├── ImpossibleOdds.TacticalCamera.asmdef │ │ │ ├── TacticalCameraBoxBounds.cs │ │ │ ├── TacticalCameraCompositeBounds.cs │ │ │ ├── TacticalCameraInputProvider.cs │ │ │ ├── TacticalCameraSettings.cs │ │ │ └── TacticalCamera.cs │ │ ├── Documentation.pdf │ │ ├── Documentation.pdf.meta │ │ ├── package.json.meta │ │ ├── Editor.meta │ │ ├── Runtime.meta │ │ ├── Editor │ │ │ ├── ImpossibleOdds.TacticalCamera.Editor.asmdef.meta │ │ │ ├── TacticalCameraEditor.cs.meta │ │ │ ├── TacticalCameraSettingsEditor.cs.meta │ │ │ ├── ImpossibleOdds.TacticalCamera.Editor.asmdef │ │ │ ├── TacticalCameraEditor.cs │ │ │ └── TacticalCameraSettingsEditor.cs │ │ └── package.json │ └── TacticalCamera.meta ├── Demo.meta ├── Editor.meta ├── Impossible Odds.meta ├── AssetStoreTools.meta └── Editor │ ├── ExportPackage.cs.meta │ └── ExportPackage.cs ├── UserSettings └── EditorUserSettings.asset ├── LICENSE.md ├── .gitignore ├── Packages ├── manifest.json └── packages-lock.json └── README.md /.gitmodules: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /ImpossibleOddsLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juniordiscart/ImpossibleOdds-TacticalCamera/HEAD/ImpossibleOddsLogo.png -------------------------------------------------------------------------------- /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2020.3.48f1 2 | m_EditorVersionWithRevision: 2020.3.48f1 (b805b124c6b7) 3 | -------------------------------------------------------------------------------- /Docs/Images/BoxBounds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juniordiscart/ImpossibleOdds-TacticalCamera/HEAD/Docs/Images/BoxBounds.png -------------------------------------------------------------------------------- /Docs/Images/QuickSetup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juniordiscart/ImpossibleOdds-TacticalCamera/HEAD/Docs/Images/QuickSetup.png -------------------------------------------------------------------------------- /Docs/Images/InputProvider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juniordiscart/ImpossibleOdds-TacticalCamera/HEAD/Docs/Images/InputProvider.png -------------------------------------------------------------------------------- /Docs/Images/Settings_Full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juniordiscart/ImpossibleOdds-TacticalCamera/HEAD/Docs/Images/Settings_Full.png -------------------------------------------------------------------------------- /Docs/Images/TacticalCameraComponent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juniordiscart/ImpossibleOdds-TacticalCamera/HEAD/Docs/Images/TacticalCameraComponent.png -------------------------------------------------------------------------------- /Docs/Images/Settings_WorldInteraction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juniordiscart/ImpossibleOdds-TacticalCamera/HEAD/Docs/Images/Settings_WorldInteraction.png -------------------------------------------------------------------------------- /Assets/AssetStoreTools/Editor/AssetStoreTools.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juniordiscart/ImpossibleOdds-TacticalCamera/HEAD/Assets/AssetStoreTools/Editor/AssetStoreTools.dll -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.CompilerServices; 2 | 3 | [assembly: InternalsVisibleTo("ImpossibleOdds.TacticalCamera.Editor")] -------------------------------------------------------------------------------- /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 | m_DefaultList: [] 7 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Documentation.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juniordiscart/ImpossibleOdds-TacticalCamera/HEAD/Assets/Impossible Odds/TacticalCamera/Documentation.pdf -------------------------------------------------------------------------------- /Assets/Demo.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9d70a8440497b495693552eb55f60db9 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 55144478351554fe980590b69e2c4853 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /ProjectSettings/NetworkManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!149 &1 4 | NetworkManager: 5 | m_ObjectHideFlags: 0 6 | m_DebugLevel: 0 7 | m_Sendrate: 15 8 | m_AssetToPrefab: {} 9 | -------------------------------------------------------------------------------- /Assets/Impossible Odds.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4fece65d1fa784fcba32598daea14e54 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/Impossible Odds/TacticalCamera/Documentation.pdf.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e1d23a041b6b141619863caca9ddefdc 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/package.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6667ed0a643fe4a8d8b23a0042b84c01 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bf314557d1b074b3491b92ee1b612289 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /ProjectSettings/Packages/com.unity.polybrush/Settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "m_Name": "Settings", 3 | "m_Path": "ProjectSettings/Packages/com.unity.polybrush/Settings.json", 4 | "m_Dictionary": { 5 | "m_DictionaryValues": [] 6 | } 7 | } -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c65884fff00514909af164ac82fecde4 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4767f68064f0646f9b71df82b6d30c72 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/AssetStoreTools/AS_Checklist.asset.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 31165b8ee787b453fa95cab79fd12867 3 | NativeFormatImporter: 4 | externalObjects: {} 5 | mainObjectFileID: 0 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Abstract.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 26e4e809ef49b4e82ace2fe754345d3d 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Utility.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 392cff9231b18470eb9fcbe6b039e610 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /ProjectSettings/Packages/com.unity.settings-manager/Settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "m_Name": "Settings", 3 | "m_Path": "ProjectSettings/Packages/com.unity.settings-manager/Settings.json", 4 | "m_Dictionary": { 5 | "m_DictionaryValues": [] 6 | } 7 | } -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Interfaces.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0b955b187f7c242d484a358cdd5a0a4b 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /ProjectSettings/VersionControlSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!890905787 &1 4 | VersionControlSettings: 5 | m_ObjectHideFlags: 0 6 | m_Mode: Visible Meta Files 7 | m_CollabEditorSettings: 8 | inProgressEnabled: 1 9 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/ImpossibleOdds.TacticalCamera.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 15b92d0751b8542bdb12980d009b9a9f 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Editor/ImpossibleOdds.TacticalCamera.Editor.asmdef.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b2c6c1c65a3f746138db9b110679e2a0 3 | AssemblyDefinitionImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/AssetStoreTools.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8466fccc5fcd4d74ea48c2a9411d446d 3 | folderAsset: yes 4 | timeCreated: 1588842340 5 | licenseType: Store 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /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/AssetStoreTools/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cf7638d43c18cec40b4b9312969b5378 3 | folderAsset: yes 4 | timeCreated: 1588842340 5 | licenseType: Store 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/Editor/ExportPackage.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 76c8b85c7254c4e44b15c89db8f45dcd 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /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_RenderPipeSettingsPath: 10 | m_FixedTimeStep: 0.016666668 11 | m_MaxDeltaTime: 0.05 12 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/AssemblyInfo.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f680ac57709724f58bd06dc6b3943f0d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 09888d7d5ba3c4de085cd6ab9a3ac3de, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/TacticalCamera.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3d0b8ffd99eca4909853754cdfa65cfd 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 09888d7d5ba3c4de085cd6ab9a3ac3de, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Editor/TacticalCameraEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a79b1673b33f743d39b45ef74f9253f1 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 09888d7d5ba3c4de085cd6ab9a3ac3de, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Utility/FadeState.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 747473cad38da47648af2e8ae17d0026 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 09888d7d5ba3c4de085cd6ab9a3ac3de, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Utility/ValueRange.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 43a071d717bfc42aba884069fd158f9c 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 09888d7d5ba3c4de085cd6ab9a3ac3de, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/TacticalCameraBoxBounds.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fd3d63965e07145fa979fa7537006f0d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 09888d7d5ba3c4de085cd6ab9a3ac3de, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/TacticalCameraSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c2caccaf302094be6b84c6e5ad8bb969 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 09888d7d5ba3c4de085cd6ab9a3ac3de, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Editor/TacticalCameraSettingsEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9900fd1f6da774fc084d1a9cbbda61d7 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 09888d7d5ba3c4de085cd6ab9a3ac3de, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/TacticalCameraCompositeBounds.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 201bd9c28c82d49f6b5be86fb11d418b 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 09888d7d5ba3c4de085cd6ab9a3ac3de, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/TacticalCameraInputProvider.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b09c6bb0aea2d4ea4b371d362462b542 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 09888d7d5ba3c4de085cd6ab9a3ac3de, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Interfaces/ITacticalCameraBounds.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cb7257e2a4424449bb629ffec32f6764 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 09888d7d5ba3c4de085cd6ab9a3ac3de, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Interfaces/ITacticalCameraSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b2ad98448957441aab1ccac033079aa9 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 09888d7d5ba3c4de085cd6ab9a3ac3de, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Abstract/AbstractTacticalCameraBounds.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: be14586ffef8c461f946c4a9d01e118f 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 09888d7d5ba3c4de085cd6ab9a3ac3de, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Interfaces/ITacticalCameraInputProvider.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e38232f46d85940dc9e7eef1517ece6a 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 09888d7d5ba3c4de085cd6ab9a3ac3de, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Abstract/AbstractTacticalCameraInputProvider.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8dbac1349e39b47f2a080e2526a62d81 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {fileID: 2800000, guid: 09888d7d5ba3c4de085cd6ab9a3ac3de, type: 3} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /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 | m_Volume: 0.5 7 | Rolloff Scale: 1 8 | Doppler Factor: 1 9 | Default Speaker Mode: 2 10 | m_SampleRate: 0 11 | m_DSPBufferSize: 1024 12 | m_VirtualVoiceCount: 512 13 | m_RealVoiceCount: 64 14 | m_SpatializerPlugin: Resonance Audio 15 | m_AmbisonicDecoderPlugin: 16 | m_DisableAudio: 0 17 | m_VirtualizeEffects: 1 18 | -------------------------------------------------------------------------------- /ProjectSettings/TimelineSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &1 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 61 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: a287be6c49135cd4f9b2b8666c39d999, type: 3} 13 | m_Name: 14 | m_EditorClassIdentifier: 15 | assetDefaultFramerate: 60 16 | -------------------------------------------------------------------------------- /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 | - enabled: 1 9 | path: Assets/Demo/TacticalCameraDemo.unity 10 | guid: 12dd7bb27c47ea1458c8d4ecd98af2cc 11 | - enabled: 1 12 | path: 13 | guid: ae827b0911ccdd146ac15e245084bd91 14 | - enabled: 1 15 | path: Assets/test.unity 16 | guid: f80120f566ee76c439ac27443e8f9095 17 | m_configObjects: {} 18 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Abstract/AbstractTacticalCameraBounds.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace ImpossibleOdds.TacticalCamera 4 | { 5 | public abstract class AbstractTacticalCameraBounds : MonoBehaviour, ITacticalCameraBounds 6 | { 7 | /// 8 | public abstract void Apply(TacticalCamera tCamera); 9 | 10 | /// 11 | public abstract Vector3 Apply(Vector3 position); 12 | 13 | /// 14 | public abstract bool IsWithinBounds(Vector3 position); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/ImpossibleOdds.TacticalCamera.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ImpossibleOdds.TacticalCamera", 3 | "rootNamespace": "", 4 | "references": [ 5 | "ImpossibleOdds.DependencyInjection", 6 | "ImpossibleOdds.Core" 7 | ], 8 | "includePlatforms": [], 9 | "excludePlatforms": [], 10 | "allowUnsafeCode": false, 11 | "overrideReferences": false, 12 | "precompiledReferences": [], 13 | "autoReferenced": true, 14 | "defineConstraints": [], 15 | "versionDefines": [], 16 | "noEngineReferences": false 17 | } -------------------------------------------------------------------------------- /UserSettings/EditorUserSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!162 &1 4 | EditorUserSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 4 7 | m_ConfigSettings: 8 | vcSharedLogLevel: 9 | value: 0d5e400f0650 10 | flags: 0 11 | m_VCAutomaticAdd: 1 12 | m_VCDebugCom: 0 13 | m_VCDebugCmd: 0 14 | m_VCDebugOut: 0 15 | m_SemanticMergeMode: 2 16 | m_VCShowFailedCheckout: 1 17 | m_VCOverwriteFailedCheckoutAssets: 1 18 | m_VCProjectOverlayIcons: 1 19 | m_VCHierarchyOverlayIcons: 1 20 | m_VCOtherOverlayIcons: 1 21 | m_VCAllowAsyncUpdate: 1 22 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Editor/ImpossibleOdds.TacticalCamera.Editor.asmdef: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ImpossibleOdds.TacticalCamera.Editor", 3 | "rootNamespace": "", 4 | "references": [ 5 | "ImpossibleOdds.Core", 6 | "ImpossibleOdds.TacticalCamera" 7 | ], 8 | "includePlatforms": [ 9 | "Editor" 10 | ], 11 | "excludePlatforms": [], 12 | "allowUnsafeCode": false, 13 | "overrideReferences": false, 14 | "precompiledReferences": [], 15 | "autoReferenced": true, 16 | "defineConstraints": [], 17 | "versionDefines": [], 18 | "noEngineReferences": false 19 | } -------------------------------------------------------------------------------- /Assets/AssetStoreTools/Editor/AssetStoreTools.dll.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e6c40bf0eb3fa3645aab7189973412db 3 | timeCreated: 1588842344 4 | licenseType: Store 5 | PluginImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | iconMap: {} 9 | executionOrder: {} 10 | isPreloaded: 0 11 | isOverridable: 0 12 | platformData: 13 | - first: 14 | Any: 15 | second: 16 | enabled: 0 17 | settings: {} 18 | - first: 19 | Editor: Editor 20 | second: 21 | enabled: 1 22 | settings: 23 | DefaultValueInitialized: true 24 | - first: 25 | Windows Store Apps: WindowsStoreApps 26 | second: 27 | enabled: 0 28 | settings: 29 | CPU: AnyCPU 30 | userData: 31 | assetBundleName: 32 | assetBundleVariant: 33 | -------------------------------------------------------------------------------- /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 | - FlythroughCam 8 | layers: 9 | - Default 10 | - TransparentFX 11 | - Ignore Raycast 12 | - 13 | - Water 14 | - UI 15 | - 16 | - 17 | - Skybox 18 | - Player 19 | - PostProcessing 20 | - SetDressing 21 | - 22 | - 23 | - Vehicles 24 | - Navmesh 25 | - Environment 26 | - Characters 27 | - Vegetation 28 | - Effects 29 | - Ragdoll 30 | - WaterGeometry 31 | - Terrain 32 | - Enemy 33 | - Cameras 34 | - Props 35 | - Avoid 36 | - CameraCollider 37 | - Collider 38 | - Checkpoint 39 | - DoNotDraw 40 | - Level 41 | m_SortingLayers: 42 | - name: Default 43 | uniqueID: 0 44 | locked: 0 45 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "com.impossibleodds.tacticalcamera", 3 | "version": "2.3.0", 4 | "displayName": "Impossible Odds - Tactical Camera", 5 | "unity": "2020.3", 6 | "documentationUrl": "https://github.com/juniordiscart/ImpossibleOdds-TacticalCamera/blob/master/README.md", 7 | "licensesUrl": "https://github.com/juniordiscart/ImpossibleOdds-TacticalCamera/blob/master/LICENSE.md", 8 | "description": "The Impossible Odds Tactical Camera package provides a plugin camera system for smoothly navigating your environments in both a top-down tactical view as well as up-close action scenes.", 9 | "keywords": [ 10 | "csharp", 11 | "unity", 12 | "unity3d", 13 | "game-development", 14 | "camera", 15 | "plugin" 16 | ], 17 | "author": { 18 | "name": "Jan Discart", 19 | "email": "jan.discart@impossible-odds.net", 20 | "url": "https://www.impossible-odds.net" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /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 | m_Enabled: 0 7 | m_TestMode: 0 8 | m_TestEventUrl: 9 | m_TestConfigUrl: 10 | m_TestInitMode: 0 11 | CrashReportingSettings: 12 | m_EventUrl: https://perf-events.cloud.unity3d.com/api/events/crashes 13 | m_Enabled: 0 14 | m_CaptureEditorExceptions: 1 15 | UnityPurchasingSettings: 16 | m_Enabled: 0 17 | m_TestMode: 0 18 | UnityAnalyticsSettings: 19 | m_Enabled: 1 20 | m_InitializeOnStartup: 1 21 | m_TestMode: 0 22 | m_TestEventUrl: 23 | m_TestConfigUrl: 24 | UnityAdsSettings: 25 | m_Enabled: 0 26 | m_InitializeOnStartup: 1 27 | m_TestMode: 0 28 | m_EnabledPlatforms: 4294967295 29 | m_IosGameId: 30 | m_AndroidGameId: 31 | PerformanceReportingSettings: 32 | m_Enabled: 0 33 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Abstract/AbstractTacticalCameraInputProvider.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace ImpossibleOdds.TacticalCamera 4 | { 5 | public abstract class AbstractTacticalCameraInputProvider : MonoBehaviour, ITacticalCameraInputProvider 6 | { 7 | /// 8 | public abstract bool MoveToTarget { get; } 9 | /// 10 | public abstract bool CancelMoveToTarget { get; } 11 | /// 12 | public abstract bool OrbitAroundTarget { get; } 13 | /// 14 | public abstract float MoveForward { get; } 15 | /// 16 | public abstract float MoveSideways { get; } 17 | /// 18 | public abstract float MoveUp { get; } 19 | /// 20 | public abstract float TiltDelta { get; } 21 | /// 22 | public abstract float RotationDelta { get; } 23 | /// 24 | public virtual Vector2 MousePosition => Input.mousePosition; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Jan Discart 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 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Interfaces/ITacticalCameraBounds.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | namespace ImpossibleOdds.TacticalCamera 3 | { 4 | /// 5 | /// Interface to restrict the camera's position. 6 | /// 7 | public interface ITacticalCameraBounds 8 | { 9 | /// 10 | /// Apply the bounds to the camera. 11 | /// 12 | /// The camera unto which the bounds should be applied. 13 | void Apply(TacticalCamera tCamera); 14 | 15 | /// 16 | /// Checks whether the provided position is within the bounds. If not, the position is moved to the closest valid location within. 17 | /// 18 | /// The position that will be checked by the bounds. 19 | /// A valid position within the bounds. 20 | Vector3 Apply(Vector3 position); 21 | 22 | /// 23 | /// Checks whether the provided position is within bounds. 24 | /// 25 | /// The position to check for. 26 | /// True if the provided position is within bounds, false otherwise. 27 | bool IsWithinBounds(Vector3 position); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /ProjectSettings/PackageManagerSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &1 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 61 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: 13964, guid: 0000000000000000e000000000000000, type: 0} 13 | m_Name: 14 | m_EditorClassIdentifier: 15 | m_EnablePreviewPackages: 0 16 | m_EnablePackageDependencies: 0 17 | m_AdvancedSettingsExpanded: 1 18 | m_ScopedRegistriesSettingsExpanded: 1 19 | oneTimeWarningShown: 0 20 | m_Registries: 21 | - m_Id: main 22 | m_Name: 23 | m_Url: https://packages.unity.com 24 | m_Scopes: [] 25 | m_IsDefault: 1 26 | m_Capabilities: 7 27 | m_ConfigSource: 0 28 | m_UserSelectedRegistryName: 29 | m_UserAddingNewScopedRegistry: 0 30 | m_RegistryInfoDraft: 31 | m_ErrorMessage: 32 | m_Original: 33 | m_Id: 34 | m_Name: 35 | m_Url: 36 | m_Scopes: [] 37 | m_IsDefault: 0 38 | m_Capabilities: 0 39 | m_ConfigSource: 0 40 | m_Modified: 0 41 | m_Name: 42 | m_Url: 43 | m_Scopes: 44 | - 45 | m_SelectedScopeIndex: 0 46 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Editor/TacticalCameraEditor.cs: -------------------------------------------------------------------------------- 1 | using UnityEditor; 2 | using UnityEngine; 3 | 4 | namespace ImpossibleOdds.TacticalCamera.Editor 5 | { 6 | [CustomEditor(typeof(TacticalCamera))] 7 | public class TacticalCameraEditor : UnityEditor.Editor 8 | { 9 | public override void OnInspectorGUI() 10 | { 11 | if (EditorApplication.isPlaying) 12 | { 13 | EditorGUILayout.HelpBox("The values below are only applied during Awake. Assigning new values will not be applied.", MessageType.Info); 14 | EditorGUILayout.Space(20f); 15 | } 16 | 17 | SerializedObject tacticalCamera = new SerializedObject(target); 18 | 19 | EditorGUILayout.PropertyField(tacticalCamera.FindProperty(nameof(TacticalCamera.initialSettings)), new GUIContent("Settings")); 20 | EditorGUILayout.PropertyField(tacticalCamera.FindProperty(nameof(TacticalCamera.initialInputProvider)), new GUIContent("Input provider")); 21 | EditorGUILayout.PropertyField(tacticalCamera.FindProperty(nameof(TacticalCamera.initialCameraBounds)), new GUIContent("Operational bounds (optional)")); 22 | 23 | tacticalCamera.ApplyModifiedProperties(); 24 | } 25 | } 26 | } 27 | 28 | -------------------------------------------------------------------------------- /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: 1 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: 0 16 | m_EtcTextureFastCompressor: 2 17 | m_EtcTextureNormalCompressor: 2 18 | m_EtcTextureBestCompressor: 5 19 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;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: 1 30 | m_AssetPipelineMode: 1 31 | m_CacheServerMode: 0 32 | m_CacheServerEndpoint: 33 | m_CacheServerNamespacePrefix: default 34 | m_CacheServerEnableDownload: 1 35 | m_CacheServerEnableUpload: 1 36 | -------------------------------------------------------------------------------- /.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 | # Never ignore Asset meta data 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 | # TextMesh Pro files 20 | [Aa]ssets/TextMesh*Pro/ 21 | 22 | # Autogenerated Jetbrains Rider plugin 23 | [Aa]ssets/Plugins/Editor/JetBrains* 24 | 25 | # Visual Studio cache directory 26 | .vs/ 27 | .vscode/ 28 | 29 | # Gradle cache directory 30 | .gradle/ 31 | 32 | # Autogenerated VS/MD/Consulo solution and project files 33 | ExportedObj/ 34 | .consulo/ 35 | *.csproj 36 | *.unityproj 37 | *.sln 38 | *.suo 39 | *.tmp 40 | *.user 41 | *.userprefs 42 | *.pidb 43 | *.booproj 44 | *.svd 45 | *.pdb 46 | *.mdb 47 | *.opendb 48 | *.VC.db 49 | 50 | # Unity3D generated meta files 51 | *.pidb.meta 52 | *.pdb.meta 53 | *.mdb.meta 54 | 55 | # Unity3D generated file on crash reports 56 | sysinfo.txt 57 | 58 | # Builds 59 | *.apk 60 | *.unitypackage 61 | 62 | # Crashlytics generated file 63 | crashlytics-build.properties 64 | Assets/Demo/* 65 | *.DS_Store 66 | .idea/* 67 | -------------------------------------------------------------------------------- /Assets/Editor/ExportPackage.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using UnityEngine; 3 | using UnityEditor; 4 | using UnityEditor.PackageManager.UI; 5 | 6 | public static class ExportPackage 7 | { 8 | private const string ExportPackageDirectoryKey = "ImpossibleOdds_Export_Path"; 9 | private const string ExportPackageNameKey = "ImpossibleOdds_Export_TacticalCamera_Filename"; 10 | 11 | private const string PackageExtension = "unitypackage"; 12 | 13 | [MenuItem("Assets/Impossible Odds/Export Tactical Camera")] 14 | private static void ExportToolkit() 15 | { 16 | string path = EditorPrefs.GetString(ExportPackageDirectoryKey, Application.dataPath); 17 | string name = EditorPrefs.GetString(ExportPackageNameKey, "Impossible Odds Tactical Camera"); 18 | string fullPath = EditorUtility.SaveFilePanel("Export Impossible Odds Tactical Camera", path, name, PackageExtension); 19 | 20 | if (string.IsNullOrEmpty(fullPath)) 21 | { 22 | return; 23 | } 24 | 25 | FileInfo fileInfo = new FileInfo(fullPath); 26 | path = fileInfo.DirectoryName; 27 | name = Path.GetFileNameWithoutExtension(fileInfo.Name); 28 | EditorPrefs.SetString(ExportPackageDirectoryKey, path); 29 | EditorPrefs.SetString(ExportPackageNameKey, name); 30 | 31 | AssetDatabase.ExportPackage(new[]{ "Assets/Impossible Odds" , "Packages/com.impossibleodds.toolkit"}, fullPath, ExportPackageOptions.Recurse); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /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: 13 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: c9004010c8000010c8000010ffffffffc8020010c8000010ffffffffffffffffc8000010d84067b1c8000010c8000010c8000010c8000010c8029211c8000010c8029a11c842d791c8029211c8000900c840c790c8020010c9029291c840d791c842c798c8000010c8000010c8000011fffff7ffc8020010c8000010c802d211 21 | m_AutoSimulation: 1 22 | m_AutoSyncTransforms: 1 23 | m_ReuseCollisionCallbacks: 0 24 | m_ClothInterCollisionSettingsToggle: 0 25 | m_ClothGravity: {x: 0, y: -9.81, z: 0} 26 | m_ContactPairsMode: 0 27 | m_BroadphaseType: 0 28 | m_WorldBounds: 29 | m_Center: {x: 0, y: 0, z: 0} 30 | m_Extent: {x: 250, y: 250, z: 250} 31 | m_WorldSubdivisions: 8 32 | m_FrictionType: 0 33 | m_EnableEnhancedDeterminism: 0 34 | m_EnableUnifiedHeightmaps: 1 35 | m_SolverType: 0 36 | m_DefaultMaxAngularSpeed: 7 37 | -------------------------------------------------------------------------------- /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: 3 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_AutoSimulation: 1 23 | m_QueriesHitTriggers: 1 24 | m_QueriesStartInColliders: 1 25 | m_ChangeStopsCallbacks: 0 26 | m_CallbacksOnDisable: 1 27 | m_AutoSyncTransforms: 1 28 | m_AlwaysShowColliders: 0 29 | m_ShowColliderSleep: 1 30 | m_ShowColliderContacts: 0 31 | m_ShowColliderAABB: 0 32 | m_ContactArrowScale: 0.2 33 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 34 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 35 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 36 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 37 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 38 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Utility/FadeState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | 4 | namespace ImpossibleOdds.TacticalCamera 5 | { 6 | /// 7 | /// Class to keep track of the current fade state of a value. It is controlled by time and a curve. 8 | /// 9 | public class FadeState 10 | { 11 | private float fadeTime; 12 | private float fadeValue; 13 | 14 | public float Time 15 | { 16 | get; 17 | set; 18 | } 19 | 20 | public float Value 21 | { 22 | get 23 | { 24 | float t = Mathf.InverseLerp(fadeTime, 0f, Time); 25 | return FadeEvaluation(t) * fadeValue; 26 | } 27 | } 28 | 29 | public float FadeTime 30 | { 31 | get => fadeTime; 32 | set 33 | { 34 | if (value <= 0f) 35 | { 36 | throw new ArgumentOutOfRangeException(nameof (value),"The fade time should be a value larger than 0."); 37 | } 38 | 39 | fadeTime = value; 40 | } 41 | } 42 | 43 | public float FadeValue 44 | { 45 | get => fadeValue; 46 | set 47 | { 48 | fadeValue = value; 49 | Time = fadeTime; 50 | } 51 | } 52 | 53 | public Func FadeEvaluation 54 | { 55 | get; 56 | set; 57 | } 58 | 59 | public Func DeltaTime 60 | { 61 | get; 62 | set; 63 | } = () => UnityEngine.Time.deltaTime; 64 | 65 | public bool IsActive => Time > 0f; 66 | 67 | public void Reset() 68 | { 69 | Time = 0f; 70 | } 71 | 72 | public float Tick() 73 | { 74 | if (Time == 0f) 75 | { 76 | return 0f; 77 | } 78 | 79 | Time = Mathf.Clamp(Time - DeltaTime(), 0f, fadeTime); 80 | return Value; 81 | } 82 | 83 | public void ApplySettings(float fadeTime, Func fadeEvaluation, Func deltaTime) 84 | { 85 | this.fadeTime = fadeTime; 86 | FadeEvaluation = fadeEvaluation; 87 | DeltaTime = deltaTime; 88 | Time = 0f; 89 | fadeValue = 0f; 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /ProjectSettings/Packages/com.unity.probuilder/Settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "m_Name": "Settings", 3 | "m_Path": "ProjectSettings/Packages/com.unity.probuilder/Settings.json", 4 | "m_Dictionary": { 5 | "m_DictionaryValues": [ 6 | { 7 | "type": "UnityEngine.ProBuilder.LogLevel, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", 8 | "key": "log.level", 9 | "value": "{\"m_Value\":3}" 10 | }, 11 | { 12 | "type": "UnityEngine.ProBuilder.LogOutput, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", 13 | "key": "log.output", 14 | "value": "{\"m_Value\":1}" 15 | }, 16 | { 17 | "type": "System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 18 | "key": "log.path", 19 | "value": "{\"m_Value\":\"ProBuilderLog.txt\"}" 20 | }, 21 | { 22 | "type": "UnityEngine.ProBuilder.SemVer, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", 23 | "key": "about.identifier", 24 | "value": "{\"m_Value\":{\"m_Major\":4,\"m_Minor\":5,\"m_Patch\":2,\"m_Build\":-1,\"m_Type\":\"\",\"m_Metadata\":\"\",\"m_Date\":\"\"}}" 25 | }, 26 | { 27 | "type": "UnityEngine.ProBuilder.SemVer, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", 28 | "key": "preferences.version", 29 | "value": "{\"m_Value\":{\"m_Major\":4,\"m_Minor\":5,\"m_Patch\":2,\"m_Build\":-1,\"m_Type\":\"\",\"m_Metadata\":\"\",\"m_Date\":\"\"}}" 30 | }, 31 | { 32 | "type": "System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 33 | "key": "lightmapping.autoUnwrapLightmapUV", 34 | "value": "{\"m_Value\":true}" 35 | } 36 | ] 37 | } 38 | } -------------------------------------------------------------------------------- /Packages/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.impossibleodds.toolkit": "https://github.com/juniordiscart/ImpossibleOdds-Toolkit.git?path=/Assets/Impossible%20Odds/Toolkit", 4 | "com.unity.2d.sprite": "1.0.0", 5 | "com.unity.2d.tilemap": "1.0.0", 6 | "com.unity.cinemachine": "2.6.17", 7 | "com.unity.ext.nunit": "1.0.6", 8 | "com.unity.ide.rider": "3.0.31", 9 | "com.unity.ide.visualstudio": "2.0.22", 10 | "com.unity.polybrush": "1.0.2", 11 | "com.unity.postprocessing": "3.2.2", 12 | "com.unity.probuilder": "4.5.2", 13 | "com.unity.test-framework": "1.1.33", 14 | "com.unity.textmeshpro": "3.0.9", 15 | "com.unity.timeline": "1.4.8", 16 | "com.unity.ugui": "1.0.0", 17 | "com.unity.modules.ai": "1.0.0", 18 | "com.unity.modules.androidjni": "1.0.0", 19 | "com.unity.modules.animation": "1.0.0", 20 | "com.unity.modules.assetbundle": "1.0.0", 21 | "com.unity.modules.audio": "1.0.0", 22 | "com.unity.modules.cloth": "1.0.0", 23 | "com.unity.modules.director": "1.0.0", 24 | "com.unity.modules.imageconversion": "1.0.0", 25 | "com.unity.modules.imgui": "1.0.0", 26 | "com.unity.modules.jsonserialize": "1.0.0", 27 | "com.unity.modules.particlesystem": "1.0.0", 28 | "com.unity.modules.physics": "1.0.0", 29 | "com.unity.modules.physics2d": "1.0.0", 30 | "com.unity.modules.screencapture": "1.0.0", 31 | "com.unity.modules.terrain": "1.0.0", 32 | "com.unity.modules.terrainphysics": "1.0.0", 33 | "com.unity.modules.tilemap": "1.0.0", 34 | "com.unity.modules.ui": "1.0.0", 35 | "com.unity.modules.uielements": "1.0.0", 36 | "com.unity.modules.umbra": "1.0.0", 37 | "com.unity.modules.unityanalytics": "1.0.0", 38 | "com.unity.modules.unitywebrequest": "1.0.0", 39 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 40 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 41 | "com.unity.modules.unitywebrequesttexture": "1.0.0", 42 | "com.unity.modules.unitywebrequestwww": "1.0.0", 43 | "com.unity.modules.vehicles": "1.0.0", 44 | "com.unity.modules.video": "1.0.0", 45 | "com.unity.modules.vr": "1.0.0", 46 | "com.unity.modules.wind": "1.0.0", 47 | "com.unity.modules.xr": "1.0.0" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Utility/ValueRange.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | 4 | namespace ImpossibleOdds.TacticalCamera 5 | { 6 | [Serializable] 7 | public struct ValueRange 8 | { 9 | [SerializeField] 10 | internal float min; 11 | [SerializeField] 12 | internal float max; 13 | 14 | /// 15 | /// The minimum value of the value range. 16 | /// 17 | public float Min => min; 18 | 19 | /// 20 | /// The maximum value of the value range. 21 | /// 22 | public float Max => max; 23 | 24 | /// 25 | /// Distance between min and max value. 26 | /// 27 | public float Range => Mathf.Abs(max - min); 28 | 29 | public ValueRange(float min, float max) 30 | { 31 | this.min = Mathf.Min(min, max); 32 | this.max = Mathf.Max(min, max); 33 | } 34 | 35 | public static ValueRange Lerp(ValueRange a, ValueRange b, float t) 36 | { 37 | ValueRange result = new ValueRange 38 | { 39 | min = Mathf.Lerp(a.min, b.min, t), 40 | max = Mathf.Lerp(a.max, b.max, t) 41 | }; 42 | return result; 43 | } 44 | 45 | public float Lerp(float t) 46 | { 47 | return Mathf.Lerp(Min, Max, t); 48 | } 49 | 50 | /// 51 | /// Inverse lerp the given value from Min to Max. 52 | /// 53 | public float InverseLerp(float value) 54 | { 55 | return Mathf.InverseLerp(Min, Max, value); 56 | } 57 | 58 | /// 59 | /// Clamps the given value in this value range. 60 | /// 61 | public float Clamp(float value) 62 | { 63 | return Mathf.Clamp(value, Min, Max); 64 | } 65 | 66 | /// 67 | /// Set a new minimum and maximum value for this value range. 68 | /// 69 | public void Set(float min, float max) 70 | { 71 | this.min = Mathf.Min(min, max); 72 | this.max = Mathf.Max(min, max); 73 | } 74 | 75 | /// 76 | /// Test whether the given value is within the value range. 77 | /// 78 | public bool InRange(float value) 79 | { 80 | return (value >= Min) && (value <= Max); 81 | } 82 | 83 | public override string ToString() 84 | { 85 | return $"Min: {Min:0.000}, Max: {Max:0.000}"; 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /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: -1372625422 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 | - serializedVersion: 2 91 | agentTypeID: -1372625422 92 | agentRadius: 0.5 93 | agentHeight: 1 94 | agentSlope: 45 95 | agentClimb: 0.6 96 | ledgeDropHeight: 0 97 | maxJumpAcrossDistance: 0 98 | minRegionArea: 2 99 | manualCellSize: 0 100 | cellSize: 0.16666667 101 | manualTileSize: 0 102 | tileSize: 256 103 | accuratePlacement: 0 104 | debug: 105 | m_Flags: 0 106 | m_SettingNames: 107 | - Humanoid 108 | - Chomper 109 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/TacticalCameraBoxBounds.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.Serialization; 3 | 4 | namespace ImpossibleOdds.TacticalCamera 5 | { 6 | /// 7 | /// Restricts the camera's position within an axis-aligned bounding box. 8 | /// 9 | public class TacticalCameraBoxBounds : AbstractTacticalCameraBounds 10 | { 11 | [SerializeField, Tooltip("Axis-aligned bounding box that determines the camera's area to move in.")] 12 | private Bounds boundingBox = new Bounds(Vector3.zero, Vector3.one * 100f); 13 | [SerializeField, Tooltip("Should the bounds follow the game object's position, rotation and scale?")] 14 | private bool followGameObject; 15 | 16 | /// 17 | /// The bounding box used to restrict the camera. 18 | /// 19 | public Bounds Bounds 20 | { 21 | get => boundingBox; 22 | set => boundingBox = value; 23 | } 24 | 25 | /// 26 | public override void Apply(TacticalCamera tCamera) 27 | { 28 | tCamera.transform.position = Apply(tCamera.transform.position); 29 | } 30 | 31 | /// 32 | public override Vector3 Apply(Vector3 position) 33 | { 34 | if (followGameObject) 35 | { 36 | position = transform.InverseTransformPoint(position); 37 | } 38 | 39 | if (!Bounds.Contains(position)) 40 | { 41 | position = Bounds.ClosestPoint(position); 42 | } 43 | 44 | if (followGameObject) 45 | { 46 | position = transform.TransformPoint(position); 47 | } 48 | 49 | return position; 50 | } 51 | 52 | /// 53 | public override bool IsWithinBounds(Vector3 position) 54 | { 55 | if (followGameObject) 56 | { 57 | position = transform.InverseTransformPoint(position); 58 | } 59 | 60 | return boundingBox.Contains(position); 61 | } 62 | 63 | private void OnDrawGizmos() 64 | { 65 | if (!enabled) 66 | { 67 | return; 68 | } 69 | 70 | Color cached = Gizmos.color; 71 | Gizmos.color = Color.blue; 72 | 73 | if (followGameObject) 74 | { 75 | Gizmos.matrix = transform.localToWorldMatrix; 76 | Gizmos.DrawWireCube(boundingBox.center, boundingBox.size); 77 | Gizmos.matrix = Matrix4x4.identity; 78 | } 79 | else 80 | { 81 | Gizmos.DrawWireCube(boundingBox.center, boundingBox.size); 82 | } 83 | 84 | Gizmos.color = cached; 85 | } 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Interfaces/ITacticalCameraInputProvider.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | namespace ImpossibleOdds.TacticalCamera 3 | { 4 | /// 5 | /// Provides the necessary inputs to control the camera. 6 | /// 7 | public interface ITacticalCameraInputProvider 8 | { 9 | /// 10 | /// Should the camera move towards its target. 11 | /// 12 | /// True if the camera should move to the target under the mouse cursor. 13 | bool MoveToTarget 14 | { 15 | get; 16 | } 17 | 18 | /// 19 | /// Cancel the move-to-target animation. 20 | /// 21 | /// True if the tactical camera should any ongoing move-to animations. 22 | bool CancelMoveToTarget 23 | { 24 | get; 25 | } 26 | 27 | /// 28 | /// Prefer orbiting around the focus target rather than rotating around it's current location. 29 | /// 30 | /// True if orbiting is preferred. 31 | bool OrbitAroundTarget 32 | { 33 | get; 34 | } 35 | 36 | /// 37 | /// Should the camera move forward or backwards. 38 | /// Expected value range is [-1, 1]. 39 | /// 40 | /// Positive value to move forward, negative to move backwards. 41 | float MoveForward 42 | { 43 | get; 44 | } 45 | 46 | /// 47 | /// Should the camera move left or right. 48 | /// Expected value range is [-1, 1]. 49 | /// 50 | /// Positive value to move right, negative to move left. 51 | float MoveSideways 52 | { 53 | get; 54 | } 55 | 56 | /// 57 | /// Should the camera move up or down. 58 | /// Expected value range is [-1, 1]. 59 | /// 60 | /// Positive value to move up, negative to move down. 61 | float MoveUp 62 | { 63 | get; 64 | } 65 | 66 | /// 67 | /// Should the camera tilt around its pivot. 68 | /// Expected value range is [-1, 1]. 69 | /// 70 | /// Positive value to tilt up, negative to tilt down. 71 | float TiltDelta 72 | { 73 | get; 74 | } 75 | 76 | /// 77 | /// Should the camera rotate around its pivot. 78 | /// Expected value range is [-1, 1]. 79 | /// 80 | /// Positive value to rotate right, negative value to rotate left. 81 | float RotationDelta 82 | { 83 | get; 84 | } 85 | 86 | /// 87 | /// The current mouse position on the screen, in pixel coordinates. 88 | /// 89 | Vector2 MousePosition 90 | { 91 | get; 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 2 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Performance 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 15 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 0 21 | blendWeights: 1 22 | textureQuality: 2 23 | anisotropicTextures: 0 24 | antiAliasing: 0 25 | softParticles: 0 26 | softVegetation: 0 27 | realtimeReflectionProbes: 0 28 | billboardsFaceCameraPosition: 0 29 | vSyncCount: 0 30 | lodBias: 0.2 31 | maximumLODLevel: 0 32 | streamingMipmapsActive: 0 33 | streamingMipmapsAddAllCameras: 1 34 | streamingMipmapsMemoryBudget: 512 35 | streamingMipmapsRenderersPerFrame: 512 36 | streamingMipmapsMaxLevelReduction: 2 37 | streamingMipmapsMaxFileIORequests: 1024 38 | particleRaycastBudget: 4 39 | asyncUploadTimeSlice: 2 40 | asyncUploadBufferSize: 4 41 | resolutionScalingFixedDPIFactor: 1 42 | excludedTargetPlatforms: [] 43 | - serializedVersion: 2 44 | name: Balanced 45 | pixelLightCount: 1 46 | shadows: 1 47 | shadowResolution: 1 48 | shadowProjection: 1 49 | shadowCascades: 2 50 | shadowDistance: 30 51 | shadowNearPlaneOffset: 3 52 | shadowCascade2Split: 0.33333334 53 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 54 | shadowmaskMode: 0 55 | blendWeights: 2 56 | textureQuality: 1 57 | anisotropicTextures: 1 58 | antiAliasing: 0 59 | softParticles: 0 60 | softVegetation: 0 61 | realtimeReflectionProbes: 0 62 | billboardsFaceCameraPosition: 0 63 | vSyncCount: 0 64 | lodBias: 0.5 65 | maximumLODLevel: 0 66 | streamingMipmapsActive: 0 67 | streamingMipmapsAddAllCameras: 1 68 | streamingMipmapsMemoryBudget: 512 69 | streamingMipmapsRenderersPerFrame: 512 70 | streamingMipmapsMaxLevelReduction: 2 71 | streamingMipmapsMaxFileIORequests: 1024 72 | particleRaycastBudget: 64 73 | asyncUploadTimeSlice: 2 74 | asyncUploadBufferSize: 4 75 | resolutionScalingFixedDPIFactor: 1 76 | excludedTargetPlatforms: [] 77 | - serializedVersion: 2 78 | name: Fantastic 79 | pixelLightCount: 4 80 | shadows: 2 81 | shadowResolution: 3 82 | shadowProjection: 1 83 | shadowCascades: 4 84 | shadowDistance: 100 85 | shadowNearPlaneOffset: 3 86 | shadowCascade2Split: 0.33333334 87 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 88 | shadowmaskMode: 0 89 | blendWeights: 4 90 | textureQuality: 0 91 | anisotropicTextures: 2 92 | antiAliasing: 0 93 | softParticles: 1 94 | softVegetation: 1 95 | realtimeReflectionProbes: 1 96 | billboardsFaceCameraPosition: 1 97 | vSyncCount: 0 98 | lodBias: 1 99 | maximumLODLevel: 0 100 | streamingMipmapsActive: 0 101 | streamingMipmapsAddAllCameras: 1 102 | streamingMipmapsMemoryBudget: 512 103 | streamingMipmapsRenderersPerFrame: 512 104 | streamingMipmapsMaxLevelReduction: 2 105 | streamingMipmapsMaxFileIORequests: 1024 106 | particleRaycastBudget: 4096 107 | asyncUploadTimeSlice: 2 108 | asyncUploadBufferSize: 4 109 | resolutionScalingFixedDPIFactor: 1 110 | excludedTargetPlatforms: [] 111 | m_PerPlatformDefaultQuality: 112 | Standalone: 1 113 | -------------------------------------------------------------------------------- /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: 12 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 | - {fileID: 16000, guid: 0000000000000000f000000000000000, type: 0} 39 | - {fileID: 17000, guid: 0000000000000000f000000000000000, type: 0} 40 | m_PreloadedShaders: [] 41 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, 42 | type: 0} 43 | m_CustomRenderPipeline: {fileID: 0} 44 | m_TransparencySortMode: 0 45 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 46 | m_DefaultRenderingPath: 1 47 | m_DefaultMobileRenderingPath: 1 48 | m_TierSettings: 49 | - serializedVersion: 5 50 | m_BuildTarget: 1 51 | m_Tier: 1 52 | m_Settings: 53 | standardShaderQuality: 2 54 | renderingPath: 3 55 | hdrMode: 1 56 | realtimeGICPUUsage: 25 57 | useReflectionProbeBoxProjection: 1 58 | useReflectionProbeBlending: 1 59 | useHDR: 1 60 | useDetailNormalMap: 1 61 | useCascadedShadowMaps: 1 62 | prefer32BitShadowMaps: 0 63 | enableLPPV: 1 64 | useDitherMaskForAlphaBlendedShadows: 1 65 | m_Automatic: 0 66 | - serializedVersion: 5 67 | m_BuildTarget: 1 68 | m_Tier: 0 69 | m_Settings: 70 | standardShaderQuality: 2 71 | renderingPath: 3 72 | hdrMode: 1 73 | realtimeGICPUUsage: 25 74 | useReflectionProbeBoxProjection: 1 75 | useReflectionProbeBlending: 1 76 | useHDR: 1 77 | useDetailNormalMap: 1 78 | useCascadedShadowMaps: 1 79 | prefer32BitShadowMaps: 0 80 | enableLPPV: 0 81 | useDitherMaskForAlphaBlendedShadows: 1 82 | m_Automatic: 0 83 | - serializedVersion: 5 84 | m_BuildTarget: 1 85 | m_Tier: 2 86 | m_Settings: 87 | standardShaderQuality: 2 88 | renderingPath: 3 89 | hdrMode: 1 90 | realtimeGICPUUsage: 50 91 | useReflectionProbeBoxProjection: 1 92 | useReflectionProbeBlending: 1 93 | useHDR: 1 94 | useDetailNormalMap: 1 95 | useCascadedShadowMaps: 1 96 | prefer32BitShadowMaps: 0 97 | enableLPPV: 1 98 | useDitherMaskForAlphaBlendedShadows: 1 99 | m_Automatic: 0 100 | m_LightmapStripping: 0 101 | m_FogStripping: 0 102 | m_InstancingStripping: 0 103 | m_LightmapKeepPlain: 1 104 | m_LightmapKeepDirCombined: 1 105 | m_LightmapKeepDynamicPlain: 1 106 | m_LightmapKeepDynamicDirCombined: 1 107 | m_LightmapKeepShadowMask: 1 108 | m_LightmapKeepSubtractive: 1 109 | m_FogKeepLinear: 1 110 | m_FogKeepExp: 1 111 | m_FogKeepExp2: 1 112 | m_AlbedoSwatchInfos: [] 113 | m_LightsUseLinearIntensity: 1 114 | m_LightsUseColorTemperature: 1 115 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/TacticalCameraCompositeBounds.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | namespace ImpossibleOdds.TacticalCamera 6 | { 7 | public class TacticalCameraCompositeBounds : AbstractTacticalCameraBounds 8 | { 9 | [SerializeField, Tooltip("Set of initial camera bounds.")] 10 | internal List initialCameraBounds; 11 | 12 | private List cameraBounds; 13 | 14 | public IReadOnlyList CameraBounds => cameraBounds; 15 | 16 | /// 17 | /// Add a new camera bounds to this composite bounds. 18 | /// Note: self-insertion is not allowed. 19 | /// 20 | /// The new camera bounds to add to this composite bounds. 21 | public void Add(ITacticalCameraBounds newCameraBounds) 22 | { 23 | newCameraBounds.ThrowIfNull(nameof(newCameraBounds)); 24 | 25 | if (ReferenceEquals(newCameraBounds, this)) 26 | { 27 | throw new ArgumentException("Self-insertion is not allowed."); 28 | } 29 | 30 | if (!cameraBounds.Contains(newCameraBounds)) 31 | { 32 | cameraBounds.Add(newCameraBounds); 33 | } 34 | } 35 | 36 | /// 37 | /// Removes the old camera bounds from this composite bounds. 38 | /// 39 | /// The old camera bounds to be removed. 40 | /// True if it was successfully removed. 41 | public bool Remove(ITacticalCameraBounds oldCameraBounds) 42 | { 43 | oldCameraBounds.ThrowIfNull(nameof(oldCameraBounds)); 44 | return cameraBounds.Remove(oldCameraBounds); 45 | } 46 | 47 | /// 48 | public override void Apply(TacticalCamera tCamera) 49 | { 50 | tCamera.ThrowIfNull(nameof(tCamera)); 51 | tCamera.transform.position = Apply(tCamera.transform.position); 52 | } 53 | 54 | /// 55 | public override Vector3 Apply(Vector3 position) 56 | { 57 | if (cameraBounds.IsNullOrEmpty() || IsWithinBounds(position)) 58 | { 59 | return position; 60 | } 61 | 62 | ITacticalCameraBounds bestCandidate = null; 63 | Vector3 closestPosition = Vector3.zero; 64 | 65 | foreach (ITacticalCameraBounds cb in cameraBounds) 66 | { 67 | if (cb == null) 68 | { 69 | continue; 70 | } 71 | 72 | if (bestCandidate == null) 73 | { 74 | bestCandidate = cb; 75 | closestPosition = bestCandidate.Apply(position); 76 | } 77 | else 78 | { 79 | Vector3 potentialPosition = cb.Apply(position); 80 | if (Vector3.Distance(position, closestPosition) > Vector3.Distance(position, potentialPosition)) 81 | { 82 | bestCandidate = cb; 83 | closestPosition = potentialPosition; 84 | } 85 | } 86 | } 87 | 88 | return (bestCandidate != null) ? closestPosition : position; 89 | } 90 | 91 | /// 92 | public override bool IsWithinBounds(Vector3 position) 93 | { 94 | if (cameraBounds.IsNullOrEmpty()) 95 | { 96 | return false; 97 | } 98 | 99 | foreach (ITacticalCameraBounds cb in cameraBounds) 100 | { 101 | if (cb == null) 102 | { 103 | continue; 104 | } 105 | 106 | if (cb.IsWithinBounds(position)) 107 | { 108 | return true; 109 | } 110 | } 111 | 112 | return false; 113 | } 114 | 115 | private void Awake() 116 | { 117 | cameraBounds = new List(initialCameraBounds); 118 | } 119 | } 120 | } 121 | 122 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/Interfaces/ITacticalCameraSettings.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace ImpossibleOdds.TacticalCamera 4 | { 5 | /// 6 | /// Interface to drive the tactical camera's behaviour. 7 | /// 8 | public interface ITacticalCameraSettings 9 | { 10 | /// 11 | /// Smallest value the camera will use to compare values with to determine certain actions. 12 | /// 13 | float Epsilon 14 | { 15 | get; 16 | } 17 | 18 | /// 19 | /// Should the tactical camera use 'real' time, as opposed to 'scaled' time? 20 | /// 21 | bool IgnoreTimeScale 22 | { 23 | get; 24 | } 25 | 26 | /// 27 | /// The minimum height above a surface (defined by the interaction mask) and maximum height the camera can go. 28 | /// 29 | ValueRange AbsoluteHeightRange 30 | { 31 | get; 32 | } 33 | 34 | /// 35 | /// The range of movement speed values for the camera, depending on the height it's operating at. 36 | /// 37 | ValueRange MovementSpeedRange 38 | { 39 | get; 40 | } 41 | 42 | /// 43 | /// Time for the movement to linger and fade out. (In seconds) 44 | /// 45 | float MovementFadeTime 46 | { 47 | get; 48 | } 49 | 50 | /// 51 | /// Smoothing time when the camera is moving to its focus point. 52 | /// 53 | float MoveToTargetSmoothingTime 54 | { 55 | get; 56 | } 57 | 58 | /// 59 | /// Maximum speed at which the camera will pivot around its origin. (In degrees per second) 60 | /// 61 | float MaxRotationalSpeed 62 | { 63 | get; 64 | } 65 | 66 | /// 67 | /// Time for the rotation to linger and fade out. (In seconds) 68 | /// 69 | float RotationalFadeTime 70 | { 71 | get; 72 | } 73 | 74 | /// 75 | /// Range in which the camera can tilt when it is down low. (In degrees) 76 | /// 77 | ValueRange TiltRangeLow 78 | { 79 | get; 80 | } 81 | 82 | /// 83 | /// Range in which the camera can tilt when it is up high. (In degrees) 84 | /// 85 | ValueRange TiltRangeHigh 86 | { 87 | get; 88 | } 89 | 90 | /// 91 | /// Should the tactical camera apply a dynamic field-of-view based on its height range? 92 | /// 93 | bool UseDynamicFieldOfView 94 | { 95 | get; 96 | } 97 | 98 | /// 99 | /// The range of field-of-view values for the camera, depending on the height it's operating at. 100 | /// 101 | ValueRange DynamicFieldOfViewRange 102 | { 103 | get; 104 | } 105 | 106 | /// 107 | /// Layers that are to used to interact with the camera movement. 108 | /// 109 | LayerMask InteractionMask 110 | { 111 | get; 112 | } 113 | 114 | /// 115 | /// Distance the camera can interact with the world, e.g. raycast distance. 116 | /// 117 | float InteractionDistance 118 | { 119 | get; 120 | } 121 | 122 | /// 123 | /// The radius of the camera's collider, used to avoid collisions and clipping with the environment. 124 | /// 125 | float InteractionBubbleRadius 126 | { 127 | get; 128 | } 129 | 130 | /// 131 | /// When the camera can't determine a suitable orbital pivot point, is it allowed to pivot instead? 132 | /// 133 | bool AllowPivotOnFailedOrbit 134 | { 135 | get; 136 | } 137 | 138 | /// 139 | /// Evaluate how the movement fades out when no more input is given. 140 | /// 141 | /// Value between 0 and 1. 142 | /// The fade factor to be applied to the movement speed. 143 | float EvaluateMovementFadeOut(float t); 144 | 145 | /// 146 | /// Evaluate how the rotation fades out when no more input is given. 147 | /// 148 | /// Value between 0 and 1. 149 | /// The fade factor to be applied to the rotational speed. 150 | float EvaluateRotationFadeOut(float t); 151 | 152 | /// 153 | /// Evaluate how the movement speed should change based on the relative height of the camera, 154 | /// with 0 defined at the lowest operating point and 1 at the highest. 155 | /// 156 | /// Value between 0 and 1. 157 | /// The desired interpolated value for the movement speed transition. 158 | float EvaluateMovementTransition(float t); 159 | 160 | /// 161 | /// Evaluate how the tilt range should change based on the relative height of the camera, 162 | /// with 0 defined at the lowest operating point and 1 at the highest. 163 | /// 164 | /// Value between 0 and 1. 165 | /// The desired interpolated value for the tilt range transition. 166 | float EvaluateTiltTransition(float t); 167 | 168 | /// 169 | /// Evaluate how the field of view should change based on the relative height of the camera, 170 | /// with 0 defined at the lowest operating point and 1 at the highest. 171 | /// 172 | /// Value between 0 and 1. 173 | /// The desired interpolated value for the field of view transition. 174 | float EvaluateFieldOfViewTransition(float t); 175 | } 176 | } 177 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/TacticalCameraInputProvider.cs: -------------------------------------------------------------------------------- 1 | namespace ImpossibleOdds.TacticalCamera 2 | { 3 | using System.Collections; 4 | using UnityEngine; 5 | 6 | /// 7 | /// A sample input implementation to provide input for the TacticalCamera. 8 | /// The best approach is to implement the input provider interface in your own input manager, and use this class as a sample implementation of expected inputs. 9 | /// 10 | public class TacticalCameraInputProvider : AbstractTacticalCameraInputProvider, ITacticalCameraInputProvider 11 | { 12 | public const string DefaultMouseRotationAxis = "Mouse X"; 13 | public const string DefaultMouseTiltAxis = "Mouse Y"; 14 | 15 | public enum MouseKeys : int 16 | { 17 | Left = 0, 18 | Right = 1, 19 | Middle = 2 20 | } 21 | 22 | [Header("Movement")] 23 | [SerializeField, Tooltip("Key to move the camera forwards.")] 24 | private KeyCode moveForwardKey = KeyCode.W; 25 | [SerializeField, Tooltip("Key to move the camera backwards")] 26 | private KeyCode moveBackwardKey = KeyCode.S; 27 | [SerializeField, Tooltip("Key to move the camera to the left.")] 28 | private KeyCode moveLeftKey = KeyCode.A; 29 | [SerializeField, Tooltip("Key to move the camera to the right.")] 30 | private KeyCode moveRightKey = KeyCode.D; 31 | [SerializeField, Tooltip("Key to orbit the camera around it's focus target. Hold down to activate orbiting.")] 32 | private KeyCode orbitCamera = KeyCode.LeftShift; 33 | [SerializeField, Range(0f, 0.5f), Tooltip("Screen edge detection for moving the camera. Expressed in percentage of the screen.")] 34 | private float screenBorderTrigger = 0f; 35 | [SerializeField, Tooltip("Should movement be triggered by an off-screen mouse cursor?")] 36 | private bool triggerOffScreen = false; 37 | [SerializeField, Min(0f), Tooltip("Value to multiply the scroll value with.")] 38 | private float scrollSensitivityFactor = 100f; 39 | 40 | [Header("Rotation")] 41 | [SerializeField, Tooltip("The mouse button that's used to move the camera to a position. Double click to move to the target position.")] 42 | private MouseKeys mouseMoveToPositionKey = MouseKeys.Left; 43 | [SerializeField, Tooltip("The mouse button that's used to rotate the camera.")] 44 | private MouseKeys mouseRotationKey = MouseKeys.Right; 45 | [SerializeField, Tooltip("The mouse axis that is used for tilting the camera up/down.")] 46 | private string mouseTiltAxis = DefaultMouseTiltAxis; 47 | [SerializeField, Tooltip("The mouse axis that is used for rotating the camera in the XZ-plane.")] 48 | private string mouseRotationAxis = DefaultMouseRotationAxis; 49 | 50 | [Header("Rotation Modifiers")] 51 | [SerializeField, Tooltip("Invert the tilt input value.")] 52 | private bool invertTilt = true; 53 | [SerializeField, Tooltip("Invert the rotation input value.")] 54 | private bool invertRotation = false; 55 | [SerializeField, Tooltip("Invert the zoom value.")] 56 | private bool invertZoom = true; 57 | [SerializeField, Tooltip("Is the camera always rotating? If enabled, the camera will lock & hide the cursor.")] 58 | private bool alwaysRotating = false; 59 | 60 | private Event latestEvent = null; 61 | private bool rotationEnabled = false; 62 | 63 | /// 64 | public override bool MoveToTarget => 65 | latestEvent is { isMouse: true, type: EventType.MouseDown } && 66 | (latestEvent.button == (int)mouseMoveToPositionKey) && 67 | (latestEvent.clickCount == 2); 68 | 69 | /// 70 | public override bool CancelMoveToTarget => !Mathf.Approximately(Mathf.Abs(MoveForward), 0f) || !Mathf.Approximately(Mathf.Abs(MoveSideways), 0f) || Input.GetKeyDown(KeyCode.Escape); 71 | 72 | /// 73 | public override bool OrbitAroundTarget => Input.GetKey(orbitCamera); 74 | 75 | /// 76 | public override float MoveForward 77 | { 78 | get 79 | { 80 | float value = 0f; 81 | 82 | // Keyboard 83 | if (Input.GetKey(moveForwardKey)) 84 | { 85 | value += 1f; 86 | } 87 | 88 | if (Input.GetKey(moveBackwardKey)) 89 | { 90 | value -= 1f; 91 | } 92 | 93 | // Mouse 94 | float mouseY = Input.mousePosition.y; 95 | 96 | if ((mouseY >= (Screen.height * (1f - screenBorderTrigger))) && 97 | (triggerOffScreen || (mouseY <= Screen.height))) 98 | { 99 | value += 1f; 100 | } 101 | 102 | if ((mouseY <= (Screen.height * screenBorderTrigger)) && 103 | (triggerOffScreen || (mouseY >= 0f))) 104 | { 105 | value -= 1f; 106 | } 107 | 108 | value = Mathf.Clamp(value, -1f, 1f); 109 | return value; 110 | } 111 | } 112 | 113 | /// 114 | public override float MoveSideways 115 | { 116 | get 117 | { 118 | float value = 0f; 119 | 120 | // Keyboard 121 | if (Input.GetKey(moveLeftKey)) 122 | { 123 | value -= 1f; 124 | } 125 | 126 | if (Input.GetKey(moveRightKey)) 127 | { 128 | value += 1f; 129 | } 130 | 131 | // Mouse 132 | float mouseX = Input.mousePosition.x; 133 | 134 | if ((mouseX <= (Screen.width * screenBorderTrigger)) && 135 | (triggerOffScreen || (mouseX >= 0f))) 136 | { 137 | value -= 1f; 138 | } 139 | 140 | if ((mouseX >= (Screen.width * (1f - screenBorderTrigger))) && 141 | (triggerOffScreen || (mouseX <= Screen.width))) 142 | { 143 | value += 1f; 144 | } 145 | 146 | value = Mathf.Clamp(value, -1f, 1f); 147 | return value; 148 | } 149 | } 150 | 151 | /// 152 | public override float MoveUp 153 | { 154 | get 155 | { 156 | float value = Input.mouseScrollDelta.y * scrollSensitivityFactor; 157 | 158 | if (invertZoom) 159 | { 160 | value *= -1f; 161 | } 162 | 163 | return value; 164 | } 165 | } 166 | 167 | /// 168 | public override float TiltDelta 169 | { 170 | get 171 | { 172 | float value = 0f; 173 | 174 | if (rotationEnabled) 175 | { 176 | value = Mathf.Clamp(Input.GetAxis(mouseTiltAxis), -1f, 1f); 177 | } 178 | 179 | if (invertTilt) 180 | { 181 | value *= -1f; 182 | } 183 | 184 | return value; 185 | } 186 | } 187 | 188 | /// 189 | public override float RotationDelta 190 | { 191 | get 192 | { 193 | float value = 0f; 194 | 195 | if (rotationEnabled) 196 | { 197 | value = Mathf.Clamp(Input.GetAxis(mouseRotationAxis), -1f, 1f); 198 | } 199 | 200 | if (invertRotation) 201 | { 202 | value *= -1f; 203 | } 204 | 205 | return value; 206 | } 207 | } 208 | 209 | private void OnEnable() 210 | { 211 | if (alwaysRotating) 212 | { 213 | Cursor.visible = false; 214 | Cursor.lockState = CursorLockMode.Locked; 215 | rotationEnabled = true; 216 | } 217 | } 218 | 219 | private void OnGUI() 220 | { 221 | latestEvent = Event.current; 222 | CheckMouseCursor(); 223 | } 224 | 225 | private void CheckMouseCursor() 226 | { 227 | if (alwaysRotating || !(latestEvent is { isMouse: true })) 228 | { 229 | return; 230 | } 231 | 232 | switch (latestEvent.type) 233 | { 234 | case EventType.MouseDown when (latestEvent.button == (int)mouseRotationKey): 235 | Cursor.visible = false; 236 | Cursor.lockState = CursorLockMode.Locked; 237 | rotationEnabled = false; 238 | StartCoroutine(RoutineWaitForDrag()); // Prevent spike in mouse input 239 | break; 240 | case EventType.MouseUp when (latestEvent.button == (int)mouseRotationKey): 241 | Cursor.visible = true; 242 | Cursor.lockState = CursorLockMode.None; 243 | rotationEnabled = false; 244 | break; 245 | } 246 | } 247 | 248 | private IEnumerator RoutineWaitForDrag() 249 | { 250 | yield return new WaitWhile(() => 251 | (Cursor.lockState == CursorLockMode.Locked) && 252 | ((Mathf.Abs(Input.GetAxis(mouseTiltAxis)) > 0f) || (Mathf.Abs(Input.GetAxis(mouseRotationAxis)) > 0f))); 253 | 254 | yield return null; 255 | rotationEnabled = true; 256 | } 257 | } 258 | } 259 | -------------------------------------------------------------------------------- /ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!13 &1 4 | InputManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Axes: 8 | - serializedVersion: 3 9 | m_Name: Horizontal 10 | descriptiveName: 11 | descriptiveNegativeName: 12 | negativeButton: left 13 | positiveButton: right 14 | altNegativeButton: a 15 | altPositiveButton: d 16 | gravity: 1000 17 | dead: 0.001 18 | sensitivity: 1000 19 | snap: 1 20 | invert: 0 21 | type: 0 22 | axis: 0 23 | joyNum: 0 24 | - serializedVersion: 3 25 | m_Name: Vertical 26 | descriptiveName: 27 | descriptiveNegativeName: 28 | negativeButton: down 29 | positiveButton: up 30 | altNegativeButton: s 31 | altPositiveButton: w 32 | gravity: 1000 33 | dead: 0.001 34 | sensitivity: 1000 35 | snap: 1 36 | invert: 0 37 | type: 0 38 | axis: 0 39 | joyNum: 0 40 | - serializedVersion: 3 41 | m_Name: Fire1 42 | descriptiveName: 43 | descriptiveNegativeName: 44 | negativeButton: 45 | positiveButton: 46 | altNegativeButton: 47 | altPositiveButton: mouse 0 48 | gravity: 1000 49 | dead: 0.001 50 | sensitivity: 1000 51 | snap: 0 52 | invert: 0 53 | type: 0 54 | axis: 0 55 | joyNum: 0 56 | - serializedVersion: 3 57 | m_Name: Fire2 58 | descriptiveName: 59 | descriptiveNegativeName: 60 | negativeButton: 61 | positiveButton: left alt 62 | altNegativeButton: 63 | altPositiveButton: mouse 1 64 | gravity: 1000 65 | dead: 0.001 66 | sensitivity: 1000 67 | snap: 0 68 | invert: 0 69 | type: 0 70 | axis: 0 71 | joyNum: 0 72 | - serializedVersion: 3 73 | m_Name: Fire3 74 | descriptiveName: 75 | descriptiveNegativeName: 76 | negativeButton: 77 | positiveButton: left shift 78 | altNegativeButton: 79 | altPositiveButton: mouse 2 80 | gravity: 1000 81 | dead: 0.001 82 | sensitivity: 1000 83 | snap: 0 84 | invert: 0 85 | type: 0 86 | axis: 0 87 | joyNum: 0 88 | - serializedVersion: 3 89 | m_Name: Jump 90 | descriptiveName: 91 | descriptiveNegativeName: 92 | negativeButton: 93 | positiveButton: space 94 | altNegativeButton: 95 | altPositiveButton: 96 | gravity: 1000 97 | dead: 0.001 98 | sensitivity: 1000 99 | snap: 0 100 | invert: 0 101 | type: 0 102 | axis: 0 103 | joyNum: 0 104 | - serializedVersion: 3 105 | m_Name: Mouse X 106 | descriptiveName: 107 | descriptiveNegativeName: 108 | negativeButton: 109 | positiveButton: 110 | altNegativeButton: 111 | altPositiveButton: 112 | gravity: 0 113 | dead: 0 114 | sensitivity: 0.1 115 | snap: 0 116 | invert: 0 117 | type: 1 118 | axis: 0 119 | joyNum: 0 120 | - serializedVersion: 3 121 | m_Name: Mouse Y 122 | descriptiveName: 123 | descriptiveNegativeName: 124 | negativeButton: 125 | positiveButton: 126 | altNegativeButton: 127 | altPositiveButton: 128 | gravity: 0 129 | dead: 0 130 | sensitivity: 0.1 131 | snap: 0 132 | invert: 0 133 | type: 1 134 | axis: 1 135 | joyNum: 0 136 | - serializedVersion: 3 137 | m_Name: CameraX 138 | descriptiveName: 139 | descriptiveNegativeName: 140 | negativeButton: 141 | positiveButton: 142 | altNegativeButton: 143 | altPositiveButton: 144 | gravity: 0 145 | dead: 0 146 | sensitivity: 0.1 147 | snap: 0 148 | invert: 1 149 | type: 1 150 | axis: 0 151 | joyNum: 0 152 | - serializedVersion: 3 153 | m_Name: CameraY 154 | descriptiveName: 155 | descriptiveNegativeName: 156 | negativeButton: 157 | positiveButton: 158 | altNegativeButton: 159 | altPositiveButton: 160 | gravity: 0 161 | dead: 0 162 | sensitivity: 0.1 163 | snap: 0 164 | invert: 1 165 | type: 1 166 | axis: 1 167 | joyNum: 0 168 | - serializedVersion: 3 169 | m_Name: Mouse ScrollWheel 170 | descriptiveName: 171 | descriptiveNegativeName: 172 | negativeButton: 173 | positiveButton: 174 | altNegativeButton: 175 | altPositiveButton: 176 | gravity: 0 177 | dead: 0 178 | sensitivity: 0.1 179 | snap: 0 180 | invert: 0 181 | type: 1 182 | axis: 2 183 | joyNum: 0 184 | - serializedVersion: 3 185 | m_Name: Horizontal 186 | descriptiveName: 187 | descriptiveNegativeName: 188 | negativeButton: 189 | positiveButton: 190 | altNegativeButton: 191 | altPositiveButton: 192 | gravity: 0 193 | dead: 0.19 194 | sensitivity: 1 195 | snap: 0 196 | invert: 0 197 | type: 2 198 | axis: 0 199 | joyNum: 0 200 | - serializedVersion: 3 201 | m_Name: Vertical 202 | descriptiveName: 203 | descriptiveNegativeName: 204 | negativeButton: 205 | positiveButton: 206 | altNegativeButton: 207 | altPositiveButton: 208 | gravity: 0 209 | dead: 0.19 210 | sensitivity: 1 211 | snap: 0 212 | invert: 1 213 | type: 2 214 | axis: 1 215 | joyNum: 0 216 | - serializedVersion: 3 217 | m_Name: Fire1 218 | descriptiveName: 219 | descriptiveNegativeName: 220 | negativeButton: 221 | positiveButton: joystick button 2 222 | altNegativeButton: 223 | altPositiveButton: 224 | gravity: 1000 225 | dead: 0.001 226 | sensitivity: 1000 227 | snap: 0 228 | invert: 0 229 | type: 0 230 | axis: 0 231 | joyNum: 0 232 | - serializedVersion: 3 233 | m_Name: Fire2 234 | descriptiveName: 235 | descriptiveNegativeName: 236 | negativeButton: 237 | positiveButton: joystick button 1 238 | altNegativeButton: 239 | altPositiveButton: 240 | gravity: 1000 241 | dead: 0.001 242 | sensitivity: 1000 243 | snap: 0 244 | invert: 0 245 | type: 0 246 | axis: 0 247 | joyNum: 0 248 | - serializedVersion: 3 249 | m_Name: Fire3 250 | descriptiveName: 251 | descriptiveNegativeName: 252 | negativeButton: 253 | positiveButton: joystick button 3 254 | altNegativeButton: 255 | altPositiveButton: 256 | gravity: 1000 257 | dead: 0.001 258 | sensitivity: 1000 259 | snap: 0 260 | invert: 0 261 | type: 0 262 | axis: 0 263 | joyNum: 0 264 | - serializedVersion: 3 265 | m_Name: Jump 266 | descriptiveName: 267 | descriptiveNegativeName: 268 | negativeButton: 269 | positiveButton: joystick button 0 270 | altNegativeButton: 271 | altPositiveButton: 272 | gravity: 1000 273 | dead: 0.001 274 | sensitivity: 1000 275 | snap: 0 276 | invert: 0 277 | type: 0 278 | axis: 0 279 | joyNum: 0 280 | - serializedVersion: 3 281 | m_Name: Submit 282 | descriptiveName: 283 | descriptiveNegativeName: 284 | negativeButton: 285 | positiveButton: return 286 | altNegativeButton: 287 | altPositiveButton: joystick button 0 288 | gravity: 1000 289 | dead: 0.001 290 | sensitivity: 1000 291 | snap: 0 292 | invert: 0 293 | type: 0 294 | axis: 0 295 | joyNum: 0 296 | - serializedVersion: 3 297 | m_Name: Submit 298 | descriptiveName: 299 | descriptiveNegativeName: 300 | negativeButton: 301 | positiveButton: enter 302 | altNegativeButton: 303 | altPositiveButton: space 304 | gravity: 1000 305 | dead: 0.001 306 | sensitivity: 1000 307 | snap: 0 308 | invert: 0 309 | type: 0 310 | axis: 0 311 | joyNum: 0 312 | - serializedVersion: 3 313 | m_Name: Cancel 314 | descriptiveName: 315 | descriptiveNegativeName: 316 | negativeButton: 317 | positiveButton: escape 318 | altNegativeButton: 319 | altPositiveButton: joystick button 1 320 | gravity: 1000 321 | dead: 0.001 322 | sensitivity: 1000 323 | snap: 0 324 | invert: 0 325 | type: 0 326 | axis: 0 327 | joyNum: 0 328 | - serializedVersion: 3 329 | m_Name: CameraX 330 | descriptiveName: 331 | descriptiveNegativeName: 332 | negativeButton: 333 | positiveButton: escape 334 | altNegativeButton: 335 | altPositiveButton: joystick button 1 336 | gravity: 0 337 | dead: 0.19 338 | sensitivity: 1 339 | snap: 0 340 | invert: 0 341 | type: 2 342 | axis: 3 343 | joyNum: 0 344 | - serializedVersion: 3 345 | m_Name: CameraY 346 | descriptiveName: 347 | descriptiveNegativeName: 348 | negativeButton: 349 | positiveButton: escape 350 | altNegativeButton: 351 | altPositiveButton: joystick button 1 352 | gravity: 0 353 | dead: 0.19 354 | sensitivity: 1 355 | snap: 0 356 | invert: 0 357 | type: 2 358 | axis: 4 359 | joyNum: 0 360 | - serializedVersion: 3 361 | m_Name: Pause 362 | descriptiveName: 363 | descriptiveNegativeName: 364 | negativeButton: 365 | positiveButton: escape 366 | altNegativeButton: 367 | altPositiveButton: joystick button 7 368 | gravity: 0 369 | dead: 0.19 370 | sensitivity: 1 371 | snap: 0 372 | invert: 0 373 | type: 0 374 | axis: 0 375 | joyNum: 0 376 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/TacticalCameraSettings.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | 3 | namespace ImpossibleOdds.TacticalCamera 4 | { 5 | [CreateAssetMenu(fileName = "TacticalCameraSettings", menuName = "Impossible Odds/Tactical Camera/new Tactical Camera Settings")] 6 | public class TacticalCameraSettings : ScriptableObject, ITacticalCameraSettings 7 | { 8 | [SerializeField, Tooltip("Should the tactical camera use 'real' time, as opposed to 'scaled' time?")] 9 | internal bool ignoreTimeScale = false; 10 | 11 | [SerializeField, Tooltip("Range of speed maximums depending on the camera's height.")] 12 | internal ValueRange movementSpeedRange = new ValueRange(5f, 20f); 13 | [SerializeField, Tooltip("The transition of the maximum speed values from low altitude to high altitude.")] 14 | internal AnimationCurve movementSpeedTransition = AnimationCurve.Linear(0f, 0f, 1f, 1f); 15 | [SerializeField, Tooltip("Fade curve for movement.")] 16 | internal AnimationCurve movementFade = AnimationCurve.Linear(0f, 1f, 1f, 0f); 17 | [SerializeField, Min(0f), Tooltip("Time for the movement to linger and fade out. (In seconds)")] 18 | internal float movementFadeTime = 0.2f; 19 | [SerializeField, Min(0f), Range(0f, 1f), Tooltip("Smoothing time when the camera is moving to its focus point.")] 20 | internal float moveToTargetSmoothingTime = 0.2f; 21 | 22 | [SerializeField, Min(0f), Tooltip("Maximum speed at which the camera will rotate around its origin. (In degrees per second)")] 23 | internal float maxRotationSpeed = 180f; 24 | [SerializeField, Tooltip("Fade curve for rotation.")] 25 | internal AnimationCurve rotationalFade = AnimationCurve.Linear(0f, 1f, 1f, 0f); 26 | [SerializeField, Min(0f), Tooltip("Time for the rotational fade to linger and fade out. (In seconds)")] 27 | internal float rotationalFadeTime = 0.2f; 28 | [SerializeField, Tooltip("When attempting to orbit around a point, but no valid point could be found, is the camera allowed to pivot instead?")] 29 | internal bool allowPivotOnFailedOrbit = true; 30 | 31 | [SerializeField, Tooltip("The range of height values the camera can operate in.")] 32 | internal ValueRange absoluteHeightRange = new ValueRange(0f, 20f); 33 | 34 | [SerializeField, Tooltip("Range in which the camera can tilt when it is at its lowest operating position. (In degrees)")] 35 | internal ValueRange tiltRangeLow = new ValueRange(-10f, 30f); 36 | [SerializeField, Tooltip("Range in which the camera can tilt when it is at its highest operating position. (In degrees)")] 37 | internal ValueRange tiltRangeHigh = new ValueRange(10f, 75f); 38 | [SerializeField, Tooltip("Transition of tilt ranges from low to high.")] 39 | internal AnimationCurve tiltRangeTransition = AnimationCurve.Linear(0f, 0f, 1f, 1f); 40 | 41 | [SerializeField, Tooltip("Should the tactical camera apply a dynamic field-of-view based on its height range?")] 42 | internal bool useDynamicFieldOfView = true; 43 | [SerializeField, Tooltip("The range of field-of-view values for the camera, depending on the height it's operating at.")] 44 | internal ValueRange dynamicFieldOfViewRange = new ValueRange(45f, 80f); 45 | [SerializeField, Tooltip("The transition of the field-of-view value from the lowest operating height to the highest operating height.")] 46 | internal AnimationCurve dynamicFieldOfViewTransition = AnimationCurve.Linear(0f, 0f, 1, 1f); 47 | 48 | [SerializeField, Tooltip("Layers that are to used to interact with the camera, e.g. when lowering it towards the ground.")] 49 | internal LayerMask interactionMask = 1; 50 | [SerializeField, Min(0f), Tooltip("Distance the camera can interact with the world, e.g. ray cast distance.")] 51 | internal float interactionDistance = 1000f; 52 | [SerializeField, Min(0f), Tooltip("The radius of the camera's collider, used to avoid collisions and clipping with the environment.")] 53 | internal float interactionBubbleRadius = 1f; 54 | 55 | /// 56 | public float Epsilon => 0.001f; 57 | 58 | /// 59 | public bool IgnoreTimeScale => ignoreTimeScale; 60 | 61 | /// 62 | public ValueRange MovementSpeedRange 63 | { 64 | get => movementSpeedRange; 65 | set => movementSpeedRange = value; 66 | } 67 | 68 | /// 69 | public float MovementFadeTime 70 | { 71 | get => movementFadeTime; 72 | set => movementFadeTime = value; 73 | } 74 | 75 | /// 76 | public float MoveToTargetSmoothingTime 77 | { 78 | get => moveToTargetSmoothingTime; 79 | set => moveToTargetSmoothingTime = value; 80 | } 81 | 82 | /// 83 | public ValueRange AbsoluteHeightRange 84 | { 85 | get => absoluteHeightRange; 86 | set => absoluteHeightRange = value; 87 | } 88 | 89 | /// 90 | public float MaxRotationalSpeed 91 | { 92 | get => maxRotationSpeed; 93 | set => maxRotationSpeed = value; 94 | } 95 | 96 | /// 97 | public float RotationalFadeTime 98 | { 99 | get => rotationalFadeTime; 100 | set => rotationalFadeTime = value; 101 | } 102 | 103 | /// 104 | public ValueRange TiltRangeHigh 105 | { 106 | get => tiltRangeHigh; 107 | set => tiltRangeHigh = value; 108 | } 109 | 110 | /// 111 | public ValueRange TiltRangeLow 112 | { 113 | get => tiltRangeLow; 114 | set => tiltRangeLow = value; 115 | } 116 | 117 | /// 118 | public bool UseDynamicFieldOfView 119 | { 120 | get => useDynamicFieldOfView; 121 | set => useDynamicFieldOfView = value; 122 | } 123 | 124 | /// 125 | public ValueRange DynamicFieldOfViewRange 126 | { 127 | get => dynamicFieldOfViewRange; 128 | set => dynamicFieldOfViewRange = value; 129 | } 130 | 131 | /// 132 | public LayerMask InteractionMask 133 | { 134 | get => interactionMask; 135 | set => interactionMask = value; 136 | } 137 | 138 | /// 139 | public float InteractionDistance 140 | { 141 | get => interactionDistance; 142 | set => interactionDistance = value; 143 | } 144 | 145 | /// 146 | public float InteractionBubbleRadius 147 | { 148 | get => interactionBubbleRadius; 149 | set => interactionBubbleRadius = value; 150 | } 151 | 152 | /// 153 | public bool AllowPivotOnFailedOrbit 154 | { 155 | get => allowPivotOnFailedOrbit; 156 | set => allowPivotOnFailedOrbit = value; 157 | } 158 | 159 | public AnimationCurve MovementSpeedTransition 160 | { 161 | get => movementSpeedTransition; 162 | set => movementSpeedTransition = value; 163 | } 164 | 165 | public AnimationCurve MovementFadeCurve 166 | { 167 | get => movementFade; 168 | set => movementFade = value; 169 | } 170 | 171 | public AnimationCurve RotationalFadeCurve 172 | { 173 | get => rotationalFade; 174 | set => rotationalFade = value; 175 | } 176 | 177 | public AnimationCurve TiltRangeTransition 178 | { 179 | get => tiltRangeTransition; 180 | set => tiltRangeTransition = value; 181 | } 182 | 183 | public AnimationCurve DynamicFieldOfViewTransition 184 | { 185 | get => dynamicFieldOfViewTransition; 186 | set => dynamicFieldOfViewTransition = value; 187 | } 188 | 189 | private void OnValidate() 190 | { 191 | // For axis-flipping reasons, the tilt ranges should remain within the -90 to 90 degrees range. 192 | tiltRangeHigh.Set(Mathf.Clamp(tiltRangeHigh.Min, -87.5f, 87.5f), Mathf.Clamp(tiltRangeHigh.Max, -87.5f, 87.5f)); 193 | tiltRangeLow.Set(Mathf.Clamp(tiltRangeLow.Min, -87.5f, 87.5f), Mathf.Clamp(tiltRangeLow.Max, -87.5f, 87.5f)); 194 | } 195 | 196 | /// 197 | public float EvaluateMovementFadeOut(float t) 198 | { 199 | return movementFade.Evaluate(t); 200 | } 201 | 202 | /// 203 | public float EvaluateRotationFadeOut(float t) 204 | { 205 | return rotationalFade.Evaluate(t); 206 | } 207 | 208 | /// 209 | public float EvaluateMovementTransition(float t) 210 | { 211 | return movementSpeedTransition.Evaluate(t); 212 | } 213 | 214 | /// 215 | public float EvaluateTiltTransition(float t) 216 | { 217 | return tiltRangeTransition.Evaluate(t); 218 | } 219 | 220 | /// 221 | public float EvaluateFieldOfViewTransition(float t) 222 | { 223 | return dynamicFieldOfViewTransition.Evaluate(t); 224 | } 225 | } 226 | } 227 | -------------------------------------------------------------------------------- /Packages/packages-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.impossibleodds.toolkit": { 4 | "version": "https://github.com/juniordiscart/ImpossibleOdds-Toolkit.git?path=/Assets/Impossible%20Odds/Toolkit", 5 | "depth": 0, 6 | "source": "git", 7 | "dependencies": {}, 8 | "hash": "29f658a6a0edc3ab2be2490845f8def10916d5bd" 9 | }, 10 | "com.unity.2d.sprite": { 11 | "version": "1.0.0", 12 | "depth": 0, 13 | "source": "builtin", 14 | "dependencies": {} 15 | }, 16 | "com.unity.2d.tilemap": { 17 | "version": "1.0.0", 18 | "depth": 0, 19 | "source": "builtin", 20 | "dependencies": {} 21 | }, 22 | "com.unity.cinemachine": { 23 | "version": "2.6.17", 24 | "depth": 0, 25 | "source": "registry", 26 | "dependencies": {}, 27 | "url": "https://packages.unity.com" 28 | }, 29 | "com.unity.ext.nunit": { 30 | "version": "1.0.6", 31 | "depth": 0, 32 | "source": "registry", 33 | "dependencies": {}, 34 | "url": "https://packages.unity.com" 35 | }, 36 | "com.unity.ide.rider": { 37 | "version": "3.0.31", 38 | "depth": 0, 39 | "source": "registry", 40 | "dependencies": { 41 | "com.unity.ext.nunit": "1.0.6" 42 | }, 43 | "url": "https://packages.unity.com" 44 | }, 45 | "com.unity.ide.visualstudio": { 46 | "version": "2.0.22", 47 | "depth": 0, 48 | "source": "registry", 49 | "dependencies": { 50 | "com.unity.test-framework": "1.1.9" 51 | }, 52 | "url": "https://packages.unity.com" 53 | }, 54 | "com.unity.polybrush": { 55 | "version": "1.0.2", 56 | "depth": 0, 57 | "source": "registry", 58 | "dependencies": { 59 | "com.unity.settings-manager": "1.0.3" 60 | }, 61 | "url": "https://packages.unity.com" 62 | }, 63 | "com.unity.postprocessing": { 64 | "version": "3.2.2", 65 | "depth": 0, 66 | "source": "registry", 67 | "dependencies": { 68 | "com.unity.modules.physics": "1.0.0" 69 | }, 70 | "url": "https://packages.unity.com" 71 | }, 72 | "com.unity.probuilder": { 73 | "version": "4.5.2", 74 | "depth": 0, 75 | "source": "registry", 76 | "dependencies": { 77 | "com.unity.settings-manager": "1.0.3" 78 | }, 79 | "url": "https://packages.unity.com" 80 | }, 81 | "com.unity.settings-manager": { 82 | "version": "1.0.3", 83 | "depth": 1, 84 | "source": "registry", 85 | "dependencies": {}, 86 | "url": "https://packages.unity.com" 87 | }, 88 | "com.unity.test-framework": { 89 | "version": "1.1.33", 90 | "depth": 0, 91 | "source": "registry", 92 | "dependencies": { 93 | "com.unity.ext.nunit": "1.0.6", 94 | "com.unity.modules.imgui": "1.0.0", 95 | "com.unity.modules.jsonserialize": "1.0.0" 96 | }, 97 | "url": "https://packages.unity.com" 98 | }, 99 | "com.unity.textmeshpro": { 100 | "version": "3.0.9", 101 | "depth": 0, 102 | "source": "registry", 103 | "dependencies": { 104 | "com.unity.ugui": "1.0.0" 105 | }, 106 | "url": "https://packages.unity.com" 107 | }, 108 | "com.unity.timeline": { 109 | "version": "1.4.8", 110 | "depth": 0, 111 | "source": "registry", 112 | "dependencies": { 113 | "com.unity.modules.director": "1.0.0", 114 | "com.unity.modules.animation": "1.0.0", 115 | "com.unity.modules.audio": "1.0.0", 116 | "com.unity.modules.particlesystem": "1.0.0" 117 | }, 118 | "url": "https://packages.unity.com" 119 | }, 120 | "com.unity.ugui": { 121 | "version": "1.0.0", 122 | "depth": 0, 123 | "source": "builtin", 124 | "dependencies": { 125 | "com.unity.modules.ui": "1.0.0", 126 | "com.unity.modules.imgui": "1.0.0" 127 | } 128 | }, 129 | "com.unity.modules.ai": { 130 | "version": "1.0.0", 131 | "depth": 0, 132 | "source": "builtin", 133 | "dependencies": {} 134 | }, 135 | "com.unity.modules.androidjni": { 136 | "version": "1.0.0", 137 | "depth": 0, 138 | "source": "builtin", 139 | "dependencies": {} 140 | }, 141 | "com.unity.modules.animation": { 142 | "version": "1.0.0", 143 | "depth": 0, 144 | "source": "builtin", 145 | "dependencies": {} 146 | }, 147 | "com.unity.modules.assetbundle": { 148 | "version": "1.0.0", 149 | "depth": 0, 150 | "source": "builtin", 151 | "dependencies": {} 152 | }, 153 | "com.unity.modules.audio": { 154 | "version": "1.0.0", 155 | "depth": 0, 156 | "source": "builtin", 157 | "dependencies": {} 158 | }, 159 | "com.unity.modules.cloth": { 160 | "version": "1.0.0", 161 | "depth": 0, 162 | "source": "builtin", 163 | "dependencies": { 164 | "com.unity.modules.physics": "1.0.0" 165 | } 166 | }, 167 | "com.unity.modules.director": { 168 | "version": "1.0.0", 169 | "depth": 0, 170 | "source": "builtin", 171 | "dependencies": { 172 | "com.unity.modules.audio": "1.0.0", 173 | "com.unity.modules.animation": "1.0.0" 174 | } 175 | }, 176 | "com.unity.modules.imageconversion": { 177 | "version": "1.0.0", 178 | "depth": 0, 179 | "source": "builtin", 180 | "dependencies": {} 181 | }, 182 | "com.unity.modules.imgui": { 183 | "version": "1.0.0", 184 | "depth": 0, 185 | "source": "builtin", 186 | "dependencies": {} 187 | }, 188 | "com.unity.modules.jsonserialize": { 189 | "version": "1.0.0", 190 | "depth": 0, 191 | "source": "builtin", 192 | "dependencies": {} 193 | }, 194 | "com.unity.modules.particlesystem": { 195 | "version": "1.0.0", 196 | "depth": 0, 197 | "source": "builtin", 198 | "dependencies": {} 199 | }, 200 | "com.unity.modules.physics": { 201 | "version": "1.0.0", 202 | "depth": 0, 203 | "source": "builtin", 204 | "dependencies": {} 205 | }, 206 | "com.unity.modules.physics2d": { 207 | "version": "1.0.0", 208 | "depth": 0, 209 | "source": "builtin", 210 | "dependencies": {} 211 | }, 212 | "com.unity.modules.screencapture": { 213 | "version": "1.0.0", 214 | "depth": 0, 215 | "source": "builtin", 216 | "dependencies": { 217 | "com.unity.modules.imageconversion": "1.0.0" 218 | } 219 | }, 220 | "com.unity.modules.subsystems": { 221 | "version": "1.0.0", 222 | "depth": 1, 223 | "source": "builtin", 224 | "dependencies": { 225 | "com.unity.modules.jsonserialize": "1.0.0" 226 | } 227 | }, 228 | "com.unity.modules.terrain": { 229 | "version": "1.0.0", 230 | "depth": 0, 231 | "source": "builtin", 232 | "dependencies": {} 233 | }, 234 | "com.unity.modules.terrainphysics": { 235 | "version": "1.0.0", 236 | "depth": 0, 237 | "source": "builtin", 238 | "dependencies": { 239 | "com.unity.modules.physics": "1.0.0", 240 | "com.unity.modules.terrain": "1.0.0" 241 | } 242 | }, 243 | "com.unity.modules.tilemap": { 244 | "version": "1.0.0", 245 | "depth": 0, 246 | "source": "builtin", 247 | "dependencies": { 248 | "com.unity.modules.physics2d": "1.0.0" 249 | } 250 | }, 251 | "com.unity.modules.ui": { 252 | "version": "1.0.0", 253 | "depth": 0, 254 | "source": "builtin", 255 | "dependencies": {} 256 | }, 257 | "com.unity.modules.uielements": { 258 | "version": "1.0.0", 259 | "depth": 0, 260 | "source": "builtin", 261 | "dependencies": { 262 | "com.unity.modules.ui": "1.0.0", 263 | "com.unity.modules.imgui": "1.0.0", 264 | "com.unity.modules.jsonserialize": "1.0.0", 265 | "com.unity.modules.uielementsnative": "1.0.0" 266 | } 267 | }, 268 | "com.unity.modules.uielementsnative": { 269 | "version": "1.0.0", 270 | "depth": 1, 271 | "source": "builtin", 272 | "dependencies": { 273 | "com.unity.modules.ui": "1.0.0", 274 | "com.unity.modules.imgui": "1.0.0", 275 | "com.unity.modules.jsonserialize": "1.0.0" 276 | } 277 | }, 278 | "com.unity.modules.umbra": { 279 | "version": "1.0.0", 280 | "depth": 0, 281 | "source": "builtin", 282 | "dependencies": {} 283 | }, 284 | "com.unity.modules.unityanalytics": { 285 | "version": "1.0.0", 286 | "depth": 0, 287 | "source": "builtin", 288 | "dependencies": { 289 | "com.unity.modules.unitywebrequest": "1.0.0", 290 | "com.unity.modules.jsonserialize": "1.0.0" 291 | } 292 | }, 293 | "com.unity.modules.unitywebrequest": { 294 | "version": "1.0.0", 295 | "depth": 0, 296 | "source": "builtin", 297 | "dependencies": {} 298 | }, 299 | "com.unity.modules.unitywebrequestassetbundle": { 300 | "version": "1.0.0", 301 | "depth": 0, 302 | "source": "builtin", 303 | "dependencies": { 304 | "com.unity.modules.assetbundle": "1.0.0", 305 | "com.unity.modules.unitywebrequest": "1.0.0" 306 | } 307 | }, 308 | "com.unity.modules.unitywebrequestaudio": { 309 | "version": "1.0.0", 310 | "depth": 0, 311 | "source": "builtin", 312 | "dependencies": { 313 | "com.unity.modules.unitywebrequest": "1.0.0", 314 | "com.unity.modules.audio": "1.0.0" 315 | } 316 | }, 317 | "com.unity.modules.unitywebrequesttexture": { 318 | "version": "1.0.0", 319 | "depth": 0, 320 | "source": "builtin", 321 | "dependencies": { 322 | "com.unity.modules.unitywebrequest": "1.0.0", 323 | "com.unity.modules.imageconversion": "1.0.0" 324 | } 325 | }, 326 | "com.unity.modules.unitywebrequestwww": { 327 | "version": "1.0.0", 328 | "depth": 0, 329 | "source": "builtin", 330 | "dependencies": { 331 | "com.unity.modules.unitywebrequest": "1.0.0", 332 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0", 333 | "com.unity.modules.unitywebrequestaudio": "1.0.0", 334 | "com.unity.modules.audio": "1.0.0", 335 | "com.unity.modules.assetbundle": "1.0.0", 336 | "com.unity.modules.imageconversion": "1.0.0" 337 | } 338 | }, 339 | "com.unity.modules.vehicles": { 340 | "version": "1.0.0", 341 | "depth": 0, 342 | "source": "builtin", 343 | "dependencies": { 344 | "com.unity.modules.physics": "1.0.0" 345 | } 346 | }, 347 | "com.unity.modules.video": { 348 | "version": "1.0.0", 349 | "depth": 0, 350 | "source": "builtin", 351 | "dependencies": { 352 | "com.unity.modules.audio": "1.0.0", 353 | "com.unity.modules.ui": "1.0.0", 354 | "com.unity.modules.unitywebrequest": "1.0.0" 355 | } 356 | }, 357 | "com.unity.modules.vr": { 358 | "version": "1.0.0", 359 | "depth": 0, 360 | "source": "builtin", 361 | "dependencies": { 362 | "com.unity.modules.jsonserialize": "1.0.0", 363 | "com.unity.modules.physics": "1.0.0", 364 | "com.unity.modules.xr": "1.0.0" 365 | } 366 | }, 367 | "com.unity.modules.wind": { 368 | "version": "1.0.0", 369 | "depth": 0, 370 | "source": "builtin", 371 | "dependencies": {} 372 | }, 373 | "com.unity.modules.xr": { 374 | "version": "1.0.0", 375 | "depth": 0, 376 | "source": "builtin", 377 | "dependencies": { 378 | "com.unity.modules.physics": "1.0.0", 379 | "com.unity.modules.jsonserialize": "1.0.0", 380 | "com.unity.modules.subsystems": "1.0.0" 381 | } 382 | } 383 | } 384 | } 385 | -------------------------------------------------------------------------------- /Assets/AssetStoreTools/AS_Checklist.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &-8320151262651604851 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: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 13 | m_Name: 14 | m_EditorClassIdentifier: 15 | Type: 2 16 | AssetPaths: [] 17 | Status: 0 18 | Active: 1 19 | Foldout: 0 20 | FoldoutMessage: 1 21 | FoldoutPaths: 1 22 | Failed: 0 23 | --- !u!114 &-7633213628076073766 24 | MonoBehaviour: 25 | m_ObjectHideFlags: 0 26 | m_CorrespondingSourceObject: {fileID: 0} 27 | m_PrefabInstance: {fileID: 0} 28 | m_PrefabAsset: {fileID: 0} 29 | m_GameObject: {fileID: 0} 30 | m_Enabled: 1 31 | m_EditorHideFlags: 0 32 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 33 | m_Name: 34 | m_EditorClassIdentifier: 35 | Type: 7 36 | AssetPaths: [] 37 | Status: 0 38 | Active: 1 39 | Foldout: 0 40 | FoldoutMessage: 1 41 | FoldoutPaths: 1 42 | Failed: 0 43 | --- !u!114 &-7574156237836053354 44 | MonoBehaviour: 45 | m_ObjectHideFlags: 0 46 | m_CorrespondingSourceObject: {fileID: 0} 47 | m_PrefabInstance: {fileID: 0} 48 | m_PrefabAsset: {fileID: 0} 49 | m_GameObject: {fileID: 0} 50 | m_Enabled: 1 51 | m_EditorHideFlags: 0 52 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 53 | m_Name: 54 | m_EditorClassIdentifier: 55 | Type: 18 56 | AssetPaths: [] 57 | Status: 0 58 | Active: 1 59 | Foldout: 0 60 | FoldoutMessage: 1 61 | FoldoutPaths: 1 62 | Failed: 0 63 | --- !u!114 &-7443238681858097840 64 | MonoBehaviour: 65 | m_ObjectHideFlags: 0 66 | m_CorrespondingSourceObject: {fileID: 0} 67 | m_PrefabInstance: {fileID: 0} 68 | m_PrefabAsset: {fileID: 0} 69 | m_GameObject: {fileID: 0} 70 | m_Enabled: 1 71 | m_EditorHideFlags: 0 72 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 73 | m_Name: 74 | m_EditorClassIdentifier: 75 | Type: 6 76 | AssetPaths: [] 77 | Status: 0 78 | Active: 1 79 | Foldout: 0 80 | FoldoutMessage: 1 81 | FoldoutPaths: 1 82 | Failed: 0 83 | --- !u!114 &-7277873233587642525 84 | MonoBehaviour: 85 | m_ObjectHideFlags: 0 86 | m_CorrespondingSourceObject: {fileID: 0} 87 | m_PrefabInstance: {fileID: 0} 88 | m_PrefabAsset: {fileID: 0} 89 | m_GameObject: {fileID: 0} 90 | m_Enabled: 1 91 | m_EditorHideFlags: 0 92 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 93 | m_Name: 94 | m_EditorClassIdentifier: 95 | Type: 4 96 | AssetPaths: [] 97 | Status: 0 98 | Active: 1 99 | Foldout: 0 100 | FoldoutMessage: 1 101 | FoldoutPaths: 1 102 | Failed: 0 103 | --- !u!114 &-7148152139656569484 104 | MonoBehaviour: 105 | m_ObjectHideFlags: 0 106 | m_CorrespondingSourceObject: {fileID: 0} 107 | m_PrefabInstance: {fileID: 0} 108 | m_PrefabAsset: {fileID: 0} 109 | m_GameObject: {fileID: 0} 110 | m_Enabled: 1 111 | m_EditorHideFlags: 0 112 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 113 | m_Name: 114 | m_EditorClassIdentifier: 115 | Type: 12 116 | AssetPaths: [] 117 | Status: 0 118 | Active: 1 119 | Foldout: 0 120 | FoldoutMessage: 1 121 | FoldoutPaths: 1 122 | Failed: 0 123 | --- !u!114 &-3833360957577182691 124 | MonoBehaviour: 125 | m_ObjectHideFlags: 0 126 | m_CorrespondingSourceObject: {fileID: 0} 127 | m_PrefabInstance: {fileID: 0} 128 | m_PrefabAsset: {fileID: 0} 129 | m_GameObject: {fileID: 0} 130 | m_Enabled: 1 131 | m_EditorHideFlags: 0 132 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 133 | m_Name: 134 | m_EditorClassIdentifier: 135 | Type: 16 136 | AssetPaths: [] 137 | Status: 0 138 | Active: 1 139 | Foldout: 0 140 | FoldoutMessage: 1 141 | FoldoutPaths: 1 142 | Failed: 0 143 | --- !u!114 &-676410885670167961 144 | MonoBehaviour: 145 | m_ObjectHideFlags: 0 146 | m_CorrespondingSourceObject: {fileID: 0} 147 | m_PrefabInstance: {fileID: 0} 148 | m_PrefabAsset: {fileID: 0} 149 | m_GameObject: {fileID: 0} 150 | m_Enabled: 1 151 | m_EditorHideFlags: 0 152 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 153 | m_Name: 154 | m_EditorClassIdentifier: 155 | Type: 5 156 | AssetPaths: [] 157 | Status: 0 158 | Active: 1 159 | Foldout: 0 160 | FoldoutMessage: 1 161 | FoldoutPaths: 1 162 | Failed: 0 163 | --- !u!114 &-279640358137010244 164 | MonoBehaviour: 165 | m_ObjectHideFlags: 0 166 | m_CorrespondingSourceObject: {fileID: 0} 167 | m_PrefabInstance: {fileID: 0} 168 | m_PrefabAsset: {fileID: 0} 169 | m_GameObject: {fileID: 0} 170 | m_Enabled: 1 171 | m_EditorHideFlags: 0 172 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 173 | m_Name: 174 | m_EditorClassIdentifier: 175 | Type: 9 176 | AssetPaths: [] 177 | Status: 0 178 | Active: 1 179 | Foldout: 0 180 | FoldoutMessage: 1 181 | FoldoutPaths: 1 182 | Failed: 0 183 | --- !u!114 &11400000 184 | MonoBehaviour: 185 | m_ObjectHideFlags: 0 186 | m_CorrespondingSourceObject: {fileID: 0} 187 | m_PrefabInstance: {fileID: 0} 188 | m_PrefabAsset: {fileID: 0} 189 | m_GameObject: {fileID: 0} 190 | m_Enabled: 1 191 | m_EditorHideFlags: 0 192 | m_Script: {fileID: -479656862, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 193 | m_Name: AS_Checklist 194 | m_EditorClassIdentifier: 195 | Checks: 196 | - {fileID: 456346594465095644} 197 | - {fileID: 1889594111042056909} 198 | - {fileID: -8320151262651604851} 199 | - {fileID: 6426823626630453586} 200 | - {fileID: -7277873233587642525} 201 | - {fileID: -676410885670167961} 202 | - {fileID: -7443238681858097840} 203 | - {fileID: -7633213628076073766} 204 | - {fileID: 5739989636629501915} 205 | - {fileID: -279640358137010244} 206 | - {fileID: 8925277276008609120} 207 | - {fileID: 1913392991685875321} 208 | - {fileID: -7148152139656569484} 209 | - {fileID: 8291935855860030230} 210 | - {fileID: 3462102506946625347} 211 | - {fileID: 5334270544845649277} 212 | - {fileID: -3833360957577182691} 213 | - {fileID: 5756999582058409876} 214 | - {fileID: -7574156237836053354} 215 | --- !u!114 &456346594465095644 216 | MonoBehaviour: 217 | m_ObjectHideFlags: 0 218 | m_CorrespondingSourceObject: {fileID: 0} 219 | m_PrefabInstance: {fileID: 0} 220 | m_PrefabAsset: {fileID: 0} 221 | m_GameObject: {fileID: 0} 222 | m_Enabled: 1 223 | m_EditorHideFlags: 0 224 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 225 | m_Name: 226 | m_EditorClassIdentifier: 227 | Type: 0 228 | AssetPaths: [] 229 | Status: 0 230 | Active: 1 231 | Foldout: 0 232 | FoldoutMessage: 1 233 | FoldoutPaths: 1 234 | Failed: 0 235 | --- !u!114 &1889594111042056909 236 | MonoBehaviour: 237 | m_ObjectHideFlags: 0 238 | m_CorrespondingSourceObject: {fileID: 0} 239 | m_PrefabInstance: {fileID: 0} 240 | m_PrefabAsset: {fileID: 0} 241 | m_GameObject: {fileID: 0} 242 | m_Enabled: 1 243 | m_EditorHideFlags: 0 244 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 245 | m_Name: 246 | m_EditorClassIdentifier: 247 | Type: 1 248 | AssetPaths: [] 249 | Status: 0 250 | Active: 1 251 | Foldout: 0 252 | FoldoutMessage: 1 253 | FoldoutPaths: 1 254 | Failed: 0 255 | --- !u!114 &1913392991685875321 256 | MonoBehaviour: 257 | m_ObjectHideFlags: 0 258 | m_CorrespondingSourceObject: {fileID: 0} 259 | m_PrefabInstance: {fileID: 0} 260 | m_PrefabAsset: {fileID: 0} 261 | m_GameObject: {fileID: 0} 262 | m_Enabled: 1 263 | m_EditorHideFlags: 0 264 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 265 | m_Name: 266 | m_EditorClassIdentifier: 267 | Type: 11 268 | AssetPaths: [] 269 | Status: 0 270 | Active: 1 271 | Foldout: 0 272 | FoldoutMessage: 1 273 | FoldoutPaths: 1 274 | Failed: 0 275 | --- !u!114 &3462102506946625347 276 | MonoBehaviour: 277 | m_ObjectHideFlags: 0 278 | m_CorrespondingSourceObject: {fileID: 0} 279 | m_PrefabInstance: {fileID: 0} 280 | m_PrefabAsset: {fileID: 0} 281 | m_GameObject: {fileID: 0} 282 | m_Enabled: 1 283 | m_EditorHideFlags: 0 284 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 285 | m_Name: 286 | m_EditorClassIdentifier: 287 | Type: 14 288 | AssetPaths: [] 289 | Status: 0 290 | Active: 1 291 | Foldout: 0 292 | FoldoutMessage: 1 293 | FoldoutPaths: 1 294 | Failed: 0 295 | --- !u!114 &5334270544845649277 296 | MonoBehaviour: 297 | m_ObjectHideFlags: 0 298 | m_CorrespondingSourceObject: {fileID: 0} 299 | m_PrefabInstance: {fileID: 0} 300 | m_PrefabAsset: {fileID: 0} 301 | m_GameObject: {fileID: 0} 302 | m_Enabled: 1 303 | m_EditorHideFlags: 0 304 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 305 | m_Name: 306 | m_EditorClassIdentifier: 307 | Type: 15 308 | AssetPaths: [] 309 | Status: 0 310 | Active: 1 311 | Foldout: 0 312 | FoldoutMessage: 1 313 | FoldoutPaths: 1 314 | Failed: 0 315 | --- !u!114 &5739989636629501915 316 | MonoBehaviour: 317 | m_ObjectHideFlags: 0 318 | m_CorrespondingSourceObject: {fileID: 0} 319 | m_PrefabInstance: {fileID: 0} 320 | m_PrefabAsset: {fileID: 0} 321 | m_GameObject: {fileID: 0} 322 | m_Enabled: 1 323 | m_EditorHideFlags: 0 324 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 325 | m_Name: 326 | m_EditorClassIdentifier: 327 | Type: 8 328 | AssetPaths: [] 329 | Status: 0 330 | Active: 1 331 | Foldout: 0 332 | FoldoutMessage: 1 333 | FoldoutPaths: 1 334 | Failed: 0 335 | --- !u!114 &5756999582058409876 336 | MonoBehaviour: 337 | m_ObjectHideFlags: 0 338 | m_CorrespondingSourceObject: {fileID: 0} 339 | m_PrefabInstance: {fileID: 0} 340 | m_PrefabAsset: {fileID: 0} 341 | m_GameObject: {fileID: 0} 342 | m_Enabled: 1 343 | m_EditorHideFlags: 0 344 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 345 | m_Name: 346 | m_EditorClassIdentifier: 347 | Type: 17 348 | AssetPaths: [] 349 | Status: 0 350 | Active: 1 351 | Foldout: 0 352 | FoldoutMessage: 1 353 | FoldoutPaths: 1 354 | Failed: 0 355 | --- !u!114 &6426823626630453586 356 | MonoBehaviour: 357 | m_ObjectHideFlags: 0 358 | m_CorrespondingSourceObject: {fileID: 0} 359 | m_PrefabInstance: {fileID: 0} 360 | m_PrefabAsset: {fileID: 0} 361 | m_GameObject: {fileID: 0} 362 | m_Enabled: 1 363 | m_EditorHideFlags: 0 364 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 365 | m_Name: 366 | m_EditorClassIdentifier: 367 | Type: 3 368 | AssetPaths: [] 369 | Status: 0 370 | Active: 1 371 | Foldout: 0 372 | FoldoutMessage: 1 373 | FoldoutPaths: 1 374 | Failed: 0 375 | --- !u!114 &8291935855860030230 376 | MonoBehaviour: 377 | m_ObjectHideFlags: 0 378 | m_CorrespondingSourceObject: {fileID: 0} 379 | m_PrefabInstance: {fileID: 0} 380 | m_PrefabAsset: {fileID: 0} 381 | m_GameObject: {fileID: 0} 382 | m_Enabled: 1 383 | m_EditorHideFlags: 0 384 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 385 | m_Name: 386 | m_EditorClassIdentifier: 387 | Type: 13 388 | AssetPaths: [] 389 | Status: 0 390 | Active: 1 391 | Foldout: 0 392 | FoldoutMessage: 1 393 | FoldoutPaths: 1 394 | Failed: 0 395 | --- !u!114 &8925277276008609120 396 | MonoBehaviour: 397 | m_ObjectHideFlags: 0 398 | m_CorrespondingSourceObject: {fileID: 0} 399 | m_PrefabInstance: {fileID: 0} 400 | m_PrefabAsset: {fileID: 0} 401 | m_GameObject: {fileID: 0} 402 | m_Enabled: 1 403 | m_EditorHideFlags: 0 404 | m_Script: {fileID: 1783199433, guid: e6c40bf0eb3fa3645aab7189973412db, type: 3} 405 | m_Name: 406 | m_EditorClassIdentifier: 407 | Type: 10 408 | AssetPaths: [] 409 | Status: 0 410 | Active: 1 411 | Foldout: 0 412 | FoldoutMessage: 1 413 | FoldoutPaths: 1 414 | Failed: 0 415 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Editor/TacticalCameraSettingsEditor.cs: -------------------------------------------------------------------------------- 1 | using UnityEditor; 2 | using UnityEngine; 3 | 4 | namespace ImpossibleOdds.TacticalCamera.Editor 5 | { 6 | [CustomEditor(typeof(TacticalCameraSettings))] 7 | public class TacticalCameraSettingsEditor : UnityEditor.Editor 8 | { 9 | private bool showGeneralSettings; 10 | private bool showMovementSettings; 11 | private bool showAltitudeSettings; 12 | private bool showRotationSettings; 13 | private bool showTiltSettings; 14 | private bool showFieldOfViewSettings; 15 | private bool showWorldInteractionSettings; 16 | 17 | public override void OnInspectorGUI() 18 | { 19 | SerializedObject settings = new SerializedObject(target); 20 | GUIStyle boldFoldout = new GUIStyle(EditorStyles.foldout) 21 | { 22 | fontStyle = FontStyle.Bold 23 | }; 24 | 25 | showGeneralSettings = EditorGUILayout.Foldout(showGeneralSettings, "Time settings", true, boldFoldout); 26 | 27 | if (showGeneralSettings) 28 | { 29 | EditorGUI.indentLevel++; 30 | EditorGUILayout.Space(); 31 | 32 | EditorGUILayout.LabelField("Ignore Time Scale", EditorStyles.boldLabel); 33 | EditorGUILayout.HelpBox("Should the camera continue to function regardless of the game's time scale?", MessageType.None); 34 | EditorGUILayout.PropertyField(settings.FindProperty(nameof(TacticalCameraSettings.ignoreTimeScale)), new GUIContent("Ignore time scale")); 35 | 36 | EditorGUI.indentLevel--; 37 | } 38 | 39 | EditorGUILayout.Space(); 40 | showMovementSettings = EditorGUILayout.Foldout(showMovementSettings, "Movement", true, boldFoldout); 41 | 42 | if (showMovementSettings) 43 | { 44 | EditorGUI.indentLevel++; 45 | EditorGUILayout.Space(); 46 | 47 | EditorGUILayout.LabelField("Speed", EditorStyles.boldLabel); 48 | EditorGUILayout.HelpBox("The camera can move at different speeds when it is low to the ground versus when it is high up. Set the speed range, and determine with the speed transition curve how this value range should be applied.", MessageType.None); 49 | 50 | EditorGUILayout.LabelField("Speed transition range"); 51 | EditorGUILayout.BeginHorizontal(); 52 | EditorGUI.indentLevel++; 53 | SerializedProperty speedRange = settings.FindProperty(nameof(TacticalCameraSettings.movementSpeedRange)); 54 | EditorGUILayout.PropertyField(speedRange.FindPropertyRelative(nameof(ValueRange.min)), new GUIContent("Low")); 55 | EditorGUILayout.PropertyField(speedRange.FindPropertyRelative(nameof(ValueRange.max)), new GUIContent("High")); 56 | EditorGUI.indentLevel--; 57 | EditorGUILayout.EndHorizontal(); 58 | 59 | EditorGUILayout.PropertyField(settings.FindProperty(nameof(TacticalCameraSettings.movementSpeedTransition)), new GUIContent("Speed transition curve")); 60 | 61 | EditorGUILayout.Space(); 62 | 63 | EditorGUILayout.LabelField("Fade-out", EditorStyles.boldLabel); 64 | EditorGUILayout.HelpBox("When no more movement input is given, the camera will smoothly come to a halt. Define the behaviour using a fade-out curve and time value.", MessageType.None); 65 | EditorGUILayout.PropertyField(settings.FindProperty(nameof(TacticalCameraSettings.movementFade)), new GUIContent("Speed fade-out curve")); 66 | EditorGUILayout.PropertyField(settings.FindProperty(nameof(TacticalCameraSettings.movementFadeTime)), new GUIContent("Speed fade-out time")); 67 | 68 | EditorGUILayout.Space(); 69 | 70 | EditorGUILayout.LabelField("Move to target", EditorStyles.boldLabel); 71 | EditorGUILayout.HelpBox("Define how fast the camera should move to a specific target position.", MessageType.None); 72 | EditorGUILayout.PropertyField(settings.FindProperty(nameof(TacticalCameraSettings.moveToTargetSmoothingTime)), new GUIContent("Move to target smooth time")); 73 | 74 | EditorGUI.indentLevel--; 75 | } 76 | 77 | EditorGUILayout.Space(); 78 | showRotationSettings = EditorGUILayout.Foldout(showRotationSettings, "Rotation", true, boldFoldout); 79 | 80 | if (showRotationSettings) 81 | { 82 | EditorGUI.indentLevel++; 83 | EditorGUILayout.Space(); 84 | 85 | EditorGUILayout.LabelField("Speed", EditorStyles.boldLabel); 86 | EditorGUILayout.HelpBox("Rotation speed is determined by an input factor, e.g. mouse or controller input. The value below will determine the maximum speed the camera can rotate.", MessageType.None); 87 | EditorGUILayout.PropertyField(settings.FindProperty(nameof(TacticalCameraSettings.maxRotationSpeed)), new GUIContent("Max rotational speed")); 88 | 89 | EditorGUILayout.Space(); 90 | 91 | EditorGUILayout.LabelField("Fade-out", EditorStyles.boldLabel); 92 | EditorGUILayout.HelpBox("When no more rotational input is given, the camera will smoothly come to a halt. Define the behaviour using a fade-out curve and time value.", MessageType.None); 93 | EditorGUILayout.PropertyField(settings.FindProperty(nameof(TacticalCameraSettings.rotationalFade)), new GUIContent("Rotational fade-out curve")); 94 | EditorGUILayout.PropertyField(settings.FindProperty(nameof(TacticalCameraSettings.rotationalFadeTime)), new GUIContent("Rotational fade-out time")); 95 | 96 | EditorGUILayout.Space(); 97 | 98 | EditorGUILayout.LabelField("Orbit versus pivot", EditorStyles.boldLabel); 99 | EditorGUILayout.HelpBox("The tactical camera can orbit around a point. However, if no suitable orbit point is found, is the camera allowed to pivot on its current location instead? Otherwise, no rotational action is taken.", MessageType.None); 100 | EditorGUILayout.PropertyField(settings.FindProperty(nameof(TacticalCameraSettings.allowPivotOnFailedOrbit)), new GUIContent("Allow pivot when no orbit point was found")); 101 | 102 | EditorGUI.indentLevel--; 103 | } 104 | 105 | EditorGUILayout.Space(); 106 | showAltitudeSettings = EditorGUILayout.Foldout(showAltitudeSettings, "Altitude operation", true, boldFoldout); 107 | 108 | if (showAltitudeSettings) 109 | { 110 | EditorGUI.indentLevel++; 111 | EditorGUILayout.Space(); 112 | 113 | EditorGUILayout.LabelField("Absolute altitude range", EditorStyles.boldLabel); 114 | EditorGUILayout.HelpBox("Define at what altitudes the camera is allowed to operate in. This range of values also drives the tilt and field-of-view settings.\n\nThese are expressed world-space units.", MessageType.None); 115 | EditorGUILayout.BeginHorizontal(); 116 | EditorGUI.indentLevel++; 117 | SerializedProperty heightRange = settings.FindProperty(nameof(TacticalCameraSettings.absoluteHeightRange)); 118 | EditorGUILayout.PropertyField(heightRange.FindPropertyRelative(nameof(ValueRange.min)), new GUIContent("Min")); 119 | EditorGUILayout.PropertyField(heightRange.FindPropertyRelative(nameof(ValueRange.max)), new GUIContent("Max")); 120 | EditorGUI.indentLevel--; 121 | EditorGUILayout.EndHorizontal(); 122 | 123 | EditorGUI.indentLevel--; 124 | } 125 | 126 | EditorGUILayout.Space(); 127 | showTiltSettings = EditorGUILayout.Foldout(showTiltSettings, "Tilt", true, boldFoldout); 128 | 129 | if (showTiltSettings) 130 | { 131 | EditorGUI.indentLevel++; 132 | EditorGUILayout.Space(); 133 | 134 | EditorGUILayout.LabelField("Tilt ranges", EditorStyles.boldLabel); 135 | EditorGUILayout.HelpBox("The camera can be allowed to tilt up and down in different ranges based on its altitude. The camera's forward vector leveled with the horizon is considered to be the zero-point.\n\nThe tilt transition curve defines how the camera transitions between these tilt ranges.", MessageType.None); 136 | EditorGUI.indentLevel++; 137 | EditorGUILayout.LabelField("Low tilt range"); 138 | EditorGUILayout.BeginHorizontal(); 139 | SerializedProperty tiltRangeLow = settings.FindProperty(nameof(TacticalCameraSettings.tiltRangeLow)); 140 | EditorGUILayout.PropertyField(tiltRangeLow.FindPropertyRelative(nameof(ValueRange.min)), new GUIContent("Min")); 141 | EditorGUILayout.PropertyField(tiltRangeLow.FindPropertyRelative(nameof(ValueRange.max)), new GUIContent("Max")); 142 | EditorGUILayout.EndHorizontal(); 143 | EditorGUILayout.LabelField("High tilt range"); 144 | EditorGUILayout.BeginHorizontal(); 145 | SerializedProperty tiltRangeHigh = settings.FindProperty(nameof(TacticalCameraSettings.tiltRangeHigh)); 146 | EditorGUILayout.PropertyField(tiltRangeHigh.FindPropertyRelative(nameof(ValueRange.min)), new GUIContent("Min")); 147 | EditorGUILayout.PropertyField(tiltRangeHigh.FindPropertyRelative(nameof(ValueRange.max)), new GUIContent("Max")); 148 | EditorGUILayout.EndHorizontal(); 149 | EditorGUI.indentLevel--; 150 | 151 | EditorGUILayout.PropertyField(settings.FindProperty(nameof(TacticalCameraSettings.tiltRangeTransition)), new GUIContent("Tilt transition curve")); 152 | 153 | EditorGUI.indentLevel--; 154 | } 155 | 156 | EditorGUILayout.Space(); 157 | showFieldOfViewSettings = EditorGUILayout.Foldout(showFieldOfViewSettings, "Field-of-view", true, boldFoldout); 158 | 159 | if (showFieldOfViewSettings) 160 | { 161 | EditorGUI.indentLevel++; 162 | EditorGUILayout.Space(); 163 | 164 | SerializedProperty useDynamicFoV = settings.FindProperty(nameof(TacticalCameraSettings.useDynamicFieldOfView)); 165 | EditorGUILayout.PropertyField(useDynamicFoV, new GUIContent("Enable dynamic field-of-view")); 166 | EditorGUILayout.HelpBox("The camera's field-of-view can change based on its current altitude.", MessageType.None); 167 | 168 | if (useDynamicFoV.boolValue) 169 | { 170 | EditorGUILayout.Space(); 171 | EditorGUILayout.LabelField("Field-of-view", EditorStyles.boldLabel); 172 | EditorGUILayout.HelpBox("Based on the camera's current altitude in the operational altitude range, the field-of-view can change based on the transition curve.", MessageType.None); 173 | 174 | EditorGUILayout.LabelField("Field-of-view transition range"); 175 | EditorGUILayout.BeginHorizontal(); 176 | EditorGUI.indentLevel++; 177 | SerializedProperty fovRange = settings.FindProperty(nameof(TacticalCameraSettings.dynamicFieldOfViewRange)); 178 | EditorGUILayout.PropertyField(fovRange.FindPropertyRelative(nameof(ValueRange.min)), new GUIContent("Min")); 179 | EditorGUILayout.PropertyField(fovRange.FindPropertyRelative(nameof(ValueRange.max)), new GUIContent("Max")); 180 | EditorGUI.indentLevel--; 181 | EditorGUILayout.EndHorizontal(); 182 | 183 | EditorGUILayout.PropertyField(settings.FindProperty(nameof(TacticalCameraSettings.dynamicFieldOfViewTransition)), new GUIContent("Field-of-view transition curve")); 184 | } 185 | 186 | EditorGUI.indentLevel--; 187 | } 188 | 189 | EditorGUILayout.Space(); 190 | showWorldInteractionSettings = EditorGUILayout.Foldout(showWorldInteractionSettings, "World interaction", true, boldFoldout); 191 | 192 | if (showWorldInteractionSettings) 193 | { 194 | EditorGUI.indentLevel++; 195 | EditorGUILayout.Space(); 196 | EditorGUILayout.HelpBox("The camera will require some limited interaction with the game world's colliders.", MessageType.None); 197 | EditorGUILayout.PropertyField(settings.FindProperty(nameof(TacticalCameraSettings.interactionMask)), new GUIContent("World interaction mask")); 198 | EditorGUILayout.HelpBox("The maximum length of a ray cast operation to determine a target position an orbital rotation point.", MessageType.None); 199 | EditorGUILayout.PropertyField(settings.FindProperty(nameof(TacticalCameraSettings.interactionDistance)), new GUIContent("Max ray casting distance")); 200 | EditorGUILayout.PropertyField(settings.FindProperty(nameof(TacticalCameraSettings.interactionBubbleRadius)), new GUIContent("Collision radius")); 201 | } 202 | 203 | settings.ApplyModifiedProperties(); 204 | } 205 | } 206 | } 207 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ![Impossible Odds Logo][Logo] Impossible Odds - Tactical Camera 2 | 3 | The Impossible Odds Tactical Camera package provides a plugin camera system for smoothly navigating your environments in both a top-down tactical view as well as up-close action scenes. 4 | 5 | You can expect to find the following set of features in this plugin: 6 | 7 | * Move the camera using the keyboard or screen edge detection, or double click to move to a target position. 8 | * Zoom in & out with a dynamic field of view to get a greater sense of scale. 9 | * Look around with restricted tilt angles, and orbit around a focus point. 10 | * Smooth collision detection with terrain and objects in your world. 11 | * Restricted area-of-operation to keep the camera inside the map boundaries. 12 | * Height-based parameters where the camera's behaviour changes based on its altitude. 13 | * Extensive customization of behaviour through simple animation curves. 14 | * Minimal setup and easy integration. 15 | 16 | You can view a quick demo video of this plugin below. 17 | 18 | [![Impossible Odds - Tactical Camera][Video]](http://www.youtube.com/watch?v=zZN0o4BFEZY "Impossible Odds - Tactical Camera") 19 | 20 | ## Prerequisites & Installation 21 | 22 | This package was developed on Unity 2020 LTS. So make sure you're on this version of Unity, or newer. 23 | 24 | Open Unity's package manager and add the following git-tracked URLs to your project: 25 | 26 | * C# Toolkit: 27 | > https://github.com/juniordiscart/ImpossibleOdds-Toolkit.git?path=/Assets/Impossible%20Odds/Toolkit 28 | 29 | * Tactical Camera: 30 | > https://github.com/juniordiscart/ImpossibleOdds-TacticalCamera.git?path=/Assets/Impossible%20Odds/TacticalCamera 31 | 32 | ## Quick Camera Setup 33 | 34 | If you want to get started quickly without being bothered with all the details, then follow these few steps: 35 | 36 | 1. Add the `TacticalCamera` component to your `Camera` game object. This will also add a `CharacterController` component to it. 37 | 2. Create a `TacticalCameraSettings` data object (Assets → Create → Impossible Odds → Tactical Camera → new Tactical Camera Settings) and assign it to the `Settings` property. You can play around with the different values to make it feel/behave differently. 38 | 3. Finally, add the `TacticalCameraInputProvider` component to the game object and assign it to the `Input Provider` property. Feel free to adjust the key bindings in a way that you see fit. 39 | 4. Optionally, add some bounds in which the camera is allowed to operate and assign it to the `Operational bounds` property. The `TacticalCameraBoxBounds` component restricts it to operate within the defined outline of the box. 40 | 41 | That's it! 42 | 43 | ![Quick Camera Setup][QuickSetup] 44 | 45 | **Note**: remember to check out the tooltips in the inspector if something is not clear! 46 | 47 | ## Detailed Camera Setup 48 | 49 | The Tactical Camera plugin has a central component that does all the heavy lifting: `TacticalCamera`. It will also add a `CharacterController` component on there which it uses to detect collisions as well as move smoothly over any terrain and objects. 50 | 51 | The component requires a few additional data objects to operate correctly: 52 | 53 | * An input provider to move and rotate in and around the environment, and 54 | * A settings object that defines how it operates/behaves, e.g. movement and rotation speed, tilt angles, etc. 55 | 56 | Optionally, the camera can also be equipped with a component that restricts its area of operation so that it can't move outside of your game world. 57 | 58 | ![Tactical Camera Component][TCComponent] 59 | 60 | ### Input Provider 61 | 62 | The input provider for the Tactical Camera instructs where the camera should move to and where to look at. Input is very project-dependent and there is no "one size fits all"-solution, e.g. mouse & keyboard versus gamepad versus touch screen, etc. That's why this camera is designed to be driven using an interface-component rather than forcing a single solution on you. However, a sample implementation of an input provider is given by the `TacticalCameraInputProvider` component. It's designed for use with mouse and keyboard and allows you to assign which keys and mouse axes should be used to control the movement and rotation. 63 | 64 | ![Input Provider][InputProvider] 65 | 66 | **Note**: remember to check out the tooltips in the inspector if something is not clear! 67 | 68 | #### Input Provider - Advanced 69 | 70 | The `ITacticalCameraInputProvider` interface is the key to hooking the Tactical Camera system in your custom input code. Either have your input object implement this interface as well to pass it along to the Tactical Camera directly, or provide an abstraction layer for this interface in your input code. 71 | 72 | The interface expects you to implement the following features: 73 | 74 | * Moving forward, sideways and upwards through the `MoveForward`, `MoveSideways` and `MoveUp` properties. These should return a value in the range of [-1, 1]. 75 | * Moving to a target position through the `MoveToTarget` and `CancelMoveToTarget` properties. These should return `true` when the action is requested, i.e. when a button is pressed down that frame. 76 | * Rotating around its pivot or focus point through the `TiltDelta` and `RotationDelta` properties. The `OrbitAroundTarget` is the switch between rotating around the pivot or focus point. As long as this last one keeps returning `true`, the Tactical Camera will orbit around the focal point rather than rotate around its pivot point. 77 | 78 | **Note**: the `ITacticalCameraInputProvider` interface in itself does not define which particular input method is used, e.g. moving using the keyboard versus the mouse cursor against the edge of the screen. The implementing class should define which methods are supported by way of returning appropriate values. 79 | 80 | ### Settings 81 | 82 | The Tactical Camera's behaviour is driven by a data object that tells it how fast it can move and rotate, as well as how smooth it comes to a standstill and how its movement is affected by altitude. The `TacticalCameraSettings` is the ScriptableObject that holds this data. It can be created through the Unity create menu: Assets → Create → Impossible Odds → Tactical Camera → new Tactical Camera Settings. 83 | 84 | You can adjust the values in this object to suit the environment the camera will operate in, but sensible default values have already been set for a small-to-medium sized map. This object operates using value ranges and animation curves. The choice for using animation curves allows to visually define how a specific value should fade out, or how a value should transition from one end to the other, e.g. the movement speed versus the altitude of the camera. 85 | 86 | The settings object also allows to set some world-interaction values which might be of particular interest for performance reasons: 87 | 88 | * The _World interaction mask_ (`InteractionMask`) property defines which collision layers are interacted with during raycast operations. This is best set to only layers that are of interest to the camera to interact with, i.e. your terrain and some world-objects. 89 | * The _Max ray casting distance_ (`InteractionDistance`) property defines the maximum length of raycasts used for interacting with your world. The larger this value, the further it has to check. Reduce this to a value that makes sense for your world setup. 90 | * The _Collision radius_ (`InteractionBubbleRadius`) defines the sphere in which the camera collides with objects in your world. This adjusts the `radius` property on the attached `CharacterController` component. 91 | 92 | ![Settings][SettingsWorldInteraction] 93 | 94 | **Note**: remember to check out the tooltips in the inspector if something is not clear! 95 | 96 | #### Settings - Advanced 97 | 98 | Compared to the input provision, this implementation of settings is immediately usable in a broad set of projects. Nonetheless, if you want to further alter or customize the behaviour, the `ITacticalCameraSettings` interface is what you should look into. 99 | 100 | This interface will ask you to implement the following: 101 | 102 | * The height limits in which the Tactical Camera is allowed to operate in through the `AbsoluteHeightRange` property. This is a range in which the camera will always be restricted to, even if there are operational bounds assigned with higher ceiling or lower floor values defined. 103 | * Movement behaviour through `MovementSpeedRange`, `MovementFadeTime` and `MoveToTargetSmoothingTime`. 104 | * Rotational behaviour through `MaxRotationalSpeed`, `RotationalFadeTime`, `TiltRangeLow` and `TiltRangeHigh`. These last two define what the angle ranges are for the Tactical Camera when its at its lowest and highest point, respectively. 105 | * Field of view settings through `UseDynamicFieldOfView` and `DynamicFieldOfViewRange`. 106 | * World interation settings through `InteractionMask`, `InteractionDistance` and `InteractionBubbleRadius`. 107 | * Several evaluation methods for custom fade-outs and transition curves. 108 | 109 | Most of these properties are self-explanatory, but the purpose of the _evaluation_ methods might not be immediately clear. Each of these methods take a `float` value as input in the range of [0, 1]. The output of these methods can be exactly the same as their input value in case a linear transition is desirable, but it can also be transformed to create a more pleasant looking/feeling result, e.g. a smooth roll-off in case of fading, or an ease-in, ease-out in case of transitions. In the implementation of `TacticalCameraSettings`, this is done by evaluating animation curves which naturally lend themselves to this. 110 | 111 | * `EvaluateMovementFadeOut` and `EvaluateRotationFadeOut` are fading methods that determine how the movement and rotation of the camera fade out when no more input is given. 112 | * `EvaluateMovementTransition`, `EvaluateTiltTransition` and `EvaluateFieldOfViewTransition` methods determine how the camera reacts to transitions in altitude. When the camera moves around, several values or value ranges may change in response to that, e.g. when higher up, the faster the camera can move around. 113 | 114 | ![Settings][SettingsFull] 115 | 116 | ### Area of Operation 117 | 118 | In most situations it's desirable to restrict the camera to a specific area so that it can't wander off in areas not meant for the player to visit. The Tactical Camera can be equipped with some bounds that force it to be in a particular area. 119 | 120 | How such an area is defined is very project-dependent and could become a complex matter. For example, polygonal level bounds in case the map is not just a square, or a fog-of-war restriction where undiscovered pieces of the map may not be accessible yet. 121 | 122 | To give a basic form of restriction already, the `TacticalCameraBoxBounds` component can restrict the Tactical Camera's position to a simple box. Whenever it tries to leave the area, its position is reset to the nearest valid location inside the box. The box bounds can be made to align and scale with the game object it is put on by ticking the _Follow Game Object_ toggle. 123 | 124 | The `TacticalCameraCompositeBounds` component can stitch together multiple bounds objects and make them act like a single one. You can include custom bounds implementations to the list as well! 125 | 126 | ![Box Bounds][BoxBounds] 127 | 128 | #### Area of Operation - Advanced 129 | 130 | To have the Tactical Camera be restricted to more complex areas, have your restriction tool implement the `ITacticalCameraBounds` interface with a couple of straightforward calls: 131 | 132 | * `void Apply(TacticalCamera)` should check on the camera's current position and place it back within the bounds if the camera is currently outside of them. 133 | * `Vector3 Apply(Vector3)` should check on the provided position and either return the same value when aleady within the bounds, or the closest point that lies within. 134 | * `bool IsWithinBounds(Vector3)` should simply check whether the provided position is within the bounds. 135 | 136 | ## Dependency Injection 137 | 138 | The external resources the Tactical Camera system requires to operate can all be assigned through Unity's inspector view or through your own scripts. Additionally, you can also have them delivered by the _Dependency Injection_ framework from the [Impossible Odds C# Toolkit][Toolkit]. It allows you to inject resources and values into objects that require them to operate, which makes managing resources in your project easier. 139 | 140 | The `TacticalCamera` component's properties for the input provider, settings and bounds are all marked for injection in case you prefer to work using this system as well. 141 | 142 | ## Gotcha's 143 | 144 | When using the Tactical Camera system you might run into a few limits of the system as well. You'll find them listed here: 145 | 146 | * The `z`-value of the local Euler rotation angle is always set to 0 at the end of its `LateUpdate` phase. This is to prevent drift and keeps the camera straight up. 147 | * The operating range of the tilt angle in the `TacticalCameraSettings` objects can be no larger than [-90, 90] degrees, with 0 degrees being level with the horizon. This range is defined to prevent flipping over. If you make a custom implementation through `ITacticalCameraSettings`, best to keep this in mind. 148 | 149 | ## Example 150 | 151 | Check out the demo scene for a complete setup and demonstration of how the camera behaves in different circumstances. This scene is setup using the dependency injection method, i.e. the resources the camera needs are injected upon Start from the `TacticalCameraDemo` component. 152 | 153 | ## Unity Version 154 | 155 | Developed and tested on Unity 2020.3 LTS. 156 | 157 | ## License 158 | 159 | This package is provided under the [MIT][License] license. 160 | 161 | [License]: ./LICENSE.md 162 | [Toolkit]: https://www.impossible-odds.net/csharp-toolkit 163 | [Video]: http://img.youtube.com/vi/zZN0o4BFEZY/0.jpg 164 | [Logo]: ./ImpossibleOddsLogo.png 165 | [QuickSetup]: ./Docs/Images/QuickSetup.png 166 | [TCComponent]: ./Docs/Images/TacticalCameraComponent.png 167 | [SettingsWorldInteraction]: ./Docs/Images/Settings_WorldInteraction.png 168 | [SettingsFull]: ./Docs/Images/Settings_Full.png 169 | [InputProvider]: ./Docs/Images/InputProvider.png 170 | [BoxBounds]: ./Docs/Images/BoxBounds.png 171 | -------------------------------------------------------------------------------- /Assets/Impossible Odds/TacticalCamera/Runtime/TacticalCamera.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using ImpossibleOdds.DependencyInjection; 5 | using UnityEngine; 6 | 7 | namespace ImpossibleOdds.TacticalCamera 8 | { 9 | [Injectable, RequireComponent(typeof(CharacterController), typeof(Camera))] 10 | public class TacticalCamera : MonoBehaviour 11 | { 12 | /// 13 | /// Called when no valid target position could be determined to move the camera to. 14 | /// 15 | public event Action onMoveToTargetFailed; 16 | 17 | [SerializeField, Tooltip("Initial settings if no other settings are provided through other means.")] 18 | internal TacticalCameraSettings initialSettings; 19 | [SerializeField, Tooltip("Initial input provider if no other input provider is provided through other means.")] 20 | internal AbstractTacticalCameraInputProvider initialInputProvider; 21 | [SerializeField, Tooltip("(Optional) - Initial camera bounds if no other bounds are provided through other means.")] 22 | internal AbstractTacticalCameraBounds initialCameraBounds; 23 | 24 | private ITacticalCameraSettings settings; 25 | 26 | private Transform cachedTransform; 27 | private Camera cachedCamera; 28 | private CharacterController characterController; 29 | 30 | private ValueRange operatingHeightRange; 31 | private ValueRange operatingTiltRange; 32 | private float tiltFactor; // Factor that keeps track of the tilt in the operating tilt range. For smooth angle adjustment when moving vertically. 33 | private float tiltLowSpeed; 34 | private float tiltHighSpeed; 35 | private float fovSpeed; 36 | 37 | private Coroutine moveToPositionHandle; 38 | 39 | private readonly FadeState moveForwardsState = new FadeState(); 40 | private readonly FadeState moveSidewaysState = new FadeState(); 41 | private readonly FadeState moveUpwardsState = new FadeState(); 42 | private readonly FadeState tiltState = new FadeState(); 43 | private readonly FadeState rotationState = new FadeState(); 44 | private List fadeStates; 45 | 46 | /// 47 | /// (Injectable) Settings that define how the camera should behave when moving or rotating. 48 | /// 49 | [Inject] 50 | public ITacticalCameraSettings Settings 51 | { 52 | get => settings; 53 | set => ApplySettings(value); 54 | } 55 | 56 | /// 57 | /// (Injectable) Input provider that should tell where the camera to move to or look at. 58 | /// 59 | [Inject] 60 | public ITacticalCameraInputProvider InputProvider 61 | { 62 | get; 63 | set; 64 | } 65 | 66 | /// 67 | /// (Injectable) Object that defines the positional bounds of the camera. 68 | /// If no bounds are set, then the camera can move anywhere. 69 | /// 70 | [Inject] 71 | public ITacticalCameraBounds Bounds 72 | { 73 | get; 74 | set; 75 | } 76 | 77 | /// 78 | /// Is the camera moving to a focus point. 79 | /// 80 | public bool IsMovingToFocusPoint => moveToPositionHandle != null; 81 | 82 | private float DeltaTime => settings.IgnoreTimeScale ? Time.unscaledDeltaTime : Time.deltaTime; 83 | private float TimeScaleFactor => settings.IgnoreTimeScale ? Time.timeScale : 1f; 84 | 85 | /// 86 | /// The current maximum movement speed of the camera based on its height. 87 | /// 88 | public float MaxMovementSpeed 89 | { 90 | get 91 | { 92 | if (settings == null) 93 | { 94 | return 0f; 95 | } 96 | 97 | float t = Mathf.Clamp01(operatingHeightRange.InverseLerp(CurrentHeight)); 98 | t = settings.EvaluateMovementTransition(t); 99 | return settings.MovementSpeedRange.Lerp(t); 100 | } 101 | } 102 | 103 | /// 104 | /// Shortcut to retrieve the y-value of the transform's position in world-space. 105 | /// 106 | public float CurrentHeight => cachedTransform.position.y; 107 | 108 | /// 109 | /// The current tilt angle. (In Degrees) 110 | /// Defines the tilt of the camera in the range [-180, 180], with 0 being level with the horizon. 111 | /// 112 | public float CurrentTiltAngle 113 | { 114 | get 115 | { 116 | Vector3 forward = cachedTransform.forward; 117 | Vector3 up = cachedTransform.up; 118 | float x = cachedTransform.localEulerAngles.x; 119 | 120 | // Depending on the quadrant the up-vector and forward-vector are, 121 | // a modifier is applied to map it between -180 and 180 degrees. 122 | if (forward.y <= 0) 123 | { 124 | return (up.y >= 0f) ? x : (180f - x); 125 | } 126 | 127 | return (up.y >= 0f) ? (x - 360f) : (180f - x); 128 | } 129 | private set 130 | { 131 | float tiltAngle = value; 132 | Vector3 forward = cachedTransform.forward; 133 | Vector3 up = cachedTransform.up; 134 | if (forward.y <= 0) 135 | { 136 | tiltAngle = (up.y >= 0f) ? tiltAngle : (180f + tiltAngle); 137 | } 138 | else 139 | { 140 | tiltAngle = (up.y >= 0f) ? (tiltAngle + 360f) : (180f + tiltAngle); 141 | } 142 | 143 | Vector3 localEulerAngles = cachedTransform.localEulerAngles; 144 | localEulerAngles.x = tiltAngle; 145 | cachedTransform.localEulerAngles = localEulerAngles; 146 | } 147 | } 148 | 149 | /// 150 | /// Moves the camera over to the target position. Note that the camera will only move over the XZ-plane. 151 | /// 152 | /// Target position for the camera to move to. 153 | public void MoveToTarget(Vector3 targetPosition) 154 | { 155 | CancelMoveToTarget(); // If it was running. 156 | moveToPositionHandle = StartCoroutine(RoutineMoveToTarget(targetPosition)); 157 | } 158 | 159 | /// 160 | /// Cancels the move-to-target routine, if it was running. 161 | /// 162 | public void CancelMoveToTarget() 163 | { 164 | if (moveToPositionHandle != null) 165 | { 166 | StopCoroutine(moveToPositionHandle); 167 | moveToPositionHandle = null; 168 | } 169 | } 170 | 171 | private void Awake() 172 | { 173 | characterController = GetComponent(); 174 | cachedCamera = GetComponent(); 175 | cachedTransform = transform; 176 | 177 | if ((settings == null) && (initialSettings != null)) 178 | { 179 | Settings = initialSettings; 180 | } 181 | 182 | if ((InputProvider == null) && (initialInputProvider != null)) 183 | { 184 | InputProvider = initialInputProvider; 185 | } 186 | 187 | if ((Bounds == null) && (initialCameraBounds != null)) 188 | { 189 | Bounds = initialCameraBounds; 190 | } 191 | 192 | fadeStates = new List() 193 | { 194 | moveForwardsState, 195 | moveSidewaysState, 196 | moveUpwardsState, 197 | tiltState, 198 | rotationState, 199 | }; 200 | } 201 | 202 | private void OnEnable() 203 | { 204 | if ((InputProvider == null) || (settings == null)) 205 | { 206 | return; 207 | } 208 | 209 | UpdateOperatingHeightRange(); 210 | UpdateOperatingTiltRange(); 211 | UpdateTiltFactor(); 212 | 213 | if (settings.UseDynamicFieldOfView) 214 | { 215 | float t = operatingHeightRange.InverseLerp(CurrentHeight); 216 | cachedCamera.fieldOfView = settings.DynamicFieldOfViewRange.Lerp(settings.EvaluateFieldOfViewTransition(t)); 217 | } 218 | } 219 | 220 | private void OnDisable() 221 | { 222 | // By setting the time to 0, we basically reset them. 223 | fadeStates.ForEach(fs => fs.Reset()); 224 | CancelMoveToTarget(); 225 | } 226 | 227 | private void LateUpdate() 228 | { 229 | if ((InputProvider == null) || (settings == null)) 230 | { 231 | return; 232 | } 233 | 234 | UpdateStates(); 235 | UpdateMovement(); 236 | UpdateBounds(); 237 | UpdateRotation(); 238 | 239 | MonitorTilt(); 240 | MonitorFieldOfView(); 241 | } 242 | 243 | private void ApplySettings(ITacticalCameraSettings settings) 244 | { 245 | this.settings?.PurgeDelegatesOf(this); 246 | this.settings = settings; 247 | 248 | if (settings == null) 249 | { 250 | return; 251 | } 252 | 253 | moveForwardsState.ApplySettings(settings.MovementFadeTime, settings.EvaluateMovementFadeOut, () => DeltaTime); 254 | moveSidewaysState.ApplySettings(settings.MovementFadeTime, settings.EvaluateMovementFadeOut, () => DeltaTime); 255 | moveUpwardsState.ApplySettings(settings.MovementFadeTime, settings.EvaluateMovementFadeOut, () => DeltaTime); 256 | tiltState.ApplySettings(settings.RotationalFadeTime, settings.EvaluateRotationFadeOut, () => DeltaTime); 257 | rotationState.ApplySettings(settings.RotationalFadeTime, settings.EvaluateRotationFadeOut, () => DeltaTime); 258 | characterController.radius = settings.InteractionBubbleRadius; 259 | characterController.height = settings.InteractionBubbleRadius; 260 | } 261 | 262 | private void UpdateStates() 263 | { 264 | if (InputProvider == null) 265 | { 266 | return; 267 | } 268 | 269 | // Movement 270 | UpdateState(InputProvider.MoveForward, moveForwardsState); 271 | UpdateState(InputProvider.MoveSideways, moveSidewaysState); 272 | UpdateState(InputProvider.MoveUp, moveUpwardsState); 273 | 274 | // Rotating 275 | UpdateState(InputProvider.TiltDelta, tiltState); 276 | UpdateState(InputProvider.RotationDelta, rotationState); 277 | } 278 | 279 | private void UpdateState(float inputValue, FadeState state) 280 | { 281 | if (Mathf.Approximately(inputValue, 0f)) 282 | { 283 | state.Tick(); 284 | } 285 | else 286 | { 287 | // If the outcome is not 0, then they are of opposite sign, and we substitute the new value, 288 | // or we check whether the new input is stronger than the current fading value. 289 | float value = state.Value; 290 | if (((Math.Sign(inputValue) + Math.Sign(value)) != 0) || (Mathf.Abs(inputValue) > Mathf.Abs(value))) 291 | { 292 | state.FadeValue = inputValue; 293 | } 294 | else 295 | { 296 | state.Tick(); 297 | } 298 | } 299 | } 300 | 301 | private void UpdateMovement() 302 | { 303 | // If moving to a focus point and the animation is requested to be cancelled. 304 | if ((moveToPositionHandle != null) && InputProvider.CancelMoveToTarget) 305 | { 306 | CancelMoveToTarget(); 307 | } 308 | else if (InputProvider.MoveToTarget) 309 | { 310 | MoveToTarget(); 311 | } 312 | 313 | Vector3 movement = Vector3.zero; 314 | 315 | // If the camera isn't moving towards its focus point, 316 | // then we apply the forward and sideways movement 317 | if (!IsMovingToFocusPoint) 318 | { 319 | Vector3 direction = Vector3.zero; 320 | if (moveForwardsState.IsActive) 321 | { 322 | Vector3 projectedForward = Vector3.ProjectOnPlane(cachedTransform.forward, Vector3.up).normalized; 323 | 324 | // If the projected forward vector is close to 0, then that means the camera is facing down, 325 | // Then we use the up-vector as an indicator to go forward. 326 | if (projectedForward.sqrMagnitude <= settings.Epsilon) 327 | { 328 | projectedForward = Vector3.ProjectOnPlane(cachedTransform.up, Vector3.up).normalized; 329 | } 330 | 331 | direction += projectedForward * moveForwardsState.Value; 332 | } 333 | 334 | if (moveSidewaysState.IsActive) 335 | { 336 | Vector3 projectedRight = Vector3.ProjectOnPlane(cachedTransform.right, Vector3.up).normalized; 337 | direction += projectedRight * moveSidewaysState.Value; 338 | } 339 | 340 | if (direction.sqrMagnitude > settings.Epsilon) 341 | { 342 | movement += direction.normalized * (MaxMovementSpeed * DeltaTime); 343 | } 344 | } 345 | 346 | // Vertical movement - zoom in/out 347 | if (moveUpwardsState.IsActive) 348 | { 349 | Vector3 direction = Vector3.up * moveUpwardsState.Value; 350 | if (direction.sqrMagnitude > settings.Epsilon) 351 | { 352 | movement += direction.normalized * (MaxMovementSpeed * DeltaTime); 353 | } 354 | } 355 | 356 | float distance = movement.magnitude; 357 | 358 | // If hardly any movement is generated, then it can stop here. 359 | // No need for advanced extra processing. 360 | if (distance < settings.Epsilon) 361 | { 362 | return; 363 | } 364 | 365 | // Restrict the height movement 366 | Vector3 position = cachedTransform.position; 367 | Vector3 targetPosition = position + movement; 368 | UpdateOperatingHeightRange(targetPosition); 369 | targetPosition.y = operatingHeightRange.Clamp(targetPosition.y); 370 | 371 | characterController.Move(targetPosition - position); 372 | } 373 | 374 | private void UpdateRotation() 375 | { 376 | if (rotationState.IsActive) 377 | { 378 | if (InputProvider.OrbitAroundTarget) 379 | { 380 | if (Physics.Raycast(cachedTransform.position, cachedTransform.forward, out RaycastHit hit, settings.InteractionDistance, settings.InteractionMask)) 381 | { 382 | cachedTransform.RotateAround(hit.point, Vector3.up, rotationState.Value * settings.MaxRotationalSpeed * DeltaTime); 383 | } 384 | else if (settings.AllowPivotOnFailedOrbit) 385 | { 386 | // Rotation - Rotate around the world up vector 387 | cachedTransform.Rotate(Vector3.up, rotationState.Value * settings.MaxRotationalSpeed * DeltaTime, Space.World); 388 | } 389 | } 390 | else 391 | { 392 | // Rotation - Rotate around the world up vector 393 | cachedTransform.Rotate(Vector3.up, rotationState.Value * settings.MaxRotationalSpeed * DeltaTime, Space.World); 394 | } 395 | } 396 | 397 | // Tilt - Rotate around the local right vector 398 | if (tiltState.IsActive) 399 | { 400 | float currentTiltAngle = CurrentTiltAngle; 401 | currentTiltAngle += tiltState.Value * settings.MaxRotationalSpeed * DeltaTime; 402 | if (!operatingTiltRange.InRange(currentTiltAngle)) 403 | { 404 | currentTiltAngle = operatingTiltRange.Clamp(currentTiltAngle); 405 | } 406 | 407 | CurrentTiltAngle = currentTiltAngle; 408 | UpdateTiltFactor(); 409 | } 410 | 411 | // Dirty fix for now: keep the z-value of the local Euler angles 0 to prevent drifting. 412 | Vector3 localEulerAngles = cachedTransform.localEulerAngles; 413 | localEulerAngles.z = 0f; 414 | cachedTransform.localEulerAngles = localEulerAngles; 415 | } 416 | 417 | private void UpdateOperatingHeightRange() 418 | { 419 | UpdateOperatingHeightRange(cachedTransform.position); 420 | } 421 | 422 | private void UpdateOperatingHeightRange(Vector3 origin) 423 | { 424 | float targetMin = settings.AbsoluteHeightRange.Min; 425 | float targetMax = settings.AbsoluteHeightRange.Max; 426 | 427 | // Define a possible height operational minimum. 428 | if (Physics.Raycast(origin, Vector3.down, out RaycastHit minHit, settings.AbsoluteHeightRange.Range, settings.InteractionMask)) 429 | { 430 | targetMin = Mathf.Max(minHit.point.y, targetMin); 431 | } 432 | 433 | // Define a possibly lower operational maximum. This one will most likely 434 | // never occur, unless we enter some kind of cave or structure with overhanging objects. 435 | if (Physics.Raycast(origin, Vector3.up, out RaycastHit maxHit, settings.AbsoluteHeightRange.Range, settings.InteractionMask)) 436 | { 437 | targetMax = Mathf.Min(maxHit.point.y, targetMax); 438 | } 439 | 440 | operatingHeightRange.Set(targetMin, targetMax); 441 | } 442 | 443 | private void UpdateOperatingTiltRange() 444 | { 445 | operatingTiltRange = ValueRange.Lerp(settings.TiltRangeLow, settings.TiltRangeHigh, operatingHeightRange.InverseLerp(CurrentHeight)); 446 | } 447 | 448 | private void UpdateBounds() 449 | { 450 | Bounds?.Apply(this); 451 | } 452 | 453 | private void UpdateTiltFactor() 454 | { 455 | tiltFactor = operatingTiltRange.InverseLerp(CurrentTiltAngle); 456 | } 457 | 458 | private void MonitorTilt() 459 | { 460 | // Adapt the operating tilt range based on the operating height range, and if it's 461 | // over its limits, then move it towards its target range. 462 | float t = operatingHeightRange.InverseLerp(CurrentHeight); 463 | t = Mathf.Clamp01(t); 464 | t = settings.EvaluateTiltTransition(t); 465 | ValueRange targetRange = ValueRange.Lerp(settings.TiltRangeLow, settings.TiltRangeHigh, t); 466 | operatingTiltRange.Set( 467 | Mathf.SmoothDampAngle(operatingTiltRange.Min, targetRange.Min, ref tiltLowSpeed, 0.2f * TimeScaleFactor), 468 | Mathf.SmoothDampAngle(operatingTiltRange.Max, targetRange.Max, ref tiltHighSpeed, 0.2f * TimeScaleFactor)); 469 | 470 | CurrentTiltAngle = operatingTiltRange.Lerp(tiltFactor); 471 | } 472 | 473 | private void MonitorFieldOfView() 474 | { 475 | if (!(settings is { UseDynamicFieldOfView: true })) 476 | { 477 | return; 478 | } 479 | 480 | float t = operatingHeightRange.InverseLerp(CurrentHeight); 481 | float target = settings.DynamicFieldOfViewRange.Lerp(settings.EvaluateFieldOfViewTransition(t)); 482 | cachedCamera.fieldOfView = Mathf.SmoothDamp(cachedCamera.fieldOfView, target, ref fovSpeed, 0.2f * TimeScaleFactor); 483 | } 484 | 485 | private void MoveToTarget() 486 | { 487 | Ray direction = cachedCamera.ScreenPointToRay(InputProvider.MousePosition); 488 | if (!Physics.Raycast(direction, out RaycastHit hitInfo, float.MaxValue, settings.InteractionMask, QueryTriggerInteraction.Ignore)) 489 | { 490 | onMoveToTargetFailed.InvokeIfNotNull(); 491 | return; 492 | } 493 | 494 | Vector3 targetPosition = hitInfo.point; 495 | MoveToTarget(targetPosition); 496 | } 497 | 498 | private IEnumerator RoutineMoveToTarget(Vector3 targetPosition) 499 | { 500 | Vector3 originalPosition = cachedTransform.position; 501 | float moveToTargetTime = settings.MoveToTargetSmoothingTime; 502 | float time = 0f; 503 | 504 | while (time < moveToTargetTime) 505 | { 506 | float t = Mathf.SmoothStep(0f, 1f, time / moveToTargetTime); 507 | 508 | targetPosition.y = CurrentHeight; 509 | originalPosition.y = CurrentHeight; 510 | 511 | characterController.Move(Vector3.Lerp(originalPosition, targetPosition, t) - cachedTransform.position); 512 | time += DeltaTime; 513 | 514 | yield return null; 515 | } 516 | 517 | targetPosition.y = CurrentHeight; 518 | characterController.Move(targetPosition - cachedTransform.position); 519 | moveToPositionHandle = null; 520 | } 521 | } 522 | } 523 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!129 &1 4 | PlayerSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 23 7 | productGUID: 8e3bc47487c7f4acaa831ae5b105d259 8 | AndroidProfiler: 0 9 | AndroidFilterTouchesWhenObscured: 0 10 | AndroidEnableSustainedPerformanceMode: 0 11 | defaultScreenOrientation: 4 12 | targetDevice: 2 13 | useOnDemandResources: 0 14 | accelerometerFrequency: 60 15 | companyName: DefaultCompany 16 | productName: CameraProject 17 | defaultCursor: {fileID: 0} 18 | cursorHotspot: {x: 0, y: 0} 19 | m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} 20 | m_ShowUnitySplashScreen: 1 21 | m_ShowUnitySplashLogo: 1 22 | m_SplashScreenOverlayOpacity: 1 23 | m_SplashScreenAnimation: 1 24 | m_SplashScreenLogoStyle: 1 25 | m_SplashScreenDrawMode: 0 26 | m_SplashScreenBackgroundAnimationZoom: 1 27 | m_SplashScreenLogoAnimationZoom: 1 28 | m_SplashScreenBackgroundLandscapeAspect: 1 29 | m_SplashScreenBackgroundPortraitAspect: 1 30 | m_SplashScreenBackgroundLandscapeUvs: 31 | serializedVersion: 2 32 | x: 0 33 | y: 0 34 | width: 1 35 | height: 1 36 | m_SplashScreenBackgroundPortraitUvs: 37 | serializedVersion: 2 38 | x: 0 39 | y: 0 40 | width: 1 41 | height: 1 42 | m_SplashScreenLogos: [] 43 | m_VirtualRealitySplashScreen: {fileID: 0} 44 | m_HolographicTrackingLossScreen: {fileID: 0} 45 | defaultScreenWidth: 1024 46 | defaultScreenHeight: 768 47 | defaultScreenWidthWeb: 960 48 | defaultScreenHeightWeb: 600 49 | m_StereoRenderingPath: 0 50 | m_ActiveColorSpace: 1 51 | m_MTRendering: 1 52 | mipStripping: 0 53 | numberOfMipsStripped: 0 54 | m_StackTraceTypes: 010000000100000001000000010000000100000001000000 55 | iosShowActivityIndicatorOnLoading: -1 56 | androidShowActivityIndicatorOnLoading: -1 57 | iosUseCustomAppBackgroundBehavior: 0 58 | iosAllowHTTPDownload: 1 59 | allowedAutorotateToPortrait: 1 60 | allowedAutorotateToPortraitUpsideDown: 1 61 | allowedAutorotateToLandscapeRight: 1 62 | allowedAutorotateToLandscapeLeft: 1 63 | useOSAutorotation: 1 64 | use32BitDisplayBuffer: 1 65 | preserveFramebufferAlpha: 0 66 | disableDepthAndStencilBuffers: 0 67 | androidStartInFullscreen: 1 68 | androidRenderOutsideSafeArea: 0 69 | androidUseSwappy: 0 70 | androidBlitType: 0 71 | androidResizableWindow: 0 72 | androidDefaultWindowWidth: 1920 73 | androidDefaultWindowHeight: 1080 74 | androidMinimumWindowWidth: 400 75 | androidMinimumWindowHeight: 300 76 | androidFullscreenMode: 1 77 | defaultIsNativeResolution: 1 78 | macRetinaSupport: 0 79 | runInBackground: 1 80 | captureSingleScreen: 0 81 | muteOtherAudioSources: 0 82 | Prepare IOS For Recording: 0 83 | Force IOS Speakers When Recording: 0 84 | deferSystemGesturesMode: 0 85 | hideHomeButton: 0 86 | submitAnalytics: 1 87 | usePlayerLog: 1 88 | bakeCollisionMeshes: 0 89 | forceSingleInstance: 0 90 | useFlipModelSwapchain: 1 91 | resizableWindow: 0 92 | useMacAppStoreValidation: 0 93 | macAppStoreCategory: public.app-category.games 94 | gpuSkinning: 0 95 | xboxPIXTextureCapture: 0 96 | xboxEnableAvatar: 0 97 | xboxEnableKinect: 0 98 | xboxEnableKinectAutoTracking: 0 99 | xboxEnableFitness: 0 100 | visibleInBackground: 0 101 | allowFullscreenSwitch: 1 102 | fullscreenMode: 1 103 | xboxSpeechDB: 0 104 | xboxEnableHeadOrientation: 0 105 | xboxEnableGuest: 0 106 | xboxEnablePIXSampling: 0 107 | metalFramebufferOnly: 0 108 | xboxOneResolution: 0 109 | xboxOneSResolution: 0 110 | xboxOneXResolution: 3 111 | xboxOneMonoLoggingLevel: 0 112 | xboxOneLoggingLevel: 1 113 | xboxOneDisableEsram: 0 114 | xboxOneEnableTypeOptimization: 0 115 | xboxOnePresentImmediateThreshold: 0 116 | switchQueueCommandMemory: 0 117 | switchQueueControlMemory: 16384 118 | switchQueueComputeMemory: 262144 119 | switchNVNShaderPoolsGranularity: 33554432 120 | switchNVNDefaultPoolsGranularity: 16777216 121 | switchNVNOtherPoolsGranularity: 16777216 122 | switchNVNMaxPublicTextureIDCount: 0 123 | switchNVNMaxPublicSamplerIDCount: 0 124 | stadiaPresentMode: 0 125 | stadiaTargetFramerate: 0 126 | vulkanNumSwapchainBuffers: 3 127 | vulkanEnableSetSRGBWrite: 0 128 | vulkanEnablePreTransform: 0 129 | vulkanEnableLateAcquireNextImage: 0 130 | vulkanEnableCommandBufferRecycling: 1 131 | m_SupportedAspectRatios: 132 | 4:3: 1 133 | 5:4: 1 134 | 16:10: 1 135 | 16:9: 1 136 | Others: 1 137 | bundleVersion: 1.0 138 | preloadedAssets: [] 139 | metroInputSource: 0 140 | wsaTransparentSwapchain: 0 141 | m_HolographicPauseOnTrackingLoss: 1 142 | xboxOneDisableKinectGpuReservation: 0 143 | xboxOneEnable7thCore: 0 144 | vrSettings: 145 | enable360StereoCapture: 0 146 | isWsaHolographicRemotingEnabled: 0 147 | enableFrameTimingStats: 0 148 | useHDRDisplay: 0 149 | D3DHDRBitDepth: 0 150 | m_ColorGamuts: 00000000 151 | targetPixelDensity: 30 152 | resolutionScalingMode: 0 153 | resetResolutionOnWindowResize: 0 154 | androidSupportedAspectRatio: 1 155 | androidMaxAspectRatio: 2.1 156 | applicationIdentifier: 157 | Standalone: com.DefaultCompany.CameraProject 158 | buildNumber: 159 | Standalone: 0 160 | iPhone: 0 161 | tvOS: 0 162 | overrideDefaultApplicationIdentifier: 0 163 | AndroidBundleVersionCode: 1 164 | AndroidMinSdkVersion: 19 165 | AndroidTargetSdkVersion: 0 166 | AndroidPreferredInstallLocation: 1 167 | aotOptions: 168 | stripEngineCode: 1 169 | iPhoneStrippingLevel: 0 170 | iPhoneScriptCallOptimization: 0 171 | ForceInternetPermission: 0 172 | ForceSDCardPermission: 0 173 | CreateWallpaper: 0 174 | APKExpansionFiles: 0 175 | keepLoadedShadersAlive: 0 176 | StripUnusedMeshComponents: 0 177 | VertexChannelCompressionMask: 214 178 | iPhoneSdkVersion: 988 179 | iOSTargetOSVersionString: 11.0 180 | tvOSSdkVersion: 0 181 | tvOSRequireExtendedGameController: 0 182 | tvOSTargetOSVersionString: 11.0 183 | uIPrerenderedIcon: 0 184 | uIRequiresPersistentWiFi: 0 185 | uIRequiresFullScreen: 1 186 | uIStatusBarHidden: 1 187 | uIExitOnSuspend: 0 188 | uIStatusBarStyle: 0 189 | appleTVSplashScreen: {fileID: 0} 190 | appleTVSplashScreen2x: {fileID: 0} 191 | tvOSSmallIconLayers: [] 192 | tvOSSmallIconLayers2x: [] 193 | tvOSLargeIconLayers: [] 194 | tvOSLargeIconLayers2x: [] 195 | tvOSTopShelfImageLayers: [] 196 | tvOSTopShelfImageLayers2x: [] 197 | tvOSTopShelfImageWideLayers: [] 198 | tvOSTopShelfImageWideLayers2x: [] 199 | iOSLaunchScreenType: 0 200 | iOSLaunchScreenPortrait: {fileID: 0} 201 | iOSLaunchScreenLandscape: {fileID: 0} 202 | iOSLaunchScreenBackgroundColor: 203 | serializedVersion: 2 204 | rgba: 0 205 | iOSLaunchScreenFillPct: 100 206 | iOSLaunchScreenSize: 100 207 | iOSLaunchScreenCustomXibPath: 208 | iOSLaunchScreeniPadType: 0 209 | iOSLaunchScreeniPadImage: {fileID: 0} 210 | iOSLaunchScreeniPadBackgroundColor: 211 | serializedVersion: 2 212 | rgba: 0 213 | iOSLaunchScreeniPadFillPct: 100 214 | iOSLaunchScreeniPadSize: 100 215 | iOSLaunchScreeniPadCustomXibPath: 216 | iOSLaunchScreenCustomStoryboardPath: 217 | iOSLaunchScreeniPadCustomStoryboardPath: 218 | iOSDeviceRequirements: [] 219 | iOSURLSchemes: [] 220 | iOSBackgroundModes: 0 221 | iOSMetalForceHardShadows: 0 222 | metalEditorSupport: 1 223 | metalAPIValidation: 1 224 | iOSRenderExtraFrameOnPause: 1 225 | iosCopyPluginsCodeInsteadOfSymlink: 0 226 | appleDeveloperTeamID: 227 | iOSManualSigningProvisioningProfileID: 228 | tvOSManualSigningProvisioningProfileID: 229 | iOSManualSigningProvisioningProfileType: 0 230 | tvOSManualSigningProvisioningProfileType: 0 231 | appleEnableAutomaticSigning: 0 232 | iOSRequireARKit: 0 233 | iOSAutomaticallyDetectAndAddCapabilities: 1 234 | appleEnableProMotion: 0 235 | shaderPrecisionModel: 0 236 | clonedFromGUID: e350e1905e77048bdb7ca5c5eca5ed2c 237 | templatePackageId: 238 | templateDefaultScene: 239 | useCustomMainManifest: 0 240 | useCustomLauncherManifest: 0 241 | useCustomMainGradleTemplate: 0 242 | useCustomLauncherGradleManifest: 0 243 | useCustomBaseGradleTemplate: 0 244 | useCustomGradlePropertiesTemplate: 0 245 | useCustomProguardFile: 0 246 | AndroidTargetArchitectures: 5 247 | AndroidTargetDevices: 0 248 | AndroidSplashScreenScale: 0 249 | androidSplashScreen: {fileID: 0} 250 | AndroidKeystoreName: '{inproject}: ' 251 | AndroidKeyaliasName: 252 | AndroidBuildApkPerCpuArchitecture: 0 253 | AndroidTVCompatibility: 1 254 | AndroidIsGame: 1 255 | AndroidEnableTango: 0 256 | androidEnableBanner: 1 257 | androidUseLowAccuracyLocation: 0 258 | androidUseCustomKeystore: 0 259 | m_AndroidBanners: 260 | - width: 320 261 | height: 180 262 | banner: {fileID: 0} 263 | androidGamepadSupportLevel: 0 264 | chromeosInputEmulation: 1 265 | AndroidMinifyWithR8: 0 266 | AndroidMinifyRelease: 0 267 | AndroidMinifyDebug: 0 268 | AndroidValidateAppBundleSize: 1 269 | AndroidAppBundleSizeToValidate: 150 270 | m_BuildTargetIcons: [] 271 | m_BuildTargetPlatformIcons: [] 272 | m_BuildTargetBatching: 273 | - m_BuildTarget: Standalone 274 | m_StaticBatching: 1 275 | m_DynamicBatching: 1 276 | m_BuildTargetGraphicsJobs: 277 | - m_BuildTarget: MacStandaloneSupport 278 | m_GraphicsJobs: 0 279 | - m_BuildTarget: Switch 280 | m_GraphicsJobs: 1 281 | - m_BuildTarget: MetroSupport 282 | m_GraphicsJobs: 1 283 | - m_BuildTarget: AppleTVSupport 284 | m_GraphicsJobs: 0 285 | - m_BuildTarget: BJMSupport 286 | m_GraphicsJobs: 1 287 | - m_BuildTarget: LinuxStandaloneSupport 288 | m_GraphicsJobs: 1 289 | - m_BuildTarget: PS4Player 290 | m_GraphicsJobs: 1 291 | - m_BuildTarget: iOSSupport 292 | m_GraphicsJobs: 0 293 | - m_BuildTarget: WindowsStandaloneSupport 294 | m_GraphicsJobs: 1 295 | - m_BuildTarget: XboxOnePlayer 296 | m_GraphicsJobs: 1 297 | - m_BuildTarget: LuminSupport 298 | m_GraphicsJobs: 0 299 | - m_BuildTarget: AndroidPlayer 300 | m_GraphicsJobs: 0 301 | - m_BuildTarget: WebGLSupport 302 | m_GraphicsJobs: 0 303 | m_BuildTargetGraphicsJobMode: 304 | - m_BuildTarget: PS4Player 305 | m_GraphicsJobMode: 0 306 | - m_BuildTarget: XboxOnePlayer 307 | m_GraphicsJobMode: 0 308 | m_BuildTargetGraphicsAPIs: 309 | - m_BuildTarget: MacStandaloneSupport 310 | m_APIs: 1000000011000000 311 | m_Automatic: 0 312 | - m_BuildTarget: WindowsStandaloneSupport 313 | m_APIs: 02000000 314 | m_Automatic: 1 315 | - m_BuildTarget: iOSSupport 316 | m_APIs: 10000000 317 | m_Automatic: 1 318 | m_BuildTargetVRSettings: [] 319 | openGLRequireES31: 0 320 | openGLRequireES31AEP: 0 321 | openGLRequireES32: 0 322 | m_TemplateCustomTags: {} 323 | mobileMTRendering: 324 | iPhone: 1 325 | tvOS: 1 326 | m_BuildTargetGroupLightmapEncodingQuality: 327 | - m_BuildTarget: Standalone 328 | m_EncodingQuality: 1 329 | - m_BuildTarget: XboxOne 330 | m_EncodingQuality: 1 331 | - m_BuildTarget: PS4 332 | m_EncodingQuality: 1 333 | m_BuildTargetGroupLightmapSettings: [] 334 | m_BuildTargetNormalMapEncoding: [] 335 | playModeTestRunnerEnabled: 0 336 | runPlayModeTestAsEditModeTest: 0 337 | actionOnDotNetUnhandledException: 1 338 | enableInternalProfiler: 0 339 | logObjCUncaughtExceptions: 1 340 | enableCrashReportAPI: 0 341 | cameraUsageDescription: 342 | locationUsageDescription: 343 | microphoneUsageDescription: 344 | bluetoothUsageDescription: 345 | switchNMETAOverride: 346 | switchNetLibKey: 347 | switchSocketMemoryPoolSize: 6144 348 | switchSocketAllocatorPoolSize: 128 349 | switchSocketConcurrencyLimit: 14 350 | switchScreenResolutionBehavior: 2 351 | switchUseCPUProfiler: 0 352 | switchUseGOLDLinker: 0 353 | switchApplicationID: 0x0005000C10000001 354 | switchNSODependencies: 355 | switchTitleNames_0: 356 | switchTitleNames_1: 357 | switchTitleNames_2: 358 | switchTitleNames_3: 359 | switchTitleNames_4: 360 | switchTitleNames_5: 361 | switchTitleNames_6: 362 | switchTitleNames_7: 363 | switchTitleNames_8: 364 | switchTitleNames_9: 365 | switchTitleNames_10: 366 | switchTitleNames_11: 367 | switchTitleNames_12: 368 | switchTitleNames_13: 369 | switchTitleNames_14: 370 | switchTitleNames_15: 371 | switchPublisherNames_0: 372 | switchPublisherNames_1: 373 | switchPublisherNames_2: 374 | switchPublisherNames_3: 375 | switchPublisherNames_4: 376 | switchPublisherNames_5: 377 | switchPublisherNames_6: 378 | switchPublisherNames_7: 379 | switchPublisherNames_8: 380 | switchPublisherNames_9: 381 | switchPublisherNames_10: 382 | switchPublisherNames_11: 383 | switchPublisherNames_12: 384 | switchPublisherNames_13: 385 | switchPublisherNames_14: 386 | switchPublisherNames_15: 387 | switchIcons_0: {fileID: 0} 388 | switchIcons_1: {fileID: 0} 389 | switchIcons_2: {fileID: 0} 390 | switchIcons_3: {fileID: 0} 391 | switchIcons_4: {fileID: 0} 392 | switchIcons_5: {fileID: 0} 393 | switchIcons_6: {fileID: 0} 394 | switchIcons_7: {fileID: 0} 395 | switchIcons_8: {fileID: 0} 396 | switchIcons_9: {fileID: 0} 397 | switchIcons_10: {fileID: 0} 398 | switchIcons_11: {fileID: 0} 399 | switchIcons_12: {fileID: 0} 400 | switchIcons_13: {fileID: 0} 401 | switchIcons_14: {fileID: 0} 402 | switchIcons_15: {fileID: 0} 403 | switchSmallIcons_0: {fileID: 0} 404 | switchSmallIcons_1: {fileID: 0} 405 | switchSmallIcons_2: {fileID: 0} 406 | switchSmallIcons_3: {fileID: 0} 407 | switchSmallIcons_4: {fileID: 0} 408 | switchSmallIcons_5: {fileID: 0} 409 | switchSmallIcons_6: {fileID: 0} 410 | switchSmallIcons_7: {fileID: 0} 411 | switchSmallIcons_8: {fileID: 0} 412 | switchSmallIcons_9: {fileID: 0} 413 | switchSmallIcons_10: {fileID: 0} 414 | switchSmallIcons_11: {fileID: 0} 415 | switchSmallIcons_12: {fileID: 0} 416 | switchSmallIcons_13: {fileID: 0} 417 | switchSmallIcons_14: {fileID: 0} 418 | switchSmallIcons_15: {fileID: 0} 419 | switchManualHTML: 420 | switchAccessibleURLs: 421 | switchLegalInformation: 422 | switchMainThreadStackSize: 1048576 423 | switchPresenceGroupId: 0x0005000C10000001 424 | switchLogoHandling: 0 425 | switchReleaseVersion: 0 426 | switchDisplayVersion: 1.0.0 427 | switchStartupUserAccount: 0 428 | switchTouchScreenUsage: 0 429 | switchSupportedLanguagesMask: 0 430 | switchLogoType: 0 431 | switchApplicationErrorCodeCategory: 432 | switchUserAccountSaveDataSize: 0 433 | switchUserAccountSaveDataJournalSize: 0 434 | switchApplicationAttribute: 0 435 | switchCardSpecSize: 4 436 | switchCardSpecClock: 25 437 | switchRatingsMask: 0 438 | switchRatingsInt_0: 0 439 | switchRatingsInt_1: 0 440 | switchRatingsInt_2: 0 441 | switchRatingsInt_3: 0 442 | switchRatingsInt_4: 0 443 | switchRatingsInt_5: 0 444 | switchRatingsInt_6: 0 445 | switchRatingsInt_7: 0 446 | switchRatingsInt_8: 0 447 | switchRatingsInt_9: 0 448 | switchRatingsInt_10: 0 449 | switchRatingsInt_11: 0 450 | switchRatingsInt_12: 0 451 | switchLocalCommunicationIds_0: 0x0005000C10000001 452 | switchLocalCommunicationIds_1: 453 | switchLocalCommunicationIds_2: 454 | switchLocalCommunicationIds_3: 455 | switchLocalCommunicationIds_4: 456 | switchLocalCommunicationIds_5: 457 | switchLocalCommunicationIds_6: 458 | switchLocalCommunicationIds_7: 459 | switchParentalControl: 0 460 | switchAllowsScreenshot: 1 461 | switchAllowsVideoCapturing: 1 462 | switchAllowsRuntimeAddOnContentInstall: 0 463 | switchDataLossConfirmation: 0 464 | switchUserAccountLockEnabled: 0 465 | switchSystemResourceMemory: 16777216 466 | switchSupportedNpadStyles: 3 467 | switchNativeFsCacheSize: 32 468 | switchIsHoldTypeHorizontal: 0 469 | switchSupportedNpadCount: 8 470 | switchSocketConfigEnabled: 0 471 | switchTcpInitialSendBufferSize: 32 472 | switchTcpInitialReceiveBufferSize: 64 473 | switchTcpAutoSendBufferSizeMax: 256 474 | switchTcpAutoReceiveBufferSizeMax: 256 475 | switchUdpSendBufferSize: 9 476 | switchUdpReceiveBufferSize: 42 477 | switchSocketBufferEfficiency: 4 478 | switchSocketInitializeEnabled: 1 479 | switchNetworkInterfaceManagerInitializeEnabled: 1 480 | switchPlayerConnectionEnabled: 1 481 | switchUseNewStyleFilepaths: 0 482 | switchUseLegacyFmodPriorities: 1 483 | switchUseMicroSleepForYield: 1 484 | switchEnableRamDiskSupport: 0 485 | switchMicroSleepForYieldTime: 25 486 | switchRamDiskSpaceSize: 12 487 | ps4NPAgeRating: 12 488 | ps4NPTitleSecret: 489 | ps4NPTrophyPackPath: 490 | ps4ParentalLevel: 1 491 | ps4ContentID: ED1633-NPXX51362_00-0000000000000000 492 | ps4Category: 0 493 | ps4MasterVersion: 01.00 494 | ps4AppVersion: 01.00 495 | ps4AppType: 0 496 | ps4ParamSfxPath: 497 | ps4VideoOutPixelFormat: 0 498 | ps4VideoOutInitialWidth: 1920 499 | ps4VideoOutBaseModeInitialWidth: 1920 500 | ps4VideoOutReprojectionRate: 120 501 | ps4PronunciationXMLPath: 502 | ps4PronunciationSIGPath: 503 | ps4BackgroundImagePath: 504 | ps4StartupImagePath: 505 | ps4StartupImagesFolder: 506 | ps4IconImagesFolder: 507 | ps4SaveDataImagePath: 508 | ps4SdkOverride: 509 | ps4BGMPath: 510 | ps4ShareFilePath: 511 | ps4ShareOverlayImagePath: 512 | ps4PrivacyGuardImagePath: 513 | ps4ExtraSceSysFile: 514 | ps4NPtitleDatPath: 515 | ps4RemotePlayKeyAssignment: -1 516 | ps4RemotePlayKeyMappingDir: 517 | ps4PlayTogetherPlayerCount: 0 518 | ps4EnterButtonAssignment: 1 519 | ps4ApplicationParam1: 0 520 | ps4ApplicationParam2: 0 521 | ps4ApplicationParam3: 0 522 | ps4ApplicationParam4: 0 523 | ps4DownloadDataSize: 0 524 | ps4GarlicHeapSize: 2048 525 | ps4ProGarlicHeapSize: 2560 526 | playerPrefsMaxSize: 32768 527 | ps4Passcode: 5PN2qmWqBlQ9wQj99nsQzldVI5ZuGXbE 528 | ps4pnSessions: 1 529 | ps4pnPresence: 1 530 | ps4pnFriends: 1 531 | ps4pnGameCustomData: 1 532 | playerPrefsSupport: 0 533 | enableApplicationExit: 0 534 | resetTempFolder: 1 535 | restrictedAudioUsageRights: 0 536 | ps4UseResolutionFallback: 0 537 | ps4ReprojectionSupport: 0 538 | ps4UseAudio3dBackend: 0 539 | ps4UseLowGarlicFragmentationMode: 1 540 | ps4SocialScreenEnabled: 0 541 | ps4ScriptOptimizationLevel: 3 542 | ps4Audio3dVirtualSpeakerCount: 14 543 | ps4attribCpuUsage: 0 544 | ps4PatchPkgPath: 545 | ps4PatchLatestPkgPath: 546 | ps4PatchChangeinfoPath: 547 | ps4PatchDayOne: 0 548 | ps4attribUserManagement: 0 549 | ps4attribMoveSupport: 0 550 | ps4attrib3DSupport: 0 551 | ps4attribShareSupport: 0 552 | ps4attribExclusiveVR: 0 553 | ps4disableAutoHideSplash: 0 554 | ps4videoRecordingFeaturesUsed: 0 555 | ps4contentSearchFeaturesUsed: 0 556 | ps4CompatibilityPS5: 0 557 | ps4AllowPS5Detection: 0 558 | ps4GPU800MHz: 1 559 | ps4attribEyeToEyeDistanceSettingVR: 0 560 | ps4IncludedModules: [] 561 | ps4attribVROutputEnabled: 0 562 | monoEnv: 563 | splashScreenBackgroundSourceLandscape: {fileID: 0} 564 | splashScreenBackgroundSourcePortrait: {fileID: 0} 565 | blurSplashScreenBackground: 1 566 | spritePackerPolicy: 567 | webGLMemorySize: 256 568 | webGLExceptionSupport: 1 569 | webGLNameFilesAsHashes: 0 570 | webGLDataCaching: 0 571 | webGLDebugSymbols: 0 572 | webGLEmscriptenArgs: 573 | webGLModulesDirectory: 574 | webGLTemplate: APPLICATION:Default 575 | webGLAnalyzeBuildSize: 0 576 | webGLUseEmbeddedResources: 0 577 | webGLCompressionFormat: 1 578 | webGLWasmArithmeticExceptions: 0 579 | webGLLinkerTarget: 0 580 | webGLThreadsSupport: 0 581 | webGLDecompressionFallback: 0 582 | scriptingDefineSymbols: 583 | 1: UNITY_POST_PROCESSING_STACK_V1;UNITY_POST_PROCESSING_STACK_V2;PROBUILDER_FBX_ENABLED;IMPOSSIBLE_ODDS_LOGGING_EDITOR_INFO;IMPOSSIBLE_ODDS_LOGGING_INFO 584 | 4: UNITY_POST_PROCESSING_STACK_V2;PROBUILDER_FBX_ENABLED 585 | 7: UNITY_POST_PROCESSING_STACK_V2;PROBUILDER_FBX_ENABLED 586 | 13: UNITY_POST_PROCESSING_STACK_V2;PROBUILDER_FBX_ENABLED 587 | 14: UNITY_POST_PROCESSING_STACK_V2 588 | 17: UNITY_POST_PROCESSING_STACK_V2;PROBUILDER_FBX_ENABLED 589 | 18: UNITY_POST_PROCESSING_STACK_V2;PROBUILDER_FBX_ENABLED 590 | 19: UNITY_POST_PROCESSING_STACK_V2;PROBUILDER_FBX_ENABLED 591 | 20: UNITY_POST_PROCESSING_STACK_V2;PROBUILDER_FBX_ENABLED 592 | 21: UNITY_POST_PROCESSING_STACK_V2;PROBUILDER_FBX_ENABLED 593 | 22: UNITY_POST_PROCESSING_STACK_V2;PROBUILDER_FBX_ENABLED 594 | 23: UNITY_POST_PROCESSING_STACK_V2;PROBUILDER_FBX_ENABLED 595 | 24: UNITY_POST_PROCESSING_STACK_V2;PROBUILDER_FBX_ENABLED 596 | 25: UNITY_POST_PROCESSING_STACK_V2;PROBUILDER_FBX_ENABLED 597 | 26: UNITY_POST_PROCESSING_STACK_V2;PROBUILDER_FBX_ENABLED 598 | 27: UNITY_POST_PROCESSING_STACK_V2;PROBUILDER_FBX_ENABLED 599 | 28: UNITY_POST_PROCESSING_STACK_V2 600 | 29: UNITY_POST_PROCESSING_STACK_V2 601 | 30: UNITY_POST_PROCESSING_STACK_V2 602 | 32: UNITY_POST_PROCESSING_STACK_V2 603 | 33: UNITY_POST_PROCESSING_STACK_V2 604 | additionalCompilerArguments: {} 605 | platformArchitecture: {} 606 | scriptingBackend: {} 607 | il2cppCompilerConfiguration: {} 608 | managedStrippingLevel: {} 609 | incrementalIl2cppBuild: {} 610 | suppressCommonWarnings: 1 611 | allowUnsafeCode: 0 612 | useDeterministicCompilation: 1 613 | useReferenceAssemblies: 1 614 | enableRoslynAnalyzers: 1 615 | additionalIl2CppArgs: 616 | scriptingRuntimeVersion: 1 617 | gcIncremental: 0 618 | assemblyVersionValidation: 1 619 | gcWBarrierValidation: 0 620 | apiCompatibilityLevelPerPlatform: 621 | Standalone: 6 622 | m_RenderingPath: 1 623 | m_MobileRenderingPath: 1 624 | metroPackageName: Platformer3DClient 625 | metroPackageVersion: 626 | metroCertificatePath: 627 | metroCertificatePassword: 628 | metroCertificateSubject: 629 | metroCertificateIssuer: 630 | metroCertificateNotAfter: 0000000000000000 631 | metroApplicationDescription: Platformer3DClient 632 | wsaImages: {} 633 | metroTileShortName: 634 | metroTileShowName: 0 635 | metroMediumTileShowName: 0 636 | metroLargeTileShowName: 0 637 | metroWideTileShowName: 0 638 | metroSupportStreamingInstall: 0 639 | metroLastRequiredScene: 0 640 | metroDefaultTileSize: 1 641 | metroTileForegroundText: 2 642 | metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} 643 | metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, 644 | a: 1} 645 | metroSplashScreenUseBackgroundColor: 0 646 | platformCapabilities: {} 647 | metroTargetDeviceFamilies: {} 648 | metroFTAName: 649 | metroFTAFileTypes: [] 650 | metroProtocolName: 651 | vcxProjDefaultLanguage: 652 | XboxOneProductId: 653 | XboxOneUpdateKey: 654 | XboxOneSandboxId: 655 | XboxOneContentId: 656 | XboxOneTitleId: 657 | XboxOneSCId: 658 | XboxOneGameOsOverridePath: 659 | XboxOnePackagingOverridePath: 660 | XboxOneAppManifestOverridePath: 661 | XboxOneVersion: 1.0.0.0 662 | XboxOnePackageEncryption: 0 663 | XboxOnePackageUpdateGranularity: 2 664 | XboxOneDescription: 665 | XboxOneLanguage: 666 | - enus 667 | XboxOneCapability: [] 668 | XboxOneGameRating: {} 669 | XboxOneIsContentPackage: 0 670 | XboxOneEnhancedXboxCompatibilityMode: 0 671 | XboxOneEnableGPUVariability: 0 672 | XboxOneSockets: {} 673 | XboxOneSplashScreen: {fileID: 0} 674 | XboxOneAllowedProductIds: [] 675 | XboxOnePersistentLocalStorageSize: 0 676 | XboxOneXTitleMemory: 8 677 | XboxOneOverrideIdentityName: 678 | XboxOneOverrideIdentityPublisher: 679 | vrEditorSettings: {} 680 | cloudServicesEnabled: 681 | Build: 1 682 | UNet: 1 683 | luminIcon: 684 | m_Name: 685 | m_ModelFolderPath: 686 | m_PortalFolderPath: 687 | luminCert: 688 | m_CertPath: 689 | m_SignPackage: 1 690 | luminIsChannelApp: 0 691 | luminVersion: 692 | m_VersionCode: 1 693 | m_VersionName: 694 | apiCompatibilityLevel: 6 695 | activeInputHandler: 0 696 | windowsGamepadBackendHint: 0 697 | cloudProjectId: 698 | framebufferDepthMemorylessMode: 0 699 | qualitySettingsNames: [] 700 | projectName: Platformer3DClient 701 | organizationId: 702 | cloudEnabled: 0 703 | legacyClampBlendShapeWeights: 1 704 | virtualTexturingSupportEnabled: 0 705 | --------------------------------------------------------------------------------