├── .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 |
--------------------------------------------------------------------------------