├── .github
├── AAR Source (Android)
│ ├── proguard.txt
│ ├── AndroidManifest.xml
│ └── java
│ │ └── com
│ │ └── yasirkula
│ │ └── unity
│ │ ├── DebugConsoleLogcatLogReceiver.java
│ │ ├── DebugConsole.java
│ │ └── DebugConsoleLogcatLogger.java
├── Images
│ ├── 1.png
│ ├── 2.png
│ └── 3.png
└── README.md
├── Plugins
├── IngameDebugConsole
│ ├── Sprites
│ │ ├── IconHide.psd
│ │ ├── IconInfo.psd
│ │ ├── IconClear.psd
│ │ ├── IconError.psd
│ │ ├── SearchIcon.psd
│ │ ├── IconCollapse.psd
│ │ ├── IconWarning.psd
│ │ ├── IconSnapToBottom.psd
│ │ ├── IconSnapToBottomBg.psd
│ │ ├── SlicedBackground.psd
│ │ ├── SlicedBackground2.psd
│ │ ├── SlicedBackground3.psd
│ │ ├── IconResizeAllDirections.psd
│ │ ├── IconResizeVertialOnly.psd
│ │ ├── Unused
│ │ │ ├── IconErrorHighRes.psd
│ │ │ ├── IconInfoHighRes.psd
│ │ │ ├── IconWarningHighRes.psd
│ │ │ ├── IconErrorHighRes.psd.meta
│ │ │ ├── IconInfoHighRes.psd.meta
│ │ │ └── IconWarningHighRes.psd.meta
│ │ ├── Unused.meta
│ │ ├── IngameDebugConsoleSpriteAtlas.spriteatlas.meta
│ │ ├── IconError.psd.meta
│ │ ├── IconHide.psd.meta
│ │ ├── IconInfo.psd.meta
│ │ ├── IconCollapse.psd.meta
│ │ ├── IconWarning.psd.meta
│ │ ├── IconSnapToBottom.psd.meta
│ │ ├── IconResizeAllDirections.psd.meta
│ │ ├── IconResizeVertialOnly.psd.meta
│ │ ├── IconSnapToBottomBg.psd.meta
│ │ ├── SlicedBackground2.psd.meta
│ │ ├── SlicedBackground3.psd.meta
│ │ ├── IconClear.psd.meta
│ │ ├── SearchIcon.psd.meta
│ │ ├── SlicedBackground.psd.meta
│ │ └── IngameDebugConsoleSpriteAtlas.spriteatlas
│ ├── Android
│ │ ├── IngameDebugConsole.aar
│ │ ├── DebugLogLogcatListener.cs.meta
│ │ ├── IngameDebugConsole.aar.meta
│ │ └── DebugLogLogcatListener.cs
│ ├── README.txt.meta
│ ├── Scripts
│ │ ├── Attributes.meta
│ │ ├── DebugLogItemCopyWebGL.cs.meta
│ │ ├── Attributes
│ │ │ ├── ConsoleAttribute.cs.meta
│ │ │ ├── ConsoleCustomTypeParserAttribute.cs.meta
│ │ │ ├── ConsoleMethodAttribute.cs.meta
│ │ │ ├── ConsoleAttribute.cs
│ │ │ ├── ConsoleCustomTypeParserAttribute.cs
│ │ │ └── ConsoleMethodAttribute.cs
│ │ ├── CopyLogsOnResizeButtonClick.cs.meta
│ │ ├── CircularBuffer.cs.meta
│ │ ├── DebugLogConsole.cs.meta
│ │ ├── DebugLogEntry.cs.meta
│ │ ├── DebugLogItem.cs.meta
│ │ ├── DebugLogPopup.cs.meta
│ │ ├── DebugLogManager.cs.meta
│ │ ├── EventSystemHandler.cs.meta
│ │ ├── DebugLogRecycledListView.cs.meta
│ │ ├── DebugLogResizeListener.cs.meta
│ │ ├── DebugsOnScrollListener.cs.meta
│ │ ├── DebugLogResizeListener.cs
│ │ ├── DebugLogItemCopyWebGL.cs
│ │ ├── CopyLogsOnResizeButtonClick.cs
│ │ ├── DebugsOnScrollListener.cs
│ │ ├── EventSystemHandler.cs
│ │ ├── DebugLogEntry.cs
│ │ ├── DebugLogPopup.cs
│ │ ├── DebugLogItem.cs
│ │ ├── CircularBuffer.cs
│ │ └── DebugLogRecycledListView.cs
│ ├── IngameDebugConsole.Runtime.asmdef.meta
│ ├── Editor
│ │ ├── IngameDebugConsole.Editor.asmdef.meta
│ │ ├── DebugLogManagerEditor.cs.meta
│ │ ├── IngameDebugConsole.Editor.asmdef
│ │ └── DebugLogManagerEditor.cs
│ ├── IngameDebugConsole.prefab.meta
│ ├── Prefabs
│ │ ├── DebugLogItem.prefab.meta
│ │ ├── CommandSuggestion.prefab.meta
│ │ ├── CommandSuggestion.prefab
│ │ └── DebugLogItem.prefab
│ ├── Android.meta
│ ├── Editor.meta
│ ├── Prefabs.meta
│ ├── Scripts.meta
│ ├── Sprites.meta
│ ├── WebGL.meta
│ ├── README.txt
│ ├── IngameDebugConsole.Runtime.asmdef
│ └── WebGL
│ │ ├── IngameDebugConsole.jslib.meta
│ │ └── IngameDebugConsole.jslib
└── IngameDebugConsole.meta
├── LICENSE.txt.meta
├── package.json.meta
├── Plugins.meta
├── package.json
└── LICENSE.txt
/.github/AAR Source (Android)/proguard.txt:
--------------------------------------------------------------------------------
1 | -keep class com.yasirkula.unity.* { *; }
--------------------------------------------------------------------------------
/.github/Images/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/.github/Images/1.png
--------------------------------------------------------------------------------
/.github/Images/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/.github/Images/2.png
--------------------------------------------------------------------------------
/.github/Images/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/.github/Images/3.png
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconHide.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/IconHide.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconInfo.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/IconInfo.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconClear.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/IconClear.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconError.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/IconError.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/SearchIcon.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/SearchIcon.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconCollapse.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/IconCollapse.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconWarning.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/IconWarning.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Android/IngameDebugConsole.aar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Android/IngameDebugConsole.aar
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconSnapToBottom.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/IconSnapToBottom.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconSnapToBottomBg.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/IconSnapToBottomBg.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/SlicedBackground.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/SlicedBackground.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/SlicedBackground2.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/SlicedBackground2.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/SlicedBackground3.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/SlicedBackground3.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconResizeAllDirections.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/IconResizeAllDirections.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconResizeVertialOnly.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/IconResizeVertialOnly.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/Unused/IconErrorHighRes.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/Unused/IconErrorHighRes.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/Unused/IconInfoHighRes.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/Unused/IconInfoHighRes.psd
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/Unused/IconWarningHighRes.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yasirkula/UnityIngameDebugConsole/HEAD/Plugins/IngameDebugConsole/Sprites/Unused/IconWarningHighRes.psd
--------------------------------------------------------------------------------
/LICENSE.txt.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: e7f42c787785fb447918340e47e9f699
3 | TextScriptImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/package.json.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 51a4ad37344e1b14bae3ca6dc5294cb5
3 | PackageManifestImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Plugins.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 8db108c766c7fbf48b8422c536f13b9d
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/.github/AAR Source (Android)/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/README.txt.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: edf2ac73f7bc3064c96d53009106dc53
3 | timeCreated: 1563307881
4 | licenseType: Free
5 | TextScriptImporter:
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/Attributes.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 7de74709c0f949d42853e89b41f0c939
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/IngameDebugConsole.Runtime.asmdef.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 3de88c88fbbb8f944b9210d496af9762
3 | AssemblyDefinitionImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Editor/IngameDebugConsole.Editor.asmdef.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 466e67dabd1db22468246c39eddb6c3f
3 | AssemblyDefinitionImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 3c57523b63ddb094b835b6613da12763
3 | folderAsset: yes
4 | timeCreated: 1465915359
5 | licenseType: Free
6 | DefaultImporter:
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/IngameDebugConsole.prefab.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 67117722a812a2e46ab8cb8eafbf5f5e
3 | timeCreated: 1466014755
4 | licenseType: Free
5 | NativeFormatImporter:
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Prefabs/DebugLogItem.prefab.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 391be5df5ef62f345bb76a1051c04da7
3 | timeCreated: 1465919887
4 | licenseType: Free
5 | NativeFormatImporter:
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Android.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 3d7d7a61a5341904eb3c65af025b1d86
3 | folderAsset: yes
4 | timeCreated: 1510075633
5 | licenseType: Free
6 | DefaultImporter:
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Editor.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 86f54622630720f4abe279acdbb8886f
3 | folderAsset: yes
4 | timeCreated: 1561217660
5 | licenseType: Free
6 | DefaultImporter:
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Prefabs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 7dbc36665bc0d684db9a4447e27a7a4b
3 | folderAsset: yes
4 | timeCreated: 1520417401
5 | licenseType: Free
6 | DefaultImporter:
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 860c08388401a6d4e858fe4910ea9337
3 | folderAsset: yes
4 | timeCreated: 1465930645
5 | licenseType: Free
6 | DefaultImporter:
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: cb5d7b23a9e684a41a6a5d4f300eb1e6
3 | folderAsset: yes
4 | timeCreated: 1465925237
5 | licenseType: Free
6 | DefaultImporter:
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/WebGL.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: a091b43ce3618074d8cf2beb7e538a7d
3 | folderAsset: yes
4 | timeCreated: 1626377678
5 | licenseType: Free
6 | DefaultImporter:
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/Unused.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: f6caae32d463529478f2186f47c2e3fe
3 | folderAsset: yes
4 | timeCreated: 1466010601
5 | licenseType: Free
6 | DefaultImporter:
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/.github/AAR Source (Android)/java/com/yasirkula/unity/DebugConsoleLogcatLogReceiver.java:
--------------------------------------------------------------------------------
1 | package com.yasirkula.unity;
2 |
3 | /**
4 | * Created by yasirkula on 7.11.2017.
5 | */
6 |
7 | public interface DebugConsoleLogcatLogReceiver
8 | {
9 | void OnLogReceived( String log );
10 | }
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IngameDebugConsoleSpriteAtlas.spriteatlas.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: d829dcfc225f56440a2b10d9ac318aea
3 | NativeFormatImporter:
4 | externalObjects: {}
5 | mainObjectFileID: 4343727234628468602
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Prefabs/CommandSuggestion.prefab.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 5e66896448428cf46a1854dbdc014914
3 | timeCreated: 1601390136
4 | licenseType: Free
5 | NativeFormatImporter:
6 | mainObjectFileID: 100100000
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugLogItemCopyWebGL.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 5a7d9d894141e704d8160fb4632121ac
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/Attributes/ConsoleAttribute.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: efc4511f2eea8034ca3a0a29cac8f554
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/CopyLogsOnResizeButtonClick.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 298319a3c52d37442b63e30622b8c05d
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/CircularBuffer.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 6136cb3c00eac0149901b8e7f2fecef8
3 | timeCreated: 1550943949
4 | licenseType: Free
5 | MonoImporter:
6 | serializedVersion: 2
7 | defaultReferences: []
8 | executionOrder: 0
9 | icon: {instanceID: 0}
10 | userData:
11 | assetBundleName:
12 | assetBundleVariant:
13 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugLogConsole.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: d15693a03d0d33b4892c6365a2a97e19
3 | timeCreated: 1472036503
4 | licenseType: Free
5 | MonoImporter:
6 | serializedVersion: 2
7 | defaultReferences: []
8 | executionOrder: 0
9 | icon: {instanceID: 0}
10 | userData:
11 | assetBundleName:
12 | assetBundleVariant:
13 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugLogEntry.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: e7b1a420c564be040bf73b8a377fc2c2
3 | timeCreated: 1466375168
4 | licenseType: Free
5 | MonoImporter:
6 | serializedVersion: 2
7 | defaultReferences: []
8 | executionOrder: 0
9 | icon: {instanceID: 0}
10 | userData:
11 | assetBundleName:
12 | assetBundleVariant:
13 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugLogItem.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: d2ea291be9de70a4abfec595203c96c1
3 | timeCreated: 1465919949
4 | licenseType: Free
5 | MonoImporter:
6 | serializedVersion: 2
7 | defaultReferences: []
8 | executionOrder: 0
9 | icon: {instanceID: 0}
10 | userData:
11 | assetBundleName:
12 | assetBundleVariant:
13 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugLogPopup.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 05cc4b1999716644c9308528e38e7081
3 | timeCreated: 1466533184
4 | licenseType: Free
5 | MonoImporter:
6 | serializedVersion: 2
7 | defaultReferences: []
8 | executionOrder: 0
9 | icon: {instanceID: 0}
10 | userData:
11 | assetBundleName:
12 | assetBundleVariant:
13 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Editor/DebugLogManagerEditor.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 4c23e5c521cb0c54b9a638b2a653d1d3
3 | timeCreated: 1561217671
4 | licenseType: Free
5 | MonoImporter:
6 | serializedVersion: 2
7 | defaultReferences: []
8 | executionOrder: 0
9 | icon: {instanceID: 0}
10 | userData:
11 | assetBundleName:
12 | assetBundleVariant:
13 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/Attributes/ConsoleCustomTypeParserAttribute.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: b014aa072d9631848babd5dafb325d3d
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugLogManager.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 6a4f16ed905adcd4ab0d7c8c11f0d72c
3 | timeCreated: 1522092746
4 | licenseType: Free
5 | MonoImporter:
6 | serializedVersion: 2
7 | defaultReferences: []
8 | executionOrder: -9869
9 | icon: {instanceID: 0}
10 | userData:
11 | assetBundleName:
12 | assetBundleVariant:
13 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/EventSystemHandler.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: c3cc1b407f337e641ad32a2e91d5b478
3 | timeCreated: 1658741613
4 | licenseType: Free
5 | MonoImporter:
6 | serializedVersion: 2
7 | defaultReferences: []
8 | executionOrder: 0
9 | icon: {instanceID: 0}
10 | userData:
11 | assetBundleName:
12 | assetBundleVariant:
13 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Android/DebugLogLogcatListener.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: dd3b7385882055d4a8c2b91deb6b2470
3 | timeCreated: 1510076185
4 | licenseType: Free
5 | MonoImporter:
6 | serializedVersion: 2
7 | defaultReferences: []
8 | executionOrder: 0
9 | icon: {instanceID: 0}
10 | userData:
11 | assetBundleName:
12 | assetBundleVariant:
13 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugLogRecycledListView.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: ce231987d32488f43b6fb798f7df43f6
3 | timeCreated: 1466373025
4 | licenseType: Free
5 | MonoImporter:
6 | serializedVersion: 2
7 | defaultReferences: []
8 | executionOrder: 0
9 | icon: {instanceID: 0}
10 | userData:
11 | assetBundleName:
12 | assetBundleVariant:
13 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugLogResizeListener.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 6565f2084f5aef44abe57c988745b9c3
3 | timeCreated: 1601221093
4 | licenseType: Free
5 | MonoImporter:
6 | serializedVersion: 2
7 | defaultReferences: []
8 | executionOrder: 0
9 | icon: {instanceID: 0}
10 | userData:
11 | assetBundleName:
12 | assetBundleVariant:
13 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugsOnScrollListener.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: cb564dcb180e586429c57456166a76b5
3 | timeCreated: 1466004663
4 | licenseType: Free
5 | MonoImporter:
6 | serializedVersion: 2
7 | defaultReferences: []
8 | executionOrder: 0
9 | icon: {instanceID: 0}
10 | userData:
11 | assetBundleName:
12 | assetBundleVariant:
13 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/Attributes/ConsoleMethodAttribute.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 324bb39c0bff0f74fa42f83e91f07e3a
3 | timeCreated: 1520710946
4 | licenseType: Free
5 | MonoImporter:
6 | serializedVersion: 2
7 | defaultReferences: []
8 | executionOrder: 0
9 | icon: {instanceID: 0}
10 | userData:
11 | assetBundleName:
12 | assetBundleVariant:
13 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/README.txt:
--------------------------------------------------------------------------------
1 | = In-game Debug Console (v1.8.3) =
2 |
3 | Documentation: https://github.com/yasirkula/UnityIngameDebugConsole
4 | FAQ: https://github.com/yasirkula/UnityIngameDebugConsole#faq
5 | E-mail: yasirkula@gmail.com
6 |
7 | You can simply place the IngameDebugConsole prefab to your scene. Hovering the cursor over its properties in the Inspector will reveal explanatory tooltips.
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Editor/IngameDebugConsole.Editor.asmdef:
--------------------------------------------------------------------------------
1 | {
2 | "name": "IngameDebugConsole.Editor",
3 | "references": [
4 | "IngameDebugConsole.Runtime"
5 | ],
6 | "includePlatforms": [
7 | "Editor"
8 | ],
9 | "excludePlatforms": [],
10 | "allowUnsafeCode": false,
11 | "overrideReferences": false,
12 | "precompiledReferences": [],
13 | "autoReferenced": true,
14 | "defineConstraints": [],
15 | "versionDefines": [],
16 | "noEngineReferences": false
17 | }
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/Attributes/ConsoleAttribute.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Reflection;
3 |
4 | namespace IngameDebugConsole
5 | {
6 | public abstract class ConsoleAttribute : Attribute
7 | {
8 | public MethodInfo Method { get; private set; }
9 | public abstract int Order { get; }
10 |
11 | public void SetMethod(MethodInfo method)
12 | {
13 | if (Method != null)
14 | throw new Exception("Method was already initialized.");
15 |
16 | Method = method;
17 | }
18 |
19 | public abstract void Load();
20 | }
21 | }
--------------------------------------------------------------------------------
/.github/AAR Source (Android)/java/com/yasirkula/unity/DebugConsole.java:
--------------------------------------------------------------------------------
1 | package com.yasirkula.unity;
2 |
3 | import android.content.ClipData;
4 | import android.content.ClipboardManager;
5 | import android.content.Context;
6 |
7 | /**
8 | * Created by yasirkula on 6.04.2020.
9 | */
10 |
11 | public class DebugConsole
12 | {
13 | public static void CopyText( Context context, String text )
14 | {
15 | ClipboardManager clipboard = (ClipboardManager) context.getSystemService( Context.CLIPBOARD_SERVICE );
16 | ClipData clip = ClipData.newPlainText( "log", text );
17 | clipboard.setPrimaryClip( clip );
18 | }
19 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "com.yasirkula.ingamedebugconsole",
3 | "displayName": "In-game Debug Console",
4 | "version": "1.8.3",
5 | "documentationUrl": "https://github.com/yasirkula/UnityIngameDebugConsole",
6 | "changelogUrl": "https://github.com/yasirkula/UnityIngameDebugConsole/releases",
7 | "licensesUrl": "https://github.com/yasirkula/UnityIngameDebugConsole/blob/master/LICENSE.txt",
8 | "description": "This asset helps you see debug messages (logs, warnings, errors, exceptions) runtime in a build (also assertions in editor) and execute commands using its built-in console. It also supports logging logcat messages to the console on Android platform.",
9 | "hideInEditor": false
10 | }
11 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/IngameDebugConsole.Runtime.asmdef:
--------------------------------------------------------------------------------
1 | {
2 | "name": "IngameDebugConsole.Runtime",
3 | "rootNamespace": "",
4 | "references": [
5 | "Unity.InputSystem",
6 | "Unity.TextMeshPro"
7 | ],
8 | "includePlatforms": [],
9 | "excludePlatforms": [],
10 | "allowUnsafeCode": false,
11 | "overrideReferences": false,
12 | "precompiledReferences": [],
13 | "autoReferenced": true,
14 | "defineConstraints": [],
15 | "versionDefines": [
16 | {
17 | "name": "com.unity.modules.androidjni",
18 | "expression": "",
19 | "define": "UNITY_ANDROID_JNI"
20 | }
21 | ],
22 | "noEngineReferences": false
23 | }
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugLogResizeListener.cs:
--------------------------------------------------------------------------------
1 | using UnityEngine;
2 | using UnityEngine.EventSystems;
3 |
4 | // Listens to drag event on the DebugLogManager's resize button
5 | namespace IngameDebugConsole
6 | {
7 | public class DebugLogResizeListener : MonoBehaviour, IBeginDragHandler, IDragHandler
8 | {
9 | #pragma warning disable 0649
10 | [SerializeField]
11 | private DebugLogManager debugManager;
12 | #pragma warning restore 0649
13 |
14 | // This interface must be implemented in order to receive drag events
15 | void IBeginDragHandler.OnBeginDrag( PointerEventData eventData )
16 | {
17 | }
18 |
19 | void IDragHandler.OnDrag( PointerEventData eventData )
20 | {
21 | debugManager.Resize( eventData );
22 | }
23 | }
24 | }
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Android/IngameDebugConsole.aar.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: bf909fab1c14af446b0a854de42289b2
3 | timeCreated: 1510086220
4 | licenseType: Free
5 | PluginImporter:
6 | serializedVersion: 2
7 | iconMap: {}
8 | executionOrder: {}
9 | isPreloaded: 0
10 | isOverridable: 0
11 | platformData:
12 | data:
13 | first:
14 | Android: Android
15 | second:
16 | enabled: 1
17 | settings: {}
18 | data:
19 | first:
20 | Any:
21 | second:
22 | enabled: 0
23 | settings: {}
24 | data:
25 | first:
26 | Editor: Editor
27 | second:
28 | enabled: 0
29 | settings:
30 | DefaultValueInitialized: true
31 | userData:
32 | assetBundleName:
33 | assetBundleVariant:
34 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/Attributes/ConsoleCustomTypeParserAttribute.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace IngameDebugConsole
4 | {
5 | [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
6 | public class ConsoleCustomTypeParserAttribute : ConsoleAttribute
7 | {
8 | public readonly Type type;
9 | public readonly string readableName;
10 |
11 | public override int Order { get { return 0; } }
12 |
13 | public ConsoleCustomTypeParserAttribute(Type type, string readableName = null)
14 | {
15 | this.type = type;
16 | this.readableName = readableName;
17 | }
18 |
19 | public override void Load()
20 | {
21 | DebugLogConsole.AddCustomParameterType(type, (DebugLogConsole.ParseFunction)Delegate.CreateDelegate(typeof(DebugLogConsole.ParseFunction), Method), readableName);
22 | }
23 | }
24 | }
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/WebGL/IngameDebugConsole.jslib.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: aa23dd530e9f98c4cb0766404fc0e755
3 | timeCreated: 1626377683
4 | licenseType: Free
5 | PluginImporter:
6 | serializedVersion: 2
7 | iconMap: {}
8 | executionOrder: {}
9 | isPreloaded: 0
10 | isOverridable: 0
11 | platformData:
12 | data:
13 | first:
14 | Any:
15 | second:
16 | enabled: 0
17 | settings: {}
18 | data:
19 | first:
20 | Editor: Editor
21 | second:
22 | enabled: 0
23 | settings:
24 | DefaultValueInitialized: true
25 | data:
26 | first:
27 | Facebook: WebGL
28 | second:
29 | enabled: 1
30 | settings: {}
31 | data:
32 | first:
33 | WebGL: WebGL
34 | second:
35 | enabled: 1
36 | settings: {}
37 | userData:
38 | assetBundleName:
39 | assetBundleVariant:
40 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/Attributes/ConsoleMethodAttribute.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace IngameDebugConsole
4 | {
5 | [AttributeUsage( AttributeTargets.Method, Inherited = false, AllowMultiple = true )]
6 | public class ConsoleMethodAttribute : ConsoleAttribute
7 | {
8 | private string m_command;
9 | private string m_description;
10 | private string[] m_parameterNames;
11 |
12 | public string Command { get { return m_command; } }
13 | public string Description { get { return m_description; } }
14 | public string[] ParameterNames { get { return m_parameterNames; } }
15 |
16 | public override int Order { get { return 1; } }
17 |
18 | public ConsoleMethodAttribute( string command, string description, params string[] parameterNames )
19 | {
20 | m_command = command;
21 | m_description = description;
22 | m_parameterNames = parameterNames;
23 | }
24 |
25 | public override void Load()
26 | {
27 | DebugLogConsole.AddCommand(Command, Description, Method, null, ParameterNames);
28 | }
29 | }
30 | }
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugLogItemCopyWebGL.cs:
--------------------------------------------------------------------------------
1 | #if !UNITY_EDITOR && UNITY_WEBGL
2 | using System.Runtime.InteropServices;
3 | using UnityEngine;
4 | using UnityEngine.EventSystems;
5 |
6 | namespace IngameDebugConsole
7 | {
8 | public class DebugLogItemCopyWebGL : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
9 | {
10 | [DllImport( "__Internal" )]
11 | private static extern void IngameDebugConsoleStartCopy( string textToCopy );
12 | [DllImport( "__Internal" )]
13 | private static extern void IngameDebugConsoleCancelCopy();
14 |
15 | private DebugLogItem logItem;
16 |
17 | public void Initialize( DebugLogItem logItem )
18 | {
19 | this.logItem = logItem;
20 | }
21 |
22 | public void OnPointerDown( PointerEventData eventData )
23 | {
24 | string log = logItem.GetCopyContent();
25 | if( !string.IsNullOrEmpty( log ) )
26 | IngameDebugConsoleStartCopy( log );
27 | }
28 |
29 | public void OnPointerUp( PointerEventData eventData )
30 | {
31 | if( eventData.dragging )
32 | IngameDebugConsoleCancelCopy();
33 | }
34 | }
35 | }
36 | #endif
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 Süleyman Yasir KULA
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 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/CopyLogsOnResizeButtonClick.cs:
--------------------------------------------------------------------------------
1 | using System.Collections;
2 | using UnityEngine;
3 | using UnityEngine.EventSystems;
4 |
5 | namespace IngameDebugConsole
6 | {
7 | public class CopyLogsOnResizeButtonClick : MonoBehaviour, IPointerClickHandler
8 | {
9 | [SerializeField]
10 | private int maxLogCount = int.MaxValue;
11 | [SerializeField]
12 | private float maxElapsedTime = float.PositiveInfinity;
13 |
14 | void IPointerClickHandler.OnPointerClick(PointerEventData eventData)
15 | {
16 | if (!eventData.dragging && eventData.eligibleForClick && DebugLogManager.Instance.copyAllLogsOnResizeButtonClick)
17 | {
18 | GUIUtility.systemCopyBuffer = DebugLogManager.Instance.GetAllLogs(maxLogCount, maxElapsedTime);
19 | StartCoroutine(ScaleAnimationCoroutine());
20 | }
21 | }
22 |
23 | private IEnumerator ScaleAnimationCoroutine()
24 | {
25 | for (float t = 0f; t < 1f; t += Time.unscaledDeltaTime * 3f)
26 | {
27 | transform.localScale = Vector3.one * (1f + Mathf.PingPong(t, 0.5f));
28 | yield return null;
29 | }
30 |
31 | transform.localScale = Vector3.one;
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Android/DebugLogLogcatListener.cs:
--------------------------------------------------------------------------------
1 | #if (UNITY_EDITOR || UNITY_ANDROID) && UNITY_ANDROID_JNI
2 | using System.Collections.Generic;
3 | using UnityEngine;
4 |
5 | // Credit: https://stackoverflow.com/a/41018028/2373034
6 | namespace IngameDebugConsole
7 | {
8 | public class DebugLogLogcatListener : AndroidJavaProxy
9 | {
10 | private Queue queuedLogs;
11 | private AndroidJavaObject nativeObject;
12 |
13 | public DebugLogLogcatListener() : base( "com.yasirkula.unity.DebugConsoleLogcatLogReceiver" )
14 | {
15 | queuedLogs = new Queue( 16 );
16 | }
17 |
18 | ~DebugLogLogcatListener()
19 | {
20 | Stop();
21 |
22 | if( nativeObject != null )
23 | nativeObject.Dispose();
24 | }
25 |
26 | public void Start( string arguments )
27 | {
28 | if( nativeObject == null )
29 | nativeObject = new AndroidJavaObject( "com.yasirkula.unity.DebugConsoleLogcatLogger" );
30 |
31 | nativeObject.Call( "Start", this, arguments );
32 | }
33 |
34 | public void Stop()
35 | {
36 | if( nativeObject != null )
37 | nativeObject.Call( "Stop" );
38 | }
39 |
40 | [UnityEngine.Scripting.Preserve]
41 | public void OnLogReceived( string log )
42 | {
43 | queuedLogs.Enqueue( log );
44 | }
45 |
46 | public string GetLog()
47 | {
48 | if( queuedLogs.Count > 0 )
49 | return queuedLogs.Dequeue();
50 |
51 | return null;
52 | }
53 | }
54 | }
55 | #endif
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugsOnScrollListener.cs:
--------------------------------------------------------------------------------
1 | using UnityEngine;
2 | using UnityEngine.UI;
3 | using UnityEngine.EventSystems;
4 |
5 | // Listens to scroll events on the scroll rect that debug items are stored
6 | // and decides whether snap to bottom should be true or not
7 | //
8 | // Procedure: if, after a user input (drag or scroll), scrollbar is at the bottom, then
9 | // snap to bottom shall be true, otherwise it shall be false
10 | namespace IngameDebugConsole
11 | {
12 | public class DebugsOnScrollListener : MonoBehaviour, IScrollHandler, IBeginDragHandler, IEndDragHandler
13 | {
14 | public ScrollRect debugsScrollRect;
15 | public DebugLogManager debugLogManager;
16 |
17 | public void OnScroll( PointerEventData data )
18 | {
19 | debugLogManager.SnapToBottom = IsScrollbarAtBottom();
20 | }
21 |
22 | public void OnBeginDrag( PointerEventData data )
23 | {
24 | debugLogManager.SnapToBottom = false;
25 | }
26 |
27 | public void OnEndDrag( PointerEventData data )
28 | {
29 | debugLogManager.SnapToBottom = IsScrollbarAtBottom();
30 | }
31 |
32 | public void OnScrollbarDragStart( BaseEventData data )
33 | {
34 | debugLogManager.SnapToBottom = false;
35 | }
36 |
37 | public void OnScrollbarDragEnd( BaseEventData data )
38 | {
39 | debugLogManager.SnapToBottom = IsScrollbarAtBottom();
40 | }
41 |
42 | private bool IsScrollbarAtBottom()
43 | {
44 | return debugsScrollRect.verticalNormalizedPosition <= 1E-6f;
45 | }
46 | }
47 | }
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/WebGL/IngameDebugConsole.jslib:
--------------------------------------------------------------------------------
1 | mergeInto( LibraryManager.library,
2 | {
3 | IngameDebugConsoleStartCopy: function( textToCopy )
4 | {
5 | var textToCopyJS = UTF8ToString( textToCopy );
6 |
7 | // Delete if element exist
8 | var copyTextButton = document.getElementById( 'DebugConsoleCopyButtonGL' );
9 | if( !copyTextButton )
10 | {
11 | copyTextButton = document.createElement( 'button' );
12 | copyTextButton.setAttribute( 'id', 'DebugConsoleCopyButtonGL' );
13 | copyTextButton.setAttribute( 'style','display:none; visibility:hidden;' );
14 | }
15 |
16 | copyTextButton.onclick = function( event )
17 | {
18 | // Credit: https://stackoverflow.com/a/30810322/2373034
19 | if( navigator.clipboard )
20 | {
21 | navigator.clipboard.writeText( textToCopyJS ).then( function() { }, function( err )
22 | {
23 | console.error( "Couldn't copy text to clipboard using clipboard.writeText: ", err );
24 | } );
25 | }
26 | else
27 | {
28 | var textArea = document.createElement( 'textarea' );
29 | textArea.value = textToCopyJS;
30 |
31 | // Avoid scrolling to bottom
32 | textArea.style.top = "0";
33 | textArea.style.left = "0";
34 | textArea.style.position = "fixed";
35 |
36 | document.body.appendChild( textArea );
37 | textArea.focus();
38 | textArea.select();
39 |
40 | try
41 | {
42 | document.execCommand( 'copy' );
43 | }
44 | catch( err )
45 | {
46 | console.error( "Couldn't copy text to clipboard using document.execCommand", err );
47 | }
48 |
49 | document.body.removeChild( textArea );
50 | }
51 | };
52 |
53 | document.body.appendChild( copyTextButton );
54 | document.onmouseup = function()
55 | {
56 | document.onmouseup = null;
57 | copyTextButton.click();
58 | document.body.removeChild( copyTextButton );
59 | };
60 | },
61 |
62 | IngameDebugConsoleCancelCopy: function()
63 | {
64 | var copyTextButton = document.getElementById( 'DebugConsoleCopyButtonGL' );
65 | if( copyTextButton )
66 | document.body.removeChild( copyTextButton );
67 |
68 | document.onmouseup = null;
69 | }
70 | } );
--------------------------------------------------------------------------------
/.github/AAR Source (Android)/java/com/yasirkula/unity/DebugConsoleLogcatLogger.java:
--------------------------------------------------------------------------------
1 | package com.yasirkula.unity;
2 |
3 | import java.io.BufferedReader;
4 | import java.io.IOException;
5 | import java.io.InputStreamReader;
6 |
7 | /**
8 | * Created by yasirkula on 7.11.2017.
9 | */
10 |
11 | public class DebugConsoleLogcatLogger
12 | {
13 | private static class LogcatWorker implements Runnable
14 | {
15 | private DebugConsoleLogcatLogReceiver logReceiver;
16 | private String command;
17 |
18 | private volatile boolean running = true;
19 |
20 | public LogcatWorker( DebugConsoleLogcatLogReceiver logReceiver, String command )
21 | {
22 | this.logReceiver = logReceiver;
23 | this.command = command;
24 | }
25 |
26 | @Override
27 | public void run()
28 | {
29 | // Credit: http://chintanrathod.com/read-logs-programmatically-in-android/
30 | try
31 | {
32 | Runtime.getRuntime().exec( "logcat -c" );
33 |
34 | Process process = Runtime.getRuntime().exec( command );
35 | BufferedReader bufferedReader = new BufferedReader( new InputStreamReader( process.getInputStream() ) );
36 |
37 | String line;
38 | while( running )
39 | {
40 | while( ( line = bufferedReader.readLine() ) != null )
41 | logReceiver.OnLogReceived( line );
42 |
43 | try
44 | {
45 | Thread.sleep( 1000L );
46 | }
47 | catch( InterruptedException e )
48 | {
49 | }
50 | }
51 | }
52 | catch( IOException e )
53 | {
54 | }
55 | }
56 |
57 | public void terminate()
58 | {
59 | running = false;
60 | }
61 | }
62 |
63 | private LogcatWorker worker;
64 |
65 | public void Start( DebugConsoleLogcatLogReceiver logReceiver, String arguments )
66 | {
67 | Stop();
68 |
69 | if( logReceiver == null )
70 | return;
71 |
72 | String command = "logcat";
73 | if( arguments != null )
74 | {
75 | arguments = arguments.trim();
76 | if( arguments.length() > 0 )
77 | command += " " + arguments;
78 | }
79 |
80 | worker = new LogcatWorker( logReceiver, command );
81 | Thread thread = new Thread( worker );
82 | thread.start();
83 | }
84 |
85 | public void Stop()
86 | {
87 | if( worker != null )
88 | {
89 | worker.terminate();
90 | worker = null;
91 | }
92 | }
93 | }
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/EventSystemHandler.cs:
--------------------------------------------------------------------------------
1 | using UnityEngine;
2 | using UnityEngine.EventSystems;
3 | using UnityEngine.SceneManagement;
4 | #if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
5 | using UnityEngine.InputSystem.UI;
6 | #endif
7 |
8 | namespace IngameDebugConsole
9 | {
10 | // Avoid multiple EventSystems in the scene by activating the embedded EventSystem only if one doesn't already exist in the scene
11 | [DefaultExecutionOrder( 1000 )]
12 | public class EventSystemHandler : MonoBehaviour
13 | {
14 | #pragma warning disable 0649
15 | [SerializeField]
16 | private GameObject embeddedEventSystem;
17 | #pragma warning restore 0649
18 |
19 | #if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
20 | private void Awake()
21 | {
22 | StandaloneInputModule legacyInputModule = embeddedEventSystem.GetComponent();
23 | if( legacyInputModule )
24 | {
25 | DestroyImmediate( legacyInputModule );
26 | embeddedEventSystem.AddComponent();
27 | }
28 | }
29 | #endif
30 |
31 | private void OnEnable()
32 | {
33 | SceneManager.sceneLoaded -= OnSceneLoaded;
34 | SceneManager.sceneLoaded += OnSceneLoaded;
35 | SceneManager.sceneUnloaded -= OnSceneUnloaded;
36 | SceneManager.sceneUnloaded += OnSceneUnloaded;
37 |
38 | ActivateEventSystemIfNeeded();
39 | }
40 |
41 | private void OnDisable()
42 | {
43 | SceneManager.sceneLoaded -= OnSceneLoaded;
44 | SceneManager.sceneUnloaded -= OnSceneUnloaded;
45 |
46 | DeactivateEventSystem();
47 | }
48 |
49 | private void OnSceneLoaded( Scene scene, LoadSceneMode mode )
50 | {
51 | DeactivateEventSystem();
52 | ActivateEventSystemIfNeeded();
53 | }
54 |
55 | private void OnSceneUnloaded( Scene current )
56 | {
57 | // Deactivate the embedded EventSystem before changing scenes because the new scene might have its own EventSystem
58 | DeactivateEventSystem();
59 | }
60 |
61 | private void ActivateEventSystemIfNeeded()
62 | {
63 | if( embeddedEventSystem && !EventSystem.current )
64 | embeddedEventSystem.SetActive( true );
65 | }
66 |
67 | private void DeactivateEventSystem()
68 | {
69 | if( embeddedEventSystem )
70 | embeddedEventSystem.SetActive( false );
71 | }
72 | }
73 | }
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconError.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 66305a19e3614694f868c75a982e6b68
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: 5
33 | maxTextureSize: 32
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 16
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 32
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 0
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 32
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 0
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 32
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 0
104 | spriteSheet:
105 | serializedVersion: 2
106 | sprites: []
107 | outline: []
108 | physicsShape: []
109 | bones: []
110 | spriteID: 5e97eb03825dee720800000000000000
111 | internalID: 0
112 | vertices: []
113 | indices:
114 | edges: []
115 | weights: []
116 | secondaryTextures: []
117 | nameFileIdTable: {}
118 | spritePackingTag: DebugLogUI
119 | pSDRemoveMatte: 1
120 | pSDShowRemoveMatteOption: 1
121 | userData:
122 | assetBundleName:
123 | assetBundleVariant:
124 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconHide.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: b3905a73a6672d9449647aaf036e23fc
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: 5
33 | maxTextureSize: 32
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 16
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 32
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 0
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 32
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 0
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 32
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 0
104 | spriteSheet:
105 | serializedVersion: 2
106 | sprites: []
107 | outline: []
108 | physicsShape: []
109 | bones: []
110 | spriteID: 5e97eb03825dee720800000000000000
111 | internalID: 0
112 | vertices: []
113 | indices:
114 | edges: []
115 | weights: []
116 | secondaryTextures: []
117 | nameFileIdTable: {}
118 | spritePackingTag: DebugLogUI
119 | pSDRemoveMatte: 1
120 | pSDShowRemoveMatteOption: 1
121 | userData:
122 | assetBundleName:
123 | assetBundleVariant:
124 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconInfo.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 5a97d5afa6254804f81b7ba956296996
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: 5
33 | maxTextureSize: 32
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 16
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 32
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 0
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 32
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 0
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 32
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 0
104 | spriteSheet:
105 | serializedVersion: 2
106 | sprites: []
107 | outline: []
108 | physicsShape: []
109 | bones: []
110 | spriteID: 5e97eb03825dee720800000000000000
111 | internalID: 0
112 | vertices: []
113 | indices:
114 | edges: []
115 | weights: []
116 | secondaryTextures: []
117 | nameFileIdTable: {}
118 | spritePackingTag: DebugLogUI
119 | pSDRemoveMatte: 1
120 | pSDShowRemoveMatteOption: 1
121 | userData:
122 | assetBundleName:
123 | assetBundleVariant:
124 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconCollapse.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: d1546f8db185caf4dafcfa58efa3ba2c
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: 5
33 | maxTextureSize: 32
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 16
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 32
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 0
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 32
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 0
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 32
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 0
104 | spriteSheet:
105 | serializedVersion: 2
106 | sprites: []
107 | outline: []
108 | physicsShape: []
109 | bones: []
110 | spriteID: 5e97eb03825dee720800000000000000
111 | internalID: 0
112 | vertices: []
113 | indices:
114 | edges: []
115 | weights: []
116 | secondaryTextures: []
117 | nameFileIdTable: {}
118 | spritePackingTag: DebugLogUI
119 | pSDRemoveMatte: 1
120 | pSDShowRemoveMatteOption: 1
121 | userData:
122 | assetBundleName:
123 | assetBundleVariant:
124 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconWarning.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 05c7216c78d4dd34ebe2bac9c1e274d7
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: 5
33 | maxTextureSize: 32
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 16
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 32
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 0
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 32
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 0
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 32
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 0
104 | spriteSheet:
105 | serializedVersion: 2
106 | sprites: []
107 | outline: []
108 | physicsShape: []
109 | bones: []
110 | spriteID: 5e97eb03825dee720800000000000000
111 | internalID: 0
112 | vertices: []
113 | indices:
114 | edges: []
115 | weights: []
116 | secondaryTextures: []
117 | nameFileIdTable: {}
118 | spritePackingTag: DebugLogUI
119 | pSDRemoveMatte: 1
120 | pSDShowRemoveMatteOption: 1
121 | userData:
122 | assetBundleName:
123 | assetBundleVariant:
124 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/Unused/IconErrorHighRes.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: a97ca0b99ece2d94aaaf59653feb45dd
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: -3
33 | maxTextureSize: 64
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 16
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 64
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 0
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 64
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 0
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 64
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 0
104 | spriteSheet:
105 | serializedVersion: 2
106 | sprites: []
107 | outline: []
108 | physicsShape: []
109 | bones: []
110 | spriteID: 5e97eb03825dee720800000000000000
111 | internalID: 0
112 | vertices: []
113 | indices:
114 | edges: []
115 | weights: []
116 | secondaryTextures: []
117 | nameFileIdTable: {}
118 | spritePackingTag:
119 | pSDRemoveMatte: 1
120 | pSDShowRemoveMatteOption: 1
121 | userData:
122 | assetBundleName:
123 | assetBundleVariant:
124 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/Unused/IconInfoHighRes.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 33b115bf5efdfa04d8e2e0b70a6643cd
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: -3
33 | maxTextureSize: 64
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 16
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 64
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 0
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 64
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 0
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 64
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 0
104 | spriteSheet:
105 | serializedVersion: 2
106 | sprites: []
107 | outline: []
108 | physicsShape: []
109 | bones: []
110 | spriteID: 5e97eb03825dee720800000000000000
111 | internalID: 0
112 | vertices: []
113 | indices:
114 | edges: []
115 | weights: []
116 | secondaryTextures: []
117 | nameFileIdTable: {}
118 | spritePackingTag:
119 | pSDRemoveMatte: 1
120 | pSDShowRemoveMatteOption: 1
121 | userData:
122 | assetBundleName:
123 | assetBundleVariant:
124 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconSnapToBottom.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 066c0b04be98cd348abb79add91d42bf
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: 5
33 | maxTextureSize: 32
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 16
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 32
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 0
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 32
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 0
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 32
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 0
104 | spriteSheet:
105 | serializedVersion: 2
106 | sprites: []
107 | outline: []
108 | physicsShape: []
109 | bones: []
110 | spriteID: 5e97eb03825dee720800000000000000
111 | internalID: 0
112 | vertices: []
113 | indices:
114 | edges: []
115 | weights: []
116 | secondaryTextures: []
117 | nameFileIdTable: {}
118 | spritePackingTag: DebugLogUI
119 | pSDRemoveMatte: 1
120 | pSDShowRemoveMatteOption: 1
121 | userData:
122 | assetBundleName:
123 | assetBundleVariant:
124 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/Unused/IconWarningHighRes.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: af17f91b4376d6a41a793c056c02dadc
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: -3
33 | maxTextureSize: 64
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 16
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 64
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 0
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 64
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 0
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 64
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 0
104 | spriteSheet:
105 | serializedVersion: 2
106 | sprites: []
107 | outline: []
108 | physicsShape: []
109 | bones: []
110 | spriteID: 5e97eb03825dee720800000000000000
111 | internalID: 0
112 | vertices: []
113 | indices:
114 | edges: []
115 | weights: []
116 | secondaryTextures: []
117 | nameFileIdTable: {}
118 | spritePackingTag:
119 | pSDRemoveMatte: 1
120 | pSDShowRemoveMatteOption: 1
121 | userData:
122 | assetBundleName:
123 | assetBundleVariant:
124 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconResizeAllDirections.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 7f0db3cf23c93fc4eac01cb3a52388ee
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: 5
33 | maxTextureSize: 32
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 16
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 32
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 1
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 32
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 1
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 32
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 1
104 | spriteSheet:
105 | serializedVersion: 2
106 | sprites: []
107 | outline: []
108 | physicsShape: []
109 | bones: []
110 | spriteID: 5e97eb03825dee720800000000000000
111 | internalID: 0
112 | vertices: []
113 | indices:
114 | edges: []
115 | weights: []
116 | secondaryTextures: []
117 | nameFileIdTable: {}
118 | spritePackingTag: DebugLogUI
119 | pSDRemoveMatte: 1
120 | pSDShowRemoveMatteOption: 1
121 | userData:
122 | assetBundleName:
123 | assetBundleVariant:
124 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconResizeVertialOnly.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: a9fd8f6b461461f4a92eafc60921ee78
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: 5
33 | maxTextureSize: 32
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 16
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 32
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 0
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 32
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 0
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 32
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 0
104 | spriteSheet:
105 | serializedVersion: 2
106 | sprites: []
107 | outline: []
108 | physicsShape: []
109 | bones: []
110 | spriteID: 5e97eb03825dee720800000000000000
111 | internalID: 0
112 | vertices: []
113 | indices:
114 | edges: []
115 | weights: []
116 | secondaryTextures: []
117 | nameFileIdTable: {}
118 | spritePackingTag: DebugLogUI
119 | pSDRemoveMatte: 1
120 | pSDShowRemoveMatteOption: 1
121 | userData:
122 | assetBundleName:
123 | assetBundleVariant:
124 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconSnapToBottomBg.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: b902f763d0e47364dae25207b7e47800
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: 5
33 | maxTextureSize: 32
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 1
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 13, y: 13, z: 13, w: 13}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 32
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 0
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 32
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 0
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 32
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 0
104 | spriteSheet:
105 | serializedVersion: 2
106 | sprites: []
107 | outline: []
108 | physicsShape: []
109 | bones: []
110 | spriteID: 5e97eb03825dee720800000000000000
111 | internalID: 0
112 | vertices: []
113 | indices:
114 | edges: []
115 | weights: []
116 | secondaryTextures: []
117 | nameFileIdTable: {}
118 | spritePackingTag: DebugLogUI
119 | pSDRemoveMatte: 1
120 | pSDShowRemoveMatteOption: 1
121 | userData:
122 | assetBundleName:
123 | assetBundleVariant:
124 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/SlicedBackground2.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 98e8e1cf8dc7dbf469617c2e40c8a944
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: 5
33 | maxTextureSize: 32
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 1
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 12, y: 12, z: 12, w: 12}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 32
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 0
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 32
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 0
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 32
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 0
104 | spriteSheet:
105 | serializedVersion: 2
106 | sprites: []
107 | outline: []
108 | physicsShape: []
109 | bones: []
110 | spriteID: 5e97eb03825dee720800000000000000
111 | internalID: 0
112 | vertices: []
113 | indices:
114 | edges: []
115 | weights: []
116 | secondaryTextures: []
117 | nameFileIdTable: {}
118 | spritePackingTag: DebugLogUI
119 | pSDRemoveMatte: 1
120 | pSDShowRemoveMatteOption: 1
121 | userData:
122 | assetBundleName:
123 | assetBundleVariant:
124 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/SlicedBackground3.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: b3f0d976f6d6802479d6465d11b3aa68
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: 5
33 | maxTextureSize: 32
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 1
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 13, y: 13, z: 13, w: 13}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 32
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 0
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 32
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 0
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 32
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 0
104 | spriteSheet:
105 | serializedVersion: 2
106 | sprites: []
107 | outline: []
108 | physicsShape: []
109 | bones: []
110 | spriteID: 5e97eb03825dee720800000000000000
111 | internalID: 0
112 | vertices: []
113 | indices:
114 | edges: []
115 | weights: []
116 | secondaryTextures: []
117 | nameFileIdTable: {}
118 | spritePackingTag: DebugLogUI
119 | pSDRemoveMatte: 1
120 | pSDShowRemoveMatteOption: 1
121 | userData:
122 | assetBundleName:
123 | assetBundleVariant:
124 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IconClear.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 7a9e374666ad6cc47807bb001844f3d8
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: 5
33 | maxTextureSize: 32
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 16
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 32
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 1
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 32
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 1
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 32
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 1
104 | - serializedVersion: 3
105 | buildTarget: WebGL
106 | maxTextureSize: 32
107 | resizeAlgorithm: 0
108 | textureFormat: -1
109 | textureCompression: 0
110 | compressionQuality: 50
111 | crunchedCompression: 0
112 | allowsAlphaSplitting: 0
113 | overridden: 0
114 | androidETC2FallbackOverride: 0
115 | forceMaximumCompressionQuality_BC6H_BC7: 1
116 | spriteSheet:
117 | serializedVersion: 2
118 | sprites: []
119 | outline: []
120 | physicsShape: []
121 | bones: []
122 | spriteID: 5e97eb03825dee720800000000000000
123 | internalID: 0
124 | vertices: []
125 | indices:
126 | edges: []
127 | weights: []
128 | secondaryTextures: []
129 | nameFileIdTable: {}
130 | spritePackingTag: DebugLogUI
131 | pSDRemoveMatte: 1
132 | pSDShowRemoveMatteOption: 1
133 | userData:
134 | assetBundleName:
135 | assetBundleVariant:
136 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/SearchIcon.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: e04e6c970b950d946a782ea08e5f971d
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: 1
33 | maxTextureSize: 2048
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 1
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 32
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 1
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 32
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 1
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 32
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 1
104 | - serializedVersion: 3
105 | buildTarget: WebGL
106 | maxTextureSize: 32
107 | resizeAlgorithm: 0
108 | textureFormat: -1
109 | textureCompression: 0
110 | compressionQuality: 50
111 | crunchedCompression: 0
112 | allowsAlphaSplitting: 0
113 | overridden: 0
114 | androidETC2FallbackOverride: 0
115 | forceMaximumCompressionQuality_BC6H_BC7: 1
116 | spriteSheet:
117 | serializedVersion: 2
118 | sprites: []
119 | outline: []
120 | physicsShape: []
121 | bones: []
122 | spriteID: 5e97eb03825dee720800000000000000
123 | internalID: 0
124 | vertices: []
125 | indices:
126 | edges: []
127 | weights: []
128 | secondaryTextures: []
129 | nameFileIdTable: {}
130 | spritePackingTag: DebugLogUI
131 | pSDRemoveMatte: 1
132 | pSDShowRemoveMatteOption: 1
133 | userData:
134 | assetBundleName:
135 | assetBundleVariant:
136 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/SlicedBackground.psd.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 066d3840badf4d24dba1d42b4c59b888
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: 5
33 | maxTextureSize: 32
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 1
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 100
51 | spriteBorder: {x: 12, y: 12, z: 12, w: 12}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 1
66 | cookieLightType: 1
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 32
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 0
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 1
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 32
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 0
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 1
92 | - serializedVersion: 3
93 | buildTarget: Android
94 | maxTextureSize: 32
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 0
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 1
104 | - serializedVersion: 3
105 | buildTarget: WebGL
106 | maxTextureSize: 32
107 | resizeAlgorithm: 0
108 | textureFormat: -1
109 | textureCompression: 0
110 | compressionQuality: 50
111 | crunchedCompression: 0
112 | allowsAlphaSplitting: 0
113 | overridden: 0
114 | androidETC2FallbackOverride: 0
115 | forceMaximumCompressionQuality_BC6H_BC7: 1
116 | spriteSheet:
117 | serializedVersion: 2
118 | sprites: []
119 | outline: []
120 | physicsShape: []
121 | bones: []
122 | spriteID: 5e97eb03825dee720800000000000000
123 | internalID: 0
124 | vertices: []
125 | indices:
126 | edges: []
127 | weights: []
128 | secondaryTextures: []
129 | nameFileIdTable: {}
130 | spritePackingTag: DebugLogUI
131 | pSDRemoveMatte: 1
132 | pSDShowRemoveMatteOption: 1
133 | userData:
134 | assetBundleName:
135 | assetBundleVariant:
136 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Sprites/IngameDebugConsoleSpriteAtlas.spriteatlas:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!687078895 &4343727234628468602
4 | SpriteAtlas:
5 | m_ObjectHideFlags: 0
6 | m_CorrespondingSourceObject: {fileID: 0}
7 | m_PrefabInstance: {fileID: 0}
8 | m_PrefabAsset: {fileID: 0}
9 | m_Name: IngameDebugConsoleSpriteAtlas
10 | m_EditorData:
11 | serializedVersion: 2
12 | textureSettings:
13 | serializedVersion: 2
14 | anisoLevel: 1
15 | compressionQuality: 50
16 | maxTextureSize: 2048
17 | textureCompression: 0
18 | filterMode: 1
19 | generateMipMaps: 0
20 | readable: 0
21 | crunchedCompression: 0
22 | sRGB: 1
23 | platformSettings:
24 | - serializedVersion: 3
25 | m_BuildTarget: DefaultTexturePlatform
26 | m_MaxTextureSize: 2048
27 | m_ResizeAlgorithm: 0
28 | m_TextureFormat: -1
29 | m_TextureCompression: 0
30 | m_CompressionQuality: 50
31 | m_CrunchedCompression: 0
32 | m_AllowsAlphaSplitting: 0
33 | m_Overridden: 0
34 | m_AndroidETC2FallbackOverride: 0
35 | m_ForceMaximumCompressionQuality_BC6H_BC7: 1
36 | packingSettings:
37 | serializedVersion: 2
38 | padding: 8
39 | blockOffset: 1
40 | allowAlphaSplitting: 0
41 | enableRotation: 0
42 | enableTightPacking: 0
43 | enableAlphaDilation: 0
44 | secondaryTextureSettings: {}
45 | variantMultiplier: 1
46 | packables:
47 | - {fileID: 2800000, guid: 7a9e374666ad6cc47807bb001844f3d8, type: 3}
48 | - {fileID: 2800000, guid: d1546f8db185caf4dafcfa58efa3ba2c, type: 3}
49 | - {fileID: 2800000, guid: 66305a19e3614694f868c75a982e6b68, type: 3}
50 | - {fileID: 2800000, guid: b3905a73a6672d9449647aaf036e23fc, type: 3}
51 | - {fileID: 2800000, guid: 5a97d5afa6254804f81b7ba956296996, type: 3}
52 | - {fileID: 2800000, guid: 7f0db3cf23c93fc4eac01cb3a52388ee, type: 3}
53 | - {fileID: 2800000, guid: a9fd8f6b461461f4a92eafc60921ee78, type: 3}
54 | - {fileID: 2800000, guid: 066c0b04be98cd348abb79add91d42bf, type: 3}
55 | - {fileID: 2800000, guid: b902f763d0e47364dae25207b7e47800, type: 3}
56 | - {fileID: 2800000, guid: 05c7216c78d4dd34ebe2bac9c1e274d7, type: 3}
57 | - {fileID: 2800000, guid: e04e6c970b950d946a782ea08e5f971d, type: 3}
58 | - {fileID: 2800000, guid: 066d3840badf4d24dba1d42b4c59b888, type: 3}
59 | - {fileID: 2800000, guid: 98e8e1cf8dc7dbf469617c2e40c8a944, type: 3}
60 | - {fileID: 2800000, guid: b3f0d976f6d6802479d6465d11b3aa68, type: 3}
61 | bindAsDefault: 1
62 | isAtlasV2: 0
63 | cachedData: {fileID: 0}
64 | m_MasterAtlas: {fileID: 0}
65 | m_PackedSprites:
66 | - {fileID: 21300000, guid: 066d3840badf4d24dba1d42b4c59b888, type: 3}
67 | - {fileID: 21300000, guid: b902f763d0e47364dae25207b7e47800, type: 3}
68 | - {fileID: 21300000, guid: b3905a73a6672d9449647aaf036e23fc, type: 3}
69 | - {fileID: 21300000, guid: 066c0b04be98cd348abb79add91d42bf, type: 3}
70 | - {fileID: 21300000, guid: 7a9e374666ad6cc47807bb001844f3d8, type: 3}
71 | - {fileID: 21300000, guid: b3f0d976f6d6802479d6465d11b3aa68, type: 3}
72 | - {fileID: 21300000, guid: e04e6c970b950d946a782ea08e5f971d, type: 3}
73 | - {fileID: 21300000, guid: 66305a19e3614694f868c75a982e6b68, type: 3}
74 | - {fileID: 21300000, guid: a9fd8f6b461461f4a92eafc60921ee78, type: 3}
75 | - {fileID: 21300000, guid: 05c7216c78d4dd34ebe2bac9c1e274d7, type: 3}
76 | - {fileID: 21300000, guid: d1546f8db185caf4dafcfa58efa3ba2c, type: 3}
77 | - {fileID: 21300000, guid: 5a97d5afa6254804f81b7ba956296996, type: 3}
78 | - {fileID: 21300000, guid: 98e8e1cf8dc7dbf469617c2e40c8a944, type: 3}
79 | - {fileID: 21300000, guid: 7f0db3cf23c93fc4eac01cb3a52388ee, type: 3}
80 | m_PackedSpriteNamesToIndex:
81 | - SlicedBackground
82 | - IconSnapToBottomBg
83 | - IconHide
84 | - IconSnapToBottom
85 | - IconClear
86 | - SlicedBackground3
87 | - SearchIcon
88 | - IconError
89 | - IconResizeVertialOnly
90 | - IconWarning
91 | - IconCollapse
92 | - IconInfo
93 | - SlicedBackground2
94 | - IconResizeAllDirections
95 | m_RenderDataMap: {}
96 | m_Tag: IngameDebugConsoleSpriteAtlas
97 | m_IsVariant: 0
98 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Prefabs/CommandSuggestion.prefab:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!1 &1386426139070838
4 | GameObject:
5 | m_ObjectHideFlags: 0
6 | m_CorrespondingSourceObject: {fileID: 0}
7 | m_PrefabInstance: {fileID: 0}
8 | m_PrefabAsset: {fileID: 0}
9 | serializedVersion: 6
10 | m_Component:
11 | - component: {fileID: 224955737853170496}
12 | - component: {fileID: 222541766812100524}
13 | - component: {fileID: 6838696818539158795}
14 | m_Layer: 5
15 | m_Name: CommandSuggestion
16 | m_TagString: Untagged
17 | m_Icon: {fileID: 0}
18 | m_NavMeshLayer: 0
19 | m_StaticEditorFlags: 0
20 | m_IsActive: 1
21 | --- !u!224 &224955737853170496
22 | RectTransform:
23 | m_ObjectHideFlags: 0
24 | m_CorrespondingSourceObject: {fileID: 0}
25 | m_PrefabInstance: {fileID: 0}
26 | m_PrefabAsset: {fileID: 0}
27 | m_GameObject: {fileID: 1386426139070838}
28 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
29 | m_LocalPosition: {x: 0, y: 0, z: 0}
30 | m_LocalScale: {x: 1, y: 1, z: 1}
31 | m_ConstrainProportionsScale: 0
32 | m_Children: []
33 | m_Father: {fileID: 0}
34 | m_RootOrder: 0
35 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
36 | m_AnchorMin: {x: 0, y: 0}
37 | m_AnchorMax: {x: 0, y: 0}
38 | m_AnchoredPosition: {x: 0, y: 0}
39 | m_SizeDelta: {x: 0, y: 0}
40 | m_Pivot: {x: 0.5, y: 0.5}
41 | --- !u!222 &222541766812100524
42 | CanvasRenderer:
43 | m_ObjectHideFlags: 0
44 | m_CorrespondingSourceObject: {fileID: 0}
45 | m_PrefabInstance: {fileID: 0}
46 | m_PrefabAsset: {fileID: 0}
47 | m_GameObject: {fileID: 1386426139070838}
48 | m_CullTransparentMesh: 1
49 | --- !u!114 &6838696818539158795
50 | MonoBehaviour:
51 | m_ObjectHideFlags: 0
52 | m_CorrespondingSourceObject: {fileID: 0}
53 | m_PrefabInstance: {fileID: 0}
54 | m_PrefabAsset: {fileID: 0}
55 | m_GameObject: {fileID: 1386426139070838}
56 | m_Enabled: 1
57 | m_EditorHideFlags: 0
58 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
59 | m_Name:
60 | m_EditorClassIdentifier:
61 | m_Material: {fileID: 0}
62 | m_Color: {r: 1, g: 1, b: 1, a: 1}
63 | m_RaycastTarget: 0
64 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
65 | m_Maskable: 1
66 | m_OnCullStateChanged:
67 | m_PersistentCalls:
68 | m_Calls: []
69 | m_text: help
70 | m_isRightToLeft: 0
71 | m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
72 | m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
73 | m_fontSharedMaterials: []
74 | m_fontMaterial: {fileID: 0}
75 | m_fontMaterials: []
76 | m_fontColor32:
77 | serializedVersion: 2
78 | rgba: 4292335574
79 | m_fontColor: {r: 0.83823526, g: 0.84439874, b: 0.84439874, a: 1}
80 | m_enableVertexGradient: 0
81 | m_colorMode: 3
82 | m_fontColorGradient:
83 | topLeft: {r: 1, g: 1, b: 1, a: 1}
84 | topRight: {r: 1, g: 1, b: 1, a: 1}
85 | bottomLeft: {r: 1, g: 1, b: 1, a: 1}
86 | bottomRight: {r: 1, g: 1, b: 1, a: 1}
87 | m_fontColorGradientPreset: {fileID: 0}
88 | m_spriteAsset: {fileID: 0}
89 | m_tintAllSprites: 0
90 | m_StyleSheet: {fileID: 0}
91 | m_TextStyleHashCode: -1183493901
92 | m_overrideHtmlColors: 0
93 | m_faceColor:
94 | serializedVersion: 2
95 | rgba: 4294967295
96 | m_fontSize: 16
97 | m_fontSizeBase: 16
98 | m_fontWeight: 400
99 | m_enableAutoSizing: 0
100 | m_fontSizeMin: 1
101 | m_fontSizeMax: 40
102 | m_fontStyle: 0
103 | m_HorizontalAlignment: 1
104 | m_VerticalAlignment: 512
105 | m_textAlignment: 65535
106 | m_characterSpacing: 0
107 | m_wordSpacing: 0
108 | m_lineSpacing: 0
109 | m_lineSpacingMax: 0
110 | m_paragraphSpacing: 0
111 | m_charWidthMaxAdj: 0
112 | m_enableWordWrapping: 1
113 | m_wordWrappingRatios: 0.4
114 | m_overflowMode: 3
115 | m_linkedTextComponent: {fileID: 0}
116 | parentLinkedComponent: {fileID: 0}
117 | m_enableKerning: 1
118 | m_enableExtraPadding: 0
119 | checkPaddingRequired: 0
120 | m_isRichText: 1
121 | m_parseCtrlCharacters: 0
122 | m_isOrthographic: 1
123 | m_isCullingEnabled: 0
124 | m_horizontalMapping: 0
125 | m_verticalMapping: 0
126 | m_uvLineOffset: 0
127 | m_geometrySortingOrder: 0
128 | m_IsTextObjectScaleStatic: 0
129 | m_VertexBufferAutoSizeReduction: 0
130 | m_useMaxVisibleDescender: 1
131 | m_pageToDisplay: 1
132 | m_margin: {x: 0, y: 0, z: 0, w: 0}
133 | m_isUsingLegacyAnimationComponent: 0
134 | m_isVolumetricText: 0
135 | m_hasFontAssetChanged: 0
136 | m_baseMaterial: {fileID: 0}
137 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
138 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugLogEntry.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Globalization;
3 | using System.Text;
4 | using UnityEngine;
5 |
6 | // Container for a simple debug entry
7 | namespace IngameDebugConsole
8 | {
9 | public class DebugLogEntry
10 | {
11 | private const int HASH_NOT_CALCULATED = -623218;
12 |
13 | public string logString;
14 | public string stackTrace;
15 | private string completeLog;
16 |
17 | // Sprite to show with this entry
18 | public LogType logType;
19 |
20 | // Collapsed count
21 | public int count;
22 |
23 | // Index of this entry among all collapsed entries
24 | public int collapsedIndex;
25 |
26 | private int hashValue;
27 |
28 | public void Initialize( string logString, string stackTrace )
29 | {
30 | this.logString = logString;
31 | this.stackTrace = stackTrace;
32 |
33 | completeLog = null;
34 | count = 1;
35 | hashValue = HASH_NOT_CALCULATED;
36 | }
37 |
38 | public void Clear()
39 | {
40 | logString = null;
41 | stackTrace = null;
42 | completeLog = null;
43 | }
44 |
45 | // Checks if logString or stackTrace contains the search term
46 | public bool MatchesSearchTerm( string searchTerm )
47 | {
48 | return ( logString != null && DebugLogConsole.caseInsensitiveComparer.IndexOf( logString, searchTerm, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace ) >= 0 ) ||
49 | ( stackTrace != null && DebugLogConsole.caseInsensitiveComparer.IndexOf( stackTrace, searchTerm, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace ) >= 0 );
50 | }
51 |
52 | // Return a string containing complete information about this debug entry
53 | public override string ToString()
54 | {
55 | if( completeLog == null )
56 | completeLog = string.Concat( logString, "\n", stackTrace );
57 |
58 | return completeLog;
59 | }
60 |
61 | // Credit: https://stackoverflow.com/a/19250516/2373034
62 | public int GetContentHashCode()
63 | {
64 | if( hashValue == HASH_NOT_CALCULATED )
65 | {
66 | unchecked
67 | {
68 | hashValue = 17;
69 | hashValue = hashValue * 23 + ( logString == null ? 0 : logString.GetHashCode() );
70 | hashValue = hashValue * 23 + ( stackTrace == null ? 0 : stackTrace.GetHashCode() );
71 | }
72 | }
73 |
74 | return hashValue;
75 | }
76 | }
77 |
78 | public struct QueuedDebugLogEntry
79 | {
80 | public readonly string logString;
81 | public readonly string stackTrace;
82 | public readonly LogType logType;
83 |
84 | public QueuedDebugLogEntry( string logString, string stackTrace, LogType logType )
85 | {
86 | this.logString = logString;
87 | this.stackTrace = stackTrace;
88 | this.logType = logType;
89 | }
90 |
91 | // Checks if logString or stackTrace contains the search term
92 | public bool MatchesSearchTerm( string searchTerm )
93 | {
94 | return ( logString != null && DebugLogConsole.caseInsensitiveComparer.IndexOf( logString, searchTerm, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace ) >= 0 ) ||
95 | ( stackTrace != null && DebugLogConsole.caseInsensitiveComparer.IndexOf( stackTrace, searchTerm, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace ) >= 0 );
96 | }
97 | }
98 |
99 | public struct DebugLogEntryTimestamp
100 | {
101 | public readonly System.DateTime dateTime;
102 | #if !IDG_OMIT_ELAPSED_TIME
103 | public readonly float elapsedSeconds;
104 | #endif
105 | #if !IDG_OMIT_FRAMECOUNT
106 | public readonly int frameCount;
107 | #endif
108 |
109 | #if !IDG_OMIT_ELAPSED_TIME && !IDG_OMIT_FRAMECOUNT
110 | public DebugLogEntryTimestamp( System.DateTime dateTime, float elapsedSeconds, int frameCount )
111 | #elif !IDG_OMIT_ELAPSED_TIME
112 | public DebugLogEntryTimestamp( System.DateTime dateTime, float elapsedSeconds )
113 | #elif !IDG_OMIT_FRAMECOUNT
114 | public DebugLogEntryTimestamp( System.DateTime dateTime, int frameCount )
115 | #else
116 | public DebugLogEntryTimestamp( System.DateTime dateTime )
117 | #endif
118 | {
119 | this.dateTime = dateTime;
120 | #if !IDG_OMIT_ELAPSED_TIME
121 | this.elapsedSeconds = elapsedSeconds;
122 | #endif
123 | #if !IDG_OMIT_FRAMECOUNT
124 | this.frameCount = frameCount;
125 | #endif
126 | }
127 |
128 | public void AppendTime( StringBuilder sb )
129 | {
130 | // Add DateTime in format: [HH:mm:ss]
131 | sb.Append( "[" );
132 |
133 | int hour = dateTime.Hour;
134 | if( hour >= 10 )
135 | sb.Append( hour );
136 | else
137 | sb.Append( "0" ).Append( hour );
138 |
139 | sb.Append( ":" );
140 |
141 | int minute = dateTime.Minute;
142 | if( minute >= 10 )
143 | sb.Append( minute );
144 | else
145 | sb.Append( "0" ).Append( minute );
146 |
147 | sb.Append( ":" );
148 |
149 | int second = dateTime.Second;
150 | if( second >= 10 )
151 | sb.Append( second );
152 | else
153 | sb.Append( "0" ).Append( second );
154 |
155 | sb.Append( "]" );
156 | }
157 |
158 | public void AppendFullTimestamp( StringBuilder sb )
159 | {
160 | AppendTime( sb );
161 |
162 | #if !IDG_OMIT_ELAPSED_TIME && !IDG_OMIT_FRAMECOUNT
163 | // Append elapsed seconds and frame count in format: [1.0s at #Frame]
164 | sb.Append( "[" ).Append( elapsedSeconds.ToString( "F1" ) ).Append( "s at " ).Append( "#" ).Append( frameCount ).Append( "]" );
165 | #elif !IDG_OMIT_ELAPSED_TIME
166 | // Append elapsed seconds in format: [1.0s]
167 | sb.Append( "[" ).Append( elapsedSeconds.ToString( "F1" ) ).Append( "s]" );
168 | #elif !IDG_OMIT_FRAMECOUNT
169 | // Append frame count in format: [#Frame]
170 | sb.Append( "[#" ).Append( frameCount ).Append( "]" );
171 | #endif
172 | }
173 | }
174 |
175 | public class DebugLogEntryContentEqualityComparer : EqualityComparer
176 | {
177 | public override bool Equals( DebugLogEntry x, DebugLogEntry y )
178 | {
179 | return x.logString == y.logString && x.stackTrace == y.stackTrace;
180 | }
181 |
182 | public override int GetHashCode( DebugLogEntry obj )
183 | {
184 | return obj.GetContentHashCode();
185 | }
186 | }
187 | }
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Editor/DebugLogManagerEditor.cs:
--------------------------------------------------------------------------------
1 | using UnityEditor;
2 | using UnityEngine;
3 |
4 | namespace IngameDebugConsole
5 | {
6 | [CustomEditor( typeof( DebugLogManager ) )]
7 | public class DebugLogManagerEditor : Editor
8 | {
9 | private SerializedProperty singleton;
10 | private SerializedProperty minimumHeight;
11 | private SerializedProperty enableHorizontalResizing;
12 | private SerializedProperty resizeFromRight;
13 | private SerializedProperty minimumWidth;
14 | private SerializedProperty logWindowOpacity;
15 | private SerializedProperty popupOpacity;
16 | private SerializedProperty popupVisibility;
17 | private SerializedProperty popupVisibilityLogFilter;
18 | private SerializedProperty startMinimized;
19 | private SerializedProperty toggleWithKey;
20 | private SerializedProperty toggleKey;
21 | private SerializedProperty enableSearchbar;
22 | private SerializedProperty topSearchbarMinWidth;
23 | private SerializedProperty copyAllLogsOnResizeButtonClick;
24 | private SerializedProperty receiveLogsWhileInactive;
25 | private SerializedProperty receiveInfoLogs;
26 | private SerializedProperty receiveWarningLogs;
27 | private SerializedProperty receiveErrorLogs;
28 | private SerializedProperty receiveExceptionLogs;
29 | private SerializedProperty captureLogTimestamps;
30 | private SerializedProperty alwaysDisplayTimestamps;
31 | private SerializedProperty maxLogCount;
32 | private SerializedProperty logsToRemoveAfterMaxLogCount;
33 | private SerializedProperty queuedLogLimit;
34 | private SerializedProperty clearCommandAfterExecution;
35 | private SerializedProperty commandHistorySize;
36 | private SerializedProperty showCommandSuggestions;
37 | private SerializedProperty receiveLogcatLogsInAndroid;
38 | private SerializedProperty logcatArguments;
39 | private SerializedProperty avoidScreenCutout;
40 | private SerializedProperty popupAvoidsScreenCutout;
41 | private SerializedProperty autoFocusOnCommandInputField;
42 |
43 | private readonly GUIContent popupVisibilityLogFilterLabel = new GUIContent( "Log Filter", "Determines which log types will show the popup on screen" );
44 | private readonly GUIContent receivedLogTypesLabel = new GUIContent( "Received Log Types", "Only these logs will be received by the console window, other logs will simply be skipped" );
45 | private readonly GUIContent receiveInfoLogsLabel = new GUIContent( "Info" );
46 | private readonly GUIContent receiveWarningLogsLabel = new GUIContent( "Warning" );
47 | private readonly GUIContent receiveErrorLogsLabel = new GUIContent( "Error" );
48 | private readonly GUIContent receiveExceptionLogsLabel = new GUIContent( "Exception" );
49 |
50 | private void OnEnable()
51 | {
52 | singleton = serializedObject.FindProperty( "singleton" );
53 | minimumHeight = serializedObject.FindProperty( "minimumHeight" );
54 | enableHorizontalResizing = serializedObject.FindProperty( "enableHorizontalResizing" );
55 | resizeFromRight = serializedObject.FindProperty( "resizeFromRight" );
56 | minimumWidth = serializedObject.FindProperty( "minimumWidth" );
57 | logWindowOpacity = serializedObject.FindProperty( "logWindowOpacity" );
58 | popupOpacity = serializedObject.FindProperty( "popupOpacity" );
59 | popupVisibility = serializedObject.FindProperty( "popupVisibility" );
60 | popupVisibilityLogFilter = serializedObject.FindProperty( "popupVisibilityLogFilter" );
61 | startMinimized = serializedObject.FindProperty( "startMinimized" );
62 | toggleWithKey = serializedObject.FindProperty( "toggleWithKey" );
63 | #if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER
64 | toggleKey = serializedObject.FindProperty( "toggleBinding" );
65 | #else
66 | toggleKey = serializedObject.FindProperty( "toggleKey" );
67 | #endif
68 | enableSearchbar = serializedObject.FindProperty( "enableSearchbar" );
69 | topSearchbarMinWidth = serializedObject.FindProperty( "topSearchbarMinWidth" );
70 | receiveLogsWhileInactive = serializedObject.FindProperty( "receiveLogsWhileInactive" );
71 | receiveInfoLogs = serializedObject.FindProperty( "receiveInfoLogs" );
72 | receiveWarningLogs = serializedObject.FindProperty( "receiveWarningLogs" );
73 | receiveErrorLogs = serializedObject.FindProperty( "receiveErrorLogs" );
74 | receiveExceptionLogs = serializedObject.FindProperty( "receiveExceptionLogs" );
75 | captureLogTimestamps = serializedObject.FindProperty( "captureLogTimestamps" );
76 | alwaysDisplayTimestamps = serializedObject.FindProperty( "alwaysDisplayTimestamps" );
77 | maxLogCount = serializedObject.FindProperty( "maxLogCount" );
78 | logsToRemoveAfterMaxLogCount = serializedObject.FindProperty( "logsToRemoveAfterMaxLogCount" );
79 | queuedLogLimit = serializedObject.FindProperty( "queuedLogLimit" );
80 | copyAllLogsOnResizeButtonClick = serializedObject.FindProperty("copyAllLogsOnResizeButtonClick");
81 | clearCommandAfterExecution = serializedObject.FindProperty( "clearCommandAfterExecution" );
82 | commandHistorySize = serializedObject.FindProperty( "commandHistorySize" );
83 | showCommandSuggestions = serializedObject.FindProperty( "showCommandSuggestions" );
84 | receiveLogcatLogsInAndroid = serializedObject.FindProperty( "receiveLogcatLogsInAndroid" );
85 | logcatArguments = serializedObject.FindProperty( "logcatArguments" );
86 | avoidScreenCutout = serializedObject.FindProperty( "avoidScreenCutout" );
87 | popupAvoidsScreenCutout = serializedObject.FindProperty( "popupAvoidsScreenCutout" );
88 | autoFocusOnCommandInputField = serializedObject.FindProperty( "autoFocusOnCommandInputField" );
89 | }
90 |
91 | public override void OnInspectorGUI()
92 | {
93 | serializedObject.Update();
94 |
95 | EditorGUILayout.PropertyField( singleton );
96 |
97 | EditorGUILayout.Space();
98 |
99 | EditorGUILayout.PropertyField( minimumHeight );
100 |
101 | EditorGUILayout.PropertyField( enableHorizontalResizing );
102 | if( enableHorizontalResizing.boolValue )
103 | {
104 | DrawSubProperty( resizeFromRight );
105 | DrawSubProperty( minimumWidth );
106 | }
107 |
108 | EditorGUILayout.PropertyField( avoidScreenCutout );
109 | DrawSubProperty( popupAvoidsScreenCutout );
110 |
111 | EditorGUILayout.Space();
112 |
113 | EditorGUILayout.PropertyField( startMinimized );
114 | EditorGUILayout.PropertyField( logWindowOpacity );
115 | EditorGUILayout.PropertyField( popupOpacity );
116 |
117 | EditorGUILayout.PropertyField( popupVisibility );
118 | if( popupVisibility.intValue == (int) PopupVisibility.WhenLogReceived )
119 | {
120 | EditorGUI.indentLevel++;
121 | Rect rect = EditorGUILayout.GetControlRect();
122 | EditorGUI.BeginProperty( rect, GUIContent.none, popupVisibilityLogFilter );
123 | popupVisibilityLogFilter.intValue = (int) (DebugLogFilter) EditorGUI.EnumFlagsField( rect, popupVisibilityLogFilterLabel, (DebugLogFilter) popupVisibilityLogFilter.intValue );
124 | EditorGUI.EndProperty();
125 | EditorGUI.indentLevel--;
126 | }
127 |
128 | EditorGUILayout.PropertyField( toggleWithKey );
129 | if( toggleWithKey.boolValue )
130 | DrawSubProperty( toggleKey );
131 |
132 | EditorGUILayout.Space();
133 |
134 | EditorGUILayout.PropertyField( enableSearchbar );
135 | if( enableSearchbar.boolValue )
136 | DrawSubProperty( topSearchbarMinWidth );
137 |
138 | EditorGUILayout.PropertyField(copyAllLogsOnResizeButtonClick);
139 |
140 | EditorGUILayout.Space();
141 |
142 | EditorGUILayout.PropertyField( receiveLogsWhileInactive );
143 |
144 | EditorGUILayout.PrefixLabel( receivedLogTypesLabel );
145 | EditorGUI.indentLevel++;
146 | EditorGUILayout.PropertyField( receiveInfoLogs, receiveInfoLogsLabel );
147 | EditorGUILayout.PropertyField( receiveWarningLogs, receiveWarningLogsLabel );
148 | EditorGUILayout.PropertyField( receiveErrorLogs, receiveErrorLogsLabel );
149 | EditorGUILayout.PropertyField( receiveExceptionLogs, receiveExceptionLogsLabel );
150 | EditorGUI.indentLevel--;
151 |
152 | EditorGUILayout.PropertyField( receiveLogcatLogsInAndroid );
153 | if( receiveLogcatLogsInAndroid.boolValue )
154 | DrawSubProperty( logcatArguments );
155 |
156 | EditorGUILayout.PropertyField( captureLogTimestamps );
157 | if( captureLogTimestamps.boolValue )
158 | DrawSubProperty( alwaysDisplayTimestamps );
159 |
160 | EditorGUILayout.PropertyField( maxLogCount );
161 | DrawSubProperty( logsToRemoveAfterMaxLogCount );
162 |
163 | EditorGUILayout.PropertyField( queuedLogLimit );
164 |
165 | EditorGUILayout.Space();
166 |
167 | EditorGUILayout.PropertyField( clearCommandAfterExecution );
168 | EditorGUILayout.PropertyField( commandHistorySize );
169 | EditorGUILayout.PropertyField( showCommandSuggestions );
170 | EditorGUILayout.PropertyField( autoFocusOnCommandInputField );
171 |
172 | EditorGUILayout.Space();
173 |
174 | DrawPropertiesExcluding( serializedObject, "m_Script" );
175 | serializedObject.ApplyModifiedProperties();
176 | }
177 |
178 | private void DrawSubProperty( SerializedProperty property )
179 | {
180 | EditorGUI.indentLevel++;
181 | EditorGUILayout.PropertyField( property );
182 | EditorGUI.indentLevel--;
183 | }
184 | }
185 | }
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugLogPopup.cs:
--------------------------------------------------------------------------------
1 | using UnityEngine;
2 | using UnityEngine.UI;
3 | using UnityEngine.EventSystems;
4 | using System.Collections;
5 | using TMPro;
6 | #if UNITY_EDITOR && UNITY_2021_1_OR_NEWER
7 | using Screen = UnityEngine.Device.Screen; // To support Device Simulator on Unity 2021.1+
8 | #endif
9 |
10 | // Manager class for the debug popup
11 | namespace IngameDebugConsole
12 | {
13 | public class DebugLogPopup : MonoBehaviour, IPointerClickHandler, IBeginDragHandler, IDragHandler, IEndDragHandler
14 | {
15 | private RectTransform popupTransform;
16 |
17 | // Dimensions of the popup divided by 2
18 | private Vector2 halfSize;
19 |
20 | // Background image that will change color to indicate an alert
21 | private Image backgroundImage;
22 |
23 | // Canvas group to modify visibility of the popup
24 | private CanvasGroup canvasGroup;
25 |
26 | #pragma warning disable 0649
27 | [SerializeField]
28 | private DebugLogManager debugManager;
29 |
30 | [SerializeField]
31 | private TextMeshProUGUI newInfoCountText;
32 | [SerializeField]
33 | private TextMeshProUGUI newWarningCountText;
34 | [SerializeField]
35 | private TextMeshProUGUI newErrorCountText;
36 |
37 | [SerializeField]
38 | private Color alertColorInfo;
39 | [SerializeField]
40 | private Color alertColorWarning;
41 | [SerializeField]
42 | private Color alertColorError;
43 | #pragma warning restore 0649
44 |
45 | // Number of new debug entries since the log window has been closed
46 | private int newInfoCount = 0, newWarningCount = 0, newErrorCount = 0;
47 |
48 | private Color normalColor;
49 |
50 | private bool isPopupBeingDragged = false;
51 | private Vector2 normalizedPosition;
52 |
53 | // Coroutines for simple code-based animations
54 | private IEnumerator moveToPosCoroutine = null;
55 |
56 | public bool IsVisible { get; private set; }
57 |
58 | private void Awake()
59 | {
60 | popupTransform = (RectTransform) transform;
61 | backgroundImage = GetComponent();
62 | canvasGroup = GetComponent();
63 |
64 | normalColor = backgroundImage.color;
65 |
66 | halfSize = popupTransform.sizeDelta * 0.5f;
67 |
68 | Vector2 pos = popupTransform.anchoredPosition;
69 | if( pos.x != 0f || pos.y != 0f )
70 | normalizedPosition = pos.normalized; // Respect the initial popup position set in the prefab
71 | else
72 | normalizedPosition = new Vector2( 0.5f, 0f ); // Right edge by default
73 | }
74 |
75 | public void NewLogsArrived( int newInfo, int newWarning, int newError )
76 | {
77 | if( newInfo > 0 )
78 | {
79 | newInfoCount += newInfo;
80 | newInfoCountText.text = newInfoCount.ToString();
81 | }
82 |
83 | if( newWarning > 0 )
84 | {
85 | newWarningCount += newWarning;
86 | newWarningCountText.text = newWarningCount.ToString();
87 | }
88 |
89 | if( newError > 0 )
90 | {
91 | newErrorCount += newError;
92 | newErrorCountText.text = newErrorCount.ToString();
93 | }
94 |
95 | if( newErrorCount > 0 )
96 | backgroundImage.color = alertColorError;
97 | else if( newWarningCount > 0 )
98 | backgroundImage.color = alertColorWarning;
99 | else
100 | backgroundImage.color = alertColorInfo;
101 | }
102 |
103 | private void ResetValues()
104 | {
105 | newInfoCount = 0;
106 | newWarningCount = 0;
107 | newErrorCount = 0;
108 |
109 | newInfoCountText.text = "0";
110 | newWarningCountText.text = "0";
111 | newErrorCountText.text = "0";
112 |
113 | backgroundImage.color = normalColor;
114 | }
115 |
116 | // A simple smooth movement animation
117 | private IEnumerator MoveToPosAnimation( Vector2 targetPos )
118 | {
119 | float modifier = 0f;
120 | Vector2 initialPos = popupTransform.anchoredPosition;
121 |
122 | while( modifier < 1f )
123 | {
124 | modifier += 4f * Time.unscaledDeltaTime;
125 | popupTransform.anchoredPosition = Vector2.Lerp( initialPos, targetPos, modifier );
126 |
127 | yield return null;
128 | }
129 | }
130 |
131 | // Popup is clicked
132 | public void OnPointerClick( PointerEventData data )
133 | {
134 | // Hide the popup and show the log window
135 | if( !isPopupBeingDragged )
136 | debugManager.ShowLogWindow();
137 | }
138 |
139 | // Hides the log window and shows the popup
140 | public void Show()
141 | {
142 | canvasGroup.blocksRaycasts = true;
143 | canvasGroup.alpha = debugManager.popupOpacity;
144 | IsVisible = true;
145 |
146 | // Reset the counters
147 | ResetValues();
148 |
149 | // Update position in case resolution was changed while the popup was hidden
150 | UpdatePosition( true );
151 | }
152 |
153 | // Hide the popup
154 | public void Hide()
155 | {
156 | canvasGroup.blocksRaycasts = false;
157 | canvasGroup.alpha = 0f;
158 |
159 | IsVisible = false;
160 | isPopupBeingDragged = false;
161 | }
162 |
163 | public void OnBeginDrag( PointerEventData data )
164 | {
165 | isPopupBeingDragged = true;
166 |
167 | // If a smooth movement animation is in progress, cancel it
168 | if( moveToPosCoroutine != null )
169 | {
170 | StopCoroutine( moveToPosCoroutine );
171 | moveToPosCoroutine = null;
172 | }
173 | }
174 |
175 | // Reposition the popup
176 | public void OnDrag( PointerEventData data )
177 | {
178 | Vector2 localPoint;
179 | if( RectTransformUtility.ScreenPointToLocalPointInRectangle( debugManager.canvasTR, data.position, data.pressEventCamera, out localPoint ) )
180 | popupTransform.anchoredPosition = localPoint;
181 | }
182 |
183 | // Smoothly translate the popup to the nearest edge
184 | public void OnEndDrag( PointerEventData data )
185 | {
186 | isPopupBeingDragged = false;
187 | UpdatePosition( false );
188 | }
189 |
190 | // There are 2 different spaces used in these calculations:
191 | // RectTransform space: raw anchoredPosition of the popup that's in range [-canvasSize/2, canvasSize/2]
192 | // Safe area space: Screen.safeArea space that's in range [safeAreaBottomLeft, safeAreaTopRight] where these corner positions
193 | // are all positive (calculated from bottom left corner of the screen instead of the center of the screen)
194 | public void UpdatePosition( bool immediately )
195 | {
196 | Vector2 canvasRawSize = debugManager.canvasTR.rect.size;
197 |
198 | // Calculate safe area bounds
199 | float canvasWidth = canvasRawSize.x;
200 | float canvasHeight = canvasRawSize.y;
201 |
202 | float canvasBottomLeftX = 0f;
203 | float canvasBottomLeftY = 0f;
204 |
205 | if( debugManager.popupAvoidsScreenCutout )
206 | {
207 | #if UNITY_EDITOR || UNITY_ANDROID || UNITY_IOS
208 | Rect safeArea = Screen.safeArea;
209 |
210 | int screenWidth = Screen.width;
211 | int screenHeight = Screen.height;
212 |
213 | canvasWidth *= safeArea.width / screenWidth;
214 | canvasHeight *= safeArea.height / screenHeight;
215 |
216 | canvasBottomLeftX = canvasRawSize.x * ( safeArea.x / screenWidth );
217 | canvasBottomLeftY = canvasRawSize.y * ( safeArea.y / screenHeight );
218 | #endif
219 | }
220 |
221 | // Calculate safe area position of the popup
222 | // normalizedPosition allows us to glue the popup to a specific edge of the screen. It becomes useful when
223 | // the popup is at the right edge and we switch from portrait screen orientation to landscape screen orientation.
224 | // Without normalizedPosition, popup could jump to bottom or top edges instead of staying at the right edge
225 | Vector2 pos = canvasRawSize * 0.5f + ( immediately ? new Vector2( normalizedPosition.x * canvasWidth, normalizedPosition.y * canvasHeight ) : ( popupTransform.anchoredPosition - new Vector2( canvasBottomLeftX, canvasBottomLeftY ) ) );
226 |
227 | // Find distances to all four edges of the safe area
228 | float distToLeft = pos.x;
229 | float distToRight = canvasWidth - distToLeft;
230 |
231 | float distToBottom = pos.y;
232 | float distToTop = canvasHeight - distToBottom;
233 |
234 | float horDistance = Mathf.Min( distToLeft, distToRight );
235 | float vertDistance = Mathf.Min( distToBottom, distToTop );
236 |
237 | // Find the nearest edge's safe area coordinates
238 | if( horDistance < vertDistance )
239 | {
240 | if( distToLeft < distToRight )
241 | pos = new Vector2( halfSize.x, pos.y );
242 | else
243 | pos = new Vector2( canvasWidth - halfSize.x, pos.y );
244 |
245 | pos.y = Mathf.Clamp( pos.y, halfSize.y, canvasHeight - halfSize.y );
246 | }
247 | else
248 | {
249 | if( distToBottom < distToTop )
250 | pos = new Vector2( pos.x, halfSize.y );
251 | else
252 | pos = new Vector2( pos.x, canvasHeight - halfSize.y );
253 |
254 | pos.x = Mathf.Clamp( pos.x, halfSize.x, canvasWidth - halfSize.x );
255 | }
256 |
257 | pos -= canvasRawSize * 0.5f;
258 |
259 | normalizedPosition.Set( pos.x / canvasWidth, pos.y / canvasHeight );
260 |
261 | // Safe area's bottom left coordinates are added to pos only after normalizedPosition's value
262 | // is set because normalizedPosition is in range [-canvasWidth / 2, canvasWidth / 2]
263 | pos += new Vector2( canvasBottomLeftX, canvasBottomLeftY );
264 |
265 | // If another smooth movement animation is in progress, cancel it
266 | if( moveToPosCoroutine != null )
267 | {
268 | StopCoroutine( moveToPosCoroutine );
269 | moveToPosCoroutine = null;
270 | }
271 |
272 | if( immediately )
273 | popupTransform.anchoredPosition = pos;
274 | else
275 | {
276 | // Smoothly translate the popup to the specified position
277 | moveToPosCoroutine = MoveToPosAnimation( pos );
278 | StartCoroutine( moveToPosCoroutine );
279 | }
280 | }
281 | }
282 | }
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugLogItem.cs:
--------------------------------------------------------------------------------
1 | using UnityEngine;
2 | using UnityEngine.UI;
3 | using UnityEngine.EventSystems;
4 | using System.Text;
5 | using TMPro;
6 | #if UNITY_EDITOR
7 | using UnityEditor;
8 | using System.Text.RegularExpressions;
9 | #endif
10 |
11 | // A UI element to show information about a debug entry
12 | namespace IngameDebugConsole
13 | {
14 | public class DebugLogItem : MonoBehaviour, IPointerClickHandler
15 | {
16 | #pragma warning disable 0649
17 | // Cached components
18 | [SerializeField]
19 | private RectTransform transformComponent;
20 | public RectTransform Transform { get { return transformComponent; } }
21 |
22 | [SerializeField]
23 | private Image imageComponent;
24 | public Image Image { get { return imageComponent; } }
25 |
26 | [SerializeField]
27 | private CanvasGroup canvasGroupComponent;
28 | public CanvasGroup CanvasGroup { get { return canvasGroupComponent; } }
29 |
30 | [SerializeField]
31 | private TextMeshProUGUI logText;
32 | [SerializeField]
33 | private Image logTypeImage;
34 |
35 | // Objects related to the collapsed count of the debug entry
36 | [SerializeField]
37 | private GameObject logCountParent;
38 | [SerializeField]
39 | private TextMeshProUGUI logCountText;
40 |
41 | [SerializeField]
42 | private Button copyLogButton;
43 | #pragma warning restore 0649
44 |
45 | // Debug entry to show with this log item
46 | private DebugLogEntry logEntry;
47 | public DebugLogEntry Entry { get { return logEntry; } }
48 |
49 | private DebugLogEntryTimestamp? logEntryTimestamp;
50 | public DebugLogEntryTimestamp? Timestamp { get { return logEntryTimestamp; } }
51 |
52 | // Index of the entry in the list of entries
53 | [System.NonSerialized] public int Index;
54 |
55 | private bool isExpanded;
56 | public bool Expanded { get { return isExpanded; } }
57 |
58 | private Vector2 logTextOriginalPosition;
59 | private Vector2 logTextOriginalSize;
60 | private float copyLogButtonHeight;
61 |
62 | private DebugLogRecycledListView listView;
63 |
64 | public void Initialize( DebugLogRecycledListView listView )
65 | {
66 | this.listView = listView;
67 |
68 | logTextOriginalPosition = logText.rectTransform.anchoredPosition;
69 | logTextOriginalSize = logText.rectTransform.sizeDelta;
70 | copyLogButtonHeight = ( copyLogButton.transform as RectTransform ).anchoredPosition.y + ( copyLogButton.transform as RectTransform ).sizeDelta.y + 2f; // 2f: space between text and button
71 |
72 | if (listView.manager.logItemFontOverride != null)
73 | logText.font = listView.manager.logItemFontOverride;
74 |
75 | copyLogButton.onClick.AddListener( CopyLog );
76 | #if !UNITY_EDITOR && UNITY_WEBGL
77 | copyLogButton.gameObject.AddComponent().Initialize( this );
78 | #endif
79 | }
80 |
81 | public void SetContent( DebugLogEntry logEntry, DebugLogEntryTimestamp? logEntryTimestamp, int entryIndex, bool isExpanded )
82 | {
83 | this.logEntry = logEntry;
84 | this.logEntryTimestamp = logEntryTimestamp;
85 | this.Index = entryIndex;
86 | this.isExpanded = isExpanded;
87 |
88 | Vector2 size = transformComponent.sizeDelta;
89 | if( isExpanded )
90 | {
91 | size.y = listView.SelectedItemHeight;
92 |
93 | if( !copyLogButton.gameObject.activeSelf )
94 | {
95 | copyLogButton.gameObject.SetActive( true );
96 |
97 | logText.rectTransform.anchoredPosition = new Vector2( logTextOriginalPosition.x, logTextOriginalPosition.y + copyLogButtonHeight * 0.5f );
98 | logText.rectTransform.sizeDelta = logTextOriginalSize - new Vector2( 0f, copyLogButtonHeight );
99 | }
100 | }
101 | else
102 | {
103 | size.y = listView.ItemHeight;
104 |
105 | if( copyLogButton.gameObject.activeSelf )
106 | {
107 | copyLogButton.gameObject.SetActive( false );
108 |
109 | logText.rectTransform.anchoredPosition = logTextOriginalPosition;
110 | logText.rectTransform.sizeDelta = logTextOriginalSize;
111 | }
112 | }
113 |
114 | transformComponent.sizeDelta = size;
115 |
116 | SetText( logEntry, logEntryTimestamp, isExpanded );
117 | logTypeImage.sprite = DebugLogManager.logSpriteRepresentations[(int) logEntry.logType];
118 | }
119 |
120 | // Show the collapsed count of the debug entry
121 | public void ShowCount()
122 | {
123 | logCountText.SetText( "{0}", logEntry.count );
124 |
125 | if( !logCountParent.activeSelf )
126 | logCountParent.SetActive( true );
127 | }
128 |
129 | // Hide the collapsed count of the debug entry
130 | public void HideCount()
131 | {
132 | if( logCountParent.activeSelf )
133 | logCountParent.SetActive( false );
134 | }
135 |
136 | // Update the debug entry's displayed timestamp
137 | public void UpdateTimestamp( DebugLogEntryTimestamp timestamp )
138 | {
139 | logEntryTimestamp = timestamp;
140 |
141 | if( isExpanded || listView.manager.alwaysDisplayTimestamps )
142 | SetText( logEntry, timestamp, isExpanded );
143 | }
144 |
145 | private void SetText(DebugLogEntry logEntry, DebugLogEntryTimestamp? logEntryTimestamp, bool isExpanded)
146 | {
147 | string text = isExpanded ? logEntry.ToString() : logEntry.logString;
148 | int maxLogLength = isExpanded ? listView.manager.maxExpandedLogLength : listView.manager.maxCollapsedLogLength;
149 |
150 | if (!logEntryTimestamp.HasValue || (!isExpanded && !listView.manager.alwaysDisplayTimestamps))
151 | {
152 | if (text.Length <= maxLogLength)
153 | logText.text = text;
154 | else
155 | {
156 | if (listView.manager.textBuffer.Length < maxLogLength)
157 | listView.manager.textBuffer = new char[maxLogLength];
158 |
159 | text.CopyTo(0, listView.manager.textBuffer, 0, maxLogLength);
160 | logText.SetText(listView.manager.textBuffer, 0, maxLogLength);
161 | }
162 | }
163 | else
164 | {
165 | StringBuilder sb = listView.manager.sharedStringBuilder;
166 | sb.Length = 0;
167 |
168 | if (isExpanded)
169 | {
170 | logEntryTimestamp.Value.AppendFullTimestamp(sb);
171 | sb.Append(": ").Append(text, 0, Mathf.Min(text.Length, maxLogLength - sb.Length));
172 | }
173 | else
174 | {
175 | logEntryTimestamp.Value.AppendTime(sb);
176 | sb.Append(" ").Append(text, 0, Mathf.Min(text.Length, maxLogLength - sb.Length));
177 | }
178 |
179 | if (listView.manager.textBuffer.Length < sb.Length)
180 | listView.manager.textBuffer = new char[sb.Length];
181 |
182 | sb.CopyTo(0, listView.manager.textBuffer, 0, sb.Length);
183 | logText.SetText(listView.manager.textBuffer, 0, sb.Length);
184 | }
185 | }
186 |
187 | // This log item is clicked, show the debug entry's stack trace
188 | public void OnPointerClick( PointerEventData eventData )
189 | {
190 | #if UNITY_EDITOR
191 | if( eventData.button == PointerEventData.InputButton.Right )
192 | {
193 | Match regex = Regex.Match( logEntry.stackTrace, @"\(at .*\.cs:[0-9]+\)$", RegexOptions.Multiline );
194 | if( regex.Success )
195 | {
196 | string line = logEntry.stackTrace.Substring( regex.Index + 4, regex.Length - 5 );
197 | int lineSeparator = line.IndexOf( ':' );
198 | MonoScript script = AssetDatabase.LoadAssetAtPath( line.Substring( 0, lineSeparator ) );
199 | if( script != null )
200 | AssetDatabase.OpenAsset( script, int.Parse( line.Substring( lineSeparator + 1 ) ) );
201 | }
202 | }
203 | else
204 | listView.OnLogItemClicked( this );
205 | #else
206 | listView.OnLogItemClicked( this );
207 | #endif
208 | }
209 |
210 | private void CopyLog()
211 | {
212 | #if UNITY_EDITOR || !UNITY_WEBGL
213 | string log = GetCopyContent();
214 | if( !string.IsNullOrEmpty( log ) )
215 | GUIUtility.systemCopyBuffer = log;
216 | #endif
217 | }
218 |
219 | internal string GetCopyContent()
220 | {
221 | if( !logEntryTimestamp.HasValue )
222 | return logEntry.ToString();
223 | else
224 | {
225 | StringBuilder sb = listView.manager.sharedStringBuilder;
226 | sb.Length = 0;
227 |
228 | logEntryTimestamp.Value.AppendFullTimestamp( sb );
229 | sb.Append( ": " ).Append( logEntry.ToString() );
230 |
231 | return sb.ToString();
232 | }
233 | }
234 |
235 | /// Here, we're using instead of because the latter doesn't take
236 | /// into account. However, for to work, we need to give it
237 | /// enough space (increase log item's height) and let it regenerate its mesh .
238 | public float CalculateExpandedHeight( DebugLogEntry logEntry, DebugLogEntryTimestamp? logEntryTimestamp )
239 | {
240 | string text = logText.text;
241 | Vector2 size = ( transform as RectTransform ).sizeDelta;
242 |
243 | ( transform as RectTransform ).sizeDelta = new Vector2( size.x, 10000f );
244 | SetText( logEntry, logEntryTimestamp, true );
245 | logText.ForceMeshUpdate();
246 | float result = logText.GetRenderedValues( true ).y + copyLogButtonHeight;
247 |
248 | ( transform as RectTransform ).sizeDelta = size;
249 | logText.text = text;
250 |
251 | return Mathf.Max( listView.ItemHeight, result );
252 | }
253 |
254 | // Return a string containing complete information about the debug entry
255 | public override string ToString()
256 | {
257 | return logEntry.ToString();
258 | }
259 | }
260 | }
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/CircularBuffer.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using UnityEngine;
3 |
4 | namespace IngameDebugConsole
5 | {
6 | public class CircularBuffer
7 | {
8 | private readonly T[] array;
9 | private int startIndex;
10 |
11 | public int Count { get; private set; }
12 | public T this[int index] { get { return array[( startIndex + index ) % array.Length]; } }
13 |
14 | public CircularBuffer( int capacity )
15 | {
16 | array = new T[capacity];
17 | }
18 |
19 | // Old elements are overwritten when capacity is reached
20 | public void Add( T value )
21 | {
22 | if( Count < array.Length )
23 | array[Count++] = value;
24 | else
25 | {
26 | array[startIndex] = value;
27 | if( ++startIndex >= array.Length )
28 | startIndex = 0;
29 | }
30 | }
31 |
32 | public T[] ToArray()
33 | {
34 | T[] result = new T[Count];
35 | for (int i = 0; i < Count; i++)
36 | result[i] = this[i];
37 |
38 | return result;
39 | }
40 | }
41 |
42 | public class DynamicCircularBuffer
43 | {
44 | private T[] array;
45 | private int startIndex;
46 |
47 | public int Count { get; private set; }
48 | public int Capacity { get { return array.Length; } }
49 |
50 | public T this[int index]
51 | {
52 | get { return array[( startIndex + index ) % array.Length]; }
53 | set { array[( startIndex + index ) % array.Length] = value; }
54 | }
55 |
56 | public DynamicCircularBuffer( int initialCapacity = 2 )
57 | {
58 | array = new T[initialCapacity];
59 | }
60 |
61 | private void SetCapacity( int capacity )
62 | {
63 | T[] newArray = new T[capacity];
64 | if( Count > 0 )
65 | {
66 | int elementsBeforeWrap = Mathf.Min( Count, array.Length - startIndex );
67 | Array.Copy( array, startIndex, newArray, 0, elementsBeforeWrap );
68 | if( elementsBeforeWrap < Count )
69 | Array.Copy( array, 0, newArray, elementsBeforeWrap, Count - elementsBeforeWrap );
70 | }
71 |
72 | array = newArray;
73 | startIndex = 0;
74 | }
75 |
76 | /// Inserts the value to the beginning of the collection.
77 | public void AddFirst( T value )
78 | {
79 | if( array.Length == Count )
80 | SetCapacity( Mathf.Max( array.Length * 2, 4 ) );
81 |
82 | startIndex = ( startIndex > 0 ) ? ( startIndex - 1 ) : ( array.Length - 1 );
83 | array[startIndex] = value;
84 | Count++;
85 | }
86 |
87 | /// Adds the value to the end of the collection.
88 | public void Add( T value )
89 | {
90 | if( array.Length == Count )
91 | SetCapacity( Mathf.Max( array.Length * 2, 4 ) );
92 |
93 | this[Count++] = value;
94 | }
95 |
96 | public void AddRange( DynamicCircularBuffer other )
97 | {
98 | if( other.Count == 0 )
99 | return;
100 |
101 | if( array.Length < Count + other.Count )
102 | SetCapacity( Mathf.Max( array.Length * 2, Count + other.Count ) );
103 |
104 | int insertStartIndex = ( startIndex + Count ) % array.Length;
105 | int elementsBeforeWrap = Mathf.Min( other.Count, array.Length - insertStartIndex );
106 | int otherElementsBeforeWrap = Mathf.Min( other.Count, other.array.Length - other.startIndex );
107 |
108 | Array.Copy( other.array, other.startIndex, array, insertStartIndex, Mathf.Min( elementsBeforeWrap, otherElementsBeforeWrap ) );
109 | if( elementsBeforeWrap < otherElementsBeforeWrap ) // This array wrapped before the other array
110 | Array.Copy( other.array, other.startIndex + elementsBeforeWrap, array, 0, otherElementsBeforeWrap - elementsBeforeWrap );
111 | else if( elementsBeforeWrap > otherElementsBeforeWrap ) // The other array wrapped before this array
112 | Array.Copy( other.array, 0, array, insertStartIndex + otherElementsBeforeWrap, elementsBeforeWrap - otherElementsBeforeWrap );
113 |
114 | int copiedElements = Mathf.Max( elementsBeforeWrap, otherElementsBeforeWrap );
115 | if( copiedElements < other.Count ) // Both arrays wrapped and there's still some elements left to copy
116 | Array.Copy( other.array, copiedElements - otherElementsBeforeWrap, array, copiedElements - elementsBeforeWrap, other.Count - copiedElements );
117 |
118 | Count += other.Count;
119 | }
120 |
121 | public T RemoveFirst()
122 | {
123 | T element = array[startIndex];
124 | array[startIndex] = default( T );
125 |
126 | if( ++startIndex == array.Length )
127 | startIndex = 0;
128 |
129 | Count--;
130 | return element;
131 | }
132 |
133 | public T RemoveLast()
134 | {
135 | int index = ( startIndex + Count - 1 ) % array.Length;
136 | T element = array[index];
137 | array[index] = default( T );
138 |
139 | Count--;
140 | return element;
141 | }
142 |
143 | public int RemoveAll( Predicate shouldRemoveElement )
144 | {
145 | return RemoveAll( shouldRemoveElement, null, null );
146 | }
147 |
148 | public int RemoveAll( Predicate shouldRemoveElement, Action onElementIndexChanged, DynamicCircularBuffer synchronizedBuffer )
149 | {
150 | Y[] synchronizedArray = ( synchronizedBuffer != null ) ? synchronizedBuffer.array : null;
151 | int elementsBeforeWrap = Mathf.Min( Count, array.Length - startIndex );
152 | int removedElements = 0;
153 | int i = startIndex, newIndex = startIndex, endIndex = startIndex + elementsBeforeWrap;
154 | for( ; i < endIndex; i++ )
155 | {
156 | if( shouldRemoveElement( array[i] ) )
157 | removedElements++;
158 | else
159 | {
160 | if( removedElements > 0 )
161 | {
162 | T element = array[i];
163 | array[newIndex] = element;
164 |
165 | if( synchronizedArray != null )
166 | synchronizedArray[newIndex] = synchronizedArray[i];
167 |
168 | if( onElementIndexChanged != null )
169 | onElementIndexChanged( element, newIndex - startIndex );
170 | }
171 |
172 | newIndex++;
173 | }
174 | }
175 |
176 | i = 0;
177 | endIndex = Count - elementsBeforeWrap;
178 |
179 | if( newIndex < array.Length )
180 | {
181 | for( ; i < endIndex; i++ )
182 | {
183 | if( shouldRemoveElement( array[i] ) )
184 | removedElements++;
185 | else
186 | {
187 | T element = array[i];
188 | array[newIndex] = element;
189 |
190 | if( synchronizedArray != null )
191 | synchronizedArray[newIndex] = synchronizedArray[i];
192 |
193 | if( onElementIndexChanged != null )
194 | onElementIndexChanged( element, newIndex - startIndex );
195 |
196 | if( ++newIndex == array.Length )
197 | {
198 | i++;
199 | break;
200 | }
201 | }
202 | }
203 | }
204 |
205 | if( newIndex == array.Length )
206 | {
207 | newIndex = 0;
208 | for( ; i < endIndex; i++ )
209 | {
210 | if( shouldRemoveElement( array[i] ) )
211 | removedElements++;
212 | else
213 | {
214 | if( removedElements > 0 )
215 | {
216 | T element = array[i];
217 | array[newIndex] = element;
218 |
219 | if( synchronizedArray != null )
220 | synchronizedArray[newIndex] = synchronizedArray[i];
221 |
222 | if( onElementIndexChanged != null )
223 | onElementIndexChanged( element, newIndex + elementsBeforeWrap );
224 | }
225 |
226 | newIndex++;
227 | }
228 | }
229 | }
230 |
231 | TrimEnd( removedElements );
232 | if( synchronizedBuffer != null )
233 | synchronizedBuffer.TrimEnd( removedElements );
234 |
235 | return removedElements;
236 | }
237 |
238 | public void TrimStart( int trimCount, Action perElementCallback = null )
239 | {
240 | TrimInternal( trimCount, startIndex, perElementCallback );
241 | startIndex = ( startIndex + trimCount ) % array.Length;
242 | }
243 |
244 | public void TrimEnd( int trimCount, Action perElementCallback = null )
245 | {
246 | TrimInternal( trimCount, ( startIndex + Count - trimCount ) % array.Length, perElementCallback );
247 | }
248 |
249 | private void TrimInternal( int trimCount, int startIndex, Action perElementCallback )
250 | {
251 | int elementsBeforeWrap = Mathf.Min( trimCount, array.Length - startIndex );
252 | if( perElementCallback == null )
253 | {
254 | Array.Clear( array, startIndex, elementsBeforeWrap );
255 | if( elementsBeforeWrap < trimCount )
256 | Array.Clear( array, 0, trimCount - elementsBeforeWrap );
257 | }
258 | else
259 | {
260 | for( int i = startIndex, endIndex = startIndex + elementsBeforeWrap; i < endIndex; i++ )
261 | {
262 | perElementCallback( array[i] );
263 | array[i] = default( T );
264 | }
265 |
266 | for( int i = 0, endIndex = trimCount - elementsBeforeWrap; i < endIndex; i++ )
267 | {
268 | perElementCallback( array[i] );
269 | array[i] = default( T );
270 | }
271 | }
272 |
273 | Count -= trimCount;
274 | }
275 |
276 | public void Clear()
277 | {
278 | int elementsBeforeWrap = Mathf.Min( Count, array.Length - startIndex );
279 | Array.Clear( array, startIndex, elementsBeforeWrap );
280 | if( elementsBeforeWrap < Count )
281 | Array.Clear( array, 0, Count - elementsBeforeWrap );
282 |
283 | startIndex = 0;
284 | Count = 0;
285 | }
286 |
287 | public int IndexOf( T value )
288 | {
289 | int elementsBeforeWrap = Mathf.Min( Count, array.Length - startIndex );
290 | int index = Array.IndexOf( array, value, startIndex, elementsBeforeWrap );
291 | if( index >= 0 )
292 | return index - startIndex;
293 |
294 | if( elementsBeforeWrap < Count )
295 | {
296 | index = Array.IndexOf( array, value, 0, Count - elementsBeforeWrap );
297 | if( index >= 0 )
298 | return index + elementsBeforeWrap;
299 | }
300 |
301 | return -1;
302 | }
303 |
304 | public void ForEach( Action action )
305 | {
306 | int elementsBeforeWrap = Mathf.Min( Count, array.Length - startIndex );
307 | for( int i = startIndex, endIndex = startIndex + elementsBeforeWrap; i < endIndex; i++ )
308 | action( array[i] );
309 | for( int i = 0, endIndex = Count - elementsBeforeWrap; i < endIndex; i++ )
310 | action( array[i] );
311 | }
312 | }
313 | }
--------------------------------------------------------------------------------
/.github/README.md:
--------------------------------------------------------------------------------
1 | # In-game Debug Console for Unity 3D
2 |
3 |
4 |
5 | **Available on Asset Store:** https://assetstore.unity.com/packages/tools/gui/in-game-debug-console-68068
6 |
7 | **Forum Thread:** http://forum.unity3d.com/threads/in-game-debug-console-with-ugui-free.411323/
8 |
9 | **Discord:** https://discord.gg/UJJt549AaV
10 |
11 | **[GitHub Sponsors ☕](https://github.com/sponsors/yasirkula)**
12 |
13 | ## ABOUT
14 |
15 | This asset helps you see debug messages (logs, warnings, errors, exceptions) runtime in a build (also assertions in editor) and execute commands using its built-in console. It also supports logging *logcat* messages to the console on Android platform.
16 |
17 | User interface is created with **uGUI** and costs **1 SetPass call** (and 6 to 10 batches) when *Sprite Packing* is enabled. It is possible to resize or hide the console window during the game. Once the console is hidden, a small popup will take its place (which can be dragged around). The popup will show the number of logs that arrived since it had appeared. Console window will reappear after clicking the popup.
18 |
19 | 
20 |
21 | Console window is optimized using a customized recycled list view that calls *Instantiate* function sparingly.
22 |
23 | ## INSTALLATION
24 |
25 | There are 5 ways to install this plugin:
26 |
27 | - import [IngameDebugConsole.unitypackage](https://github.com/yasirkula/UnityIngameDebugConsole/releases) via *Assets-Import Package*
28 | - clone/[download](https://github.com/yasirkula/UnityIngameDebugConsole/archive/master.zip) this repository and move the *Plugins* folder to your Unity project's *Assets* folder
29 | - import it from [Asset Store](https://assetstore.unity.com/packages/tools/gui/in-game-debug-console-68068)
30 | - *(via Package Manager)* click the + button and install the package from the following git URL:
31 | - `https://github.com/yasirkula/UnityIngameDebugConsole.git`
32 | - *(via [OpenUPM](https://openupm.com))* after installing [openupm-cli](https://github.com/openupm/openupm-cli), run the following command:
33 | - `openupm add com.yasirkula.ingamedebugconsole`
34 |
35 | ## FAQ
36 |
37 | - **New Input System isn't supported on Unity 2019.2.5 or earlier**
38 |
39 | Add `ENABLE_INPUT_SYSTEM` compiler directive to **Player Settings/Scripting Define Symbols** (these symbols are platform specific, so if you change the active platform later, you'll have to add the compiler directive again).
40 |
41 | - **"Unity.InputSystem" assembly can't be resolved on Unity 2018.4 or earlier**
42 |
43 | Remove `Unity.InputSystem` assembly from **IngameDebugConsole.Runtime** Assembly Definition File's *Assembly Definition References* list.
44 |
45 | - **"Receive Logcat Logs In Android" isn't working, it says "java.lang.ClassNotFoundException: com.yasirkula.unity.DebugConsoleLogcatLogger" in Logcat**
46 |
47 | If you are sure that your plugin is up-to-date, then enable **Custom Proguard File** option from *Player Settings* and add the following line to that file: `-keep class com.yasirkula.unity.* { *; }`
48 |
49 | ## HOW TO
50 |
51 | Simply place **IngameDebugConsole** prefab to your scene. Hovering the cursor over its properties in the Inspector will reveal explanatory tooltips.
52 |
53 | While testing on Unity editor, right clicking a log entry will open the corresponding line in external script editor, similar to double clicking a log in Unity Console.
54 |
55 | ## COMMAND CONSOLE
56 |
57 | ### Executing Commands
58 |
59 | You can enter commands using the input field at the bottom of the console. To see all available commands, simply type "*help*".
60 |
61 | A command is basically a function that can be called from the console via the command input field. This function can be **static** or an **instance function** (non static), in which case, a living instance is required to call the function. The return type of the function can be anything (including *void*). If the function returns an object, it will be printed to the console. The function can also take any number of parameters; the only restriction applies to the types of these parameters. Supported parameter types are:
62 |
63 | **Primitive types, enums, string, Vector2, Vector3, Vector4, Color, Color32, Vector2Int, Vector3Int, Quaternion, Rect, RectInt, RectOffset, Bounds, BoundsInt, GameObject, any Component type, arrays/Lists of these supported types**
64 |
65 | Note that *GameObject* and *Component* parameters are assigned value using *GameObject.Find*.
66 |
67 | To call a registered command, simply write down the command and then provide the necessary parameters. For example:
68 |
69 | `cube [0 2.5 0]`
70 |
71 | To see the syntax of a command, see the help log:
72 |
73 | `- cube: Creates a cube at specified position -> TestScript.CreateCubeAt(Vector3 position)`
74 |
75 | Here, the command is *cube* and it takes a single *Vector3* parameter. This command calls the *CreateCubeAt* function in the *TestScript* script (see example code below for implementation details).
76 |
77 | Console uses a simple algorithm to parse the command input and has some restrictions:
78 |
79 | - Wrap strings with quotation marks ( " or ' )
80 | - Wrap vectors with brackets ( \[\] ) or parentheses ( () )
81 |
82 | However, there is some flexibility in the syntax, as well:
83 |
84 | - You can provide an empty vector to represent Vector_.zero: \[\]
85 | - You can enter 1 instead of true, or 0 instead of false
86 | - You can enter `null` for null GameObject and/or Component parameters
87 |
88 | ### Registering Custom Commands
89 |
90 | If all the parameters of a function are of supported types, you can register the function to the console in four different ways (all of these methods take optional string parameter(s) at the end to specify custom display names for the registered function's parameter(s)):
91 |
92 | - **ConsoleMethod Attribute** *(not supported on UWP platform)*
93 |
94 | Simply add **IngameDebugConsole.ConsoleMethod** attribute to your functions. These functions must be *public static* and must reside in a *public* class. These constraints do not apply to the other 3 methods.
95 |
96 | ```csharp
97 | using UnityEngine;
98 | using IngameDebugConsole;
99 |
100 | public class TestScript : MonoBehaviour
101 | {
102 | [ConsoleMethod( "cube", "Creates a cube at specified position" )]
103 | public static void CreateCubeAt( Vector3 position )
104 | {
105 | GameObject.CreatePrimitive( PrimitiveType.Cube ).transform.position = position;
106 | }
107 | }
108 | ```
109 |
110 | - **Strongly Typed Functions**
111 |
112 | Use one of the `DebugLogConsole.AddCommand( string command, string description, System.Action method )` variants:
113 |
114 | ```csharp
115 | using UnityEngine;
116 | using IngameDebugConsole;
117 |
118 | public class TestScript : MonoBehaviour
119 | {
120 | void Start()
121 | {
122 | DebugLogConsole.AddCommand( "destroy", "Destroys " + name, Destroy );
123 | DebugLogConsole.AddCommand( "cube", "Creates a cube at specified position", CreateCubeAt );
124 | DebugLogConsole.AddCommand( "child", "Creates a new child object under " + name, AddChild );
125 | }
126 |
127 | void Destroy()
128 | {
129 | Destroy( gameObject );
130 | }
131 |
132 | public static void CreateCubeAt( Vector3 position )
133 | {
134 | GameObject.CreatePrimitive( PrimitiveType.Cube ).transform.position = position;
135 | }
136 |
137 | private GameObject AddChild( string name )
138 | {
139 | GameObject child = new GameObject( name );
140 | child.transform.SetParent( transform );
141 |
142 | return child;
143 | }
144 | }
145 | ```
146 |
147 | - **Static Functions (weakly typed)**
148 |
149 | Use `DebugLogConsole.AddCommandStatic( string command, string description, string methodName, System.Type ownerType )`. Here, **methodName** is the name of the method in string format, and **ownerType** is the type of the owner class. It may seem strange to provide the method name in string and/or provide the type of the class; however, after hours of research, I found it the best way to register any function with any number of parameters and parameter types into the system without knowing the signature of the method.
150 |
151 | ```csharp
152 | using UnityEngine;
153 | using IngameDebugConsole;
154 |
155 | public class TestScript : MonoBehaviour
156 | {
157 | void Start()
158 | {
159 | DebugLogConsole.AddCommandStatic( "cube", "Creates a cube at specified position", "CreateCubeAt", typeof( TestScript ) );
160 | }
161 |
162 | public static void CreateCubeAt( Vector3 position )
163 | {
164 | GameObject.CreatePrimitive( PrimitiveType.Cube ).transform.position = position;
165 | }
166 | }
167 | ```
168 |
169 | - **Instance Functions (weakly typed)**
170 |
171 | Use `DebugLogConsole.AddCommandInstance( string command, string description, string methodName, object instance )`:
172 |
173 | ```csharp
174 | using UnityEngine;
175 | using IngameDebugConsole;
176 |
177 | public class TestScript : MonoBehaviour
178 | {
179 | void Start()
180 | {
181 | DebugLogConsole.AddCommandInstance( "cube", "Creates a cube at specified position", "CreateCubeAt", this );
182 | }
183 |
184 | void CreateCubeAt( Vector3 position )
185 | {
186 | GameObject.CreatePrimitive( PrimitiveType.Cube ).transform.position = position;
187 | }
188 | }
189 | ```
190 |
191 | The only difference with *AddCommandStatic* is that, you have to provide an actual instance of the class that owns the function, instead of the type of the class.
192 |
193 | ### Removing Commands
194 |
195 | Use `DebugLogConsole.RemoveCommand( string command )` or one of the `DebugLogConsole.RemoveCommand( System.Action method )` variants.
196 |
197 | ### Extending Supported Parameter Types
198 |
199 | - **Strongly Typed Functions**
200 |
201 | Use `DebugLogConsole.AddCustomParameterType( Type type, ParseFunction parseFunction, string typeReadableName = null )`:
202 |
203 | ```csharp
204 | using UnityEngine;
205 | using IngameDebugConsole;
206 |
207 | public class TestScript : MonoBehaviour
208 | {
209 | public class Person
210 | {
211 | public string Name;
212 | public int Age;
213 | }
214 |
215 | void Start()
216 | {
217 | // Person parameters can now be used in commands, e.g. ('John Doe' 18)
218 | DebugLogConsole.AddCustomParameterType( typeof( Person ), ParsePerson );
219 | }
220 |
221 | private static bool ParsePerson( string input, out object output )
222 | {
223 | // Split the input
224 | // This will turn ('John Doe' 18) into 2 strings: "John Doe" (without quotes) and "18" (without quotes)
225 | List inputSplit = new List( 2 );
226 | DebugLogConsole.FetchArgumentsFromCommand( input, inputSplit );
227 |
228 | // We need 2 parameters: Name and Age
229 | if( inputSplit.Count != 2 )
230 | {
231 | output = null;
232 | return false;
233 | }
234 |
235 | // Try parsing the age
236 | object age;
237 | if( !DebugLogConsole.ParseInt( inputSplit[1], out age ) )
238 | {
239 | output = null;
240 | return false;
241 | }
242 |
243 | // Create the resulting object and assign it to output
244 | output = new Person()
245 | {
246 | Name = inputSplit[0],
247 | Age = (int) age
248 | };
249 |
250 | // Successfully parsed!
251 | return true;
252 | }
253 | }
254 | ```
255 |
256 | - **ConsoleCustomTypeParser Attribute**
257 |
258 | Simply add **IngameDebugConsole.ConsoleCustomTypeParser** attribute to your functions. These functions must have the following signature: `public static bool ParseFunction( string input, out object output );`
259 |
260 | ```csharp
261 | using UnityEngine;
262 | using IngameDebugConsole;
263 |
264 | public class TestScript : MonoBehaviour
265 | {
266 | [ConsoleCustomTypeParser( typeof( Person ) )]
267 | public static bool ParsePerson( string input, out object output )
268 | {
269 | // Same as above...
270 | }
271 | }
272 | ```
273 |
274 | ### Removing Supported Custom Parameter Types
275 |
276 | Use `DebugLogConsole.RemoveCustomParameterType( Type type )`.
277 |
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Scripts/DebugLogRecycledListView.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using UnityEngine;
3 | using UnityEngine.UI;
4 |
5 | // Handles the log items in an optimized way such that existing log items are
6 | // recycled within the list instead of creating a new log item at each chance
7 | namespace IngameDebugConsole
8 | {
9 | public class DebugLogRecycledListView : MonoBehaviour
10 | {
11 | #pragma warning disable 0649
12 | // Cached components
13 | [SerializeField]
14 | private RectTransform transformComponent;
15 | [SerializeField]
16 | private RectTransform viewportTransform;
17 |
18 | [SerializeField]
19 | private Color logItemNormalColor1;
20 | [SerializeField]
21 | private Color logItemNormalColor2;
22 | [SerializeField]
23 | private Color logItemSelectedColor;
24 | #pragma warning restore 0649
25 |
26 | internal DebugLogManager manager;
27 | private ScrollRect scrollView;
28 |
29 | private float logItemHeight;
30 |
31 | private DynamicCircularBuffer entriesToShow = null;
32 | private DynamicCircularBuffer timestampsOfEntriesToShow = null;
33 |
34 | private DebugLogEntry selectedLogEntry;
35 | private int indexOfSelectedLogEntry = int.MaxValue;
36 | private float heightOfSelectedLogEntry;
37 | private float DeltaHeightOfSelectedLogEntry { get { return heightOfSelectedLogEntry - logItemHeight; } }
38 |
39 | /// These properties are used by and .
40 | private int collapsedOrderOfSelectedLogEntry;
41 | private float scrollDistanceToSelectedLogEntry;
42 |
43 | // Log items used to visualize the visible debug entries
44 | private readonly DynamicCircularBuffer visibleLogItems = new DynamicCircularBuffer( 32 );
45 |
46 | private bool isCollapseOn = false;
47 |
48 | private bool viewportSizeChanged;
49 |
50 | // Current indices of debug entries shown on screen
51 | private int currentTopIndex = -1, currentBottomIndex = -1;
52 |
53 | private System.Predicate shouldRemoveLogItemPredicate;
54 | private System.Action poolLogItemAction;
55 |
56 | public float ItemHeight { get { return logItemHeight; } }
57 | public float SelectedItemHeight { get { return heightOfSelectedLogEntry; } }
58 |
59 | private void Awake()
60 | {
61 | scrollView = viewportTransform.GetComponentInParent();
62 | scrollView.onValueChanged.AddListener( ( pos ) =>
63 | {
64 | if( manager.IsLogWindowVisible )
65 | UpdateItemsInTheList( false );
66 | } );
67 | }
68 |
69 | public void Initialize( DebugLogManager manager, DynamicCircularBuffer entriesToShow, DynamicCircularBuffer timestampsOfEntriesToShow, float logItemHeight )
70 | {
71 | this.manager = manager;
72 | this.entriesToShow = entriesToShow;
73 | this.timestampsOfEntriesToShow = timestampsOfEntriesToShow;
74 | this.logItemHeight = logItemHeight;
75 |
76 | shouldRemoveLogItemPredicate = ShouldRemoveLogItem;
77 | poolLogItemAction = manager.PoolLogItem;
78 | }
79 |
80 | public void SetCollapseMode( bool collapse )
81 | {
82 | isCollapseOn = collapse;
83 | }
84 |
85 | // A log item is clicked, highlight it
86 | public void OnLogItemClicked( DebugLogItem item )
87 | {
88 | OnLogItemClickedInternal( item.Index, item );
89 | }
90 |
91 | // Force expand the log item at specified index
92 | public void SelectAndFocusOnLogItemAtIndex( int itemIndex )
93 | {
94 | if( indexOfSelectedLogEntry != itemIndex ) // Make sure that we aren't deselecting the target log item
95 | OnLogItemClickedInternal( itemIndex );
96 |
97 | float viewportHeight = viewportTransform.rect.height;
98 | float transformComponentCenterYAtTop = viewportHeight * 0.5f;
99 | float transformComponentCenterYAtBottom = transformComponent.sizeDelta.y - viewportHeight * 0.5f;
100 | float transformComponentTargetCenterY = itemIndex * logItemHeight + viewportHeight * 0.5f;
101 | if( transformComponentCenterYAtTop == transformComponentCenterYAtBottom )
102 | scrollView.verticalNormalizedPosition = 0.5f;
103 | else
104 | scrollView.verticalNormalizedPosition = Mathf.Clamp01( Mathf.InverseLerp( transformComponentCenterYAtBottom, transformComponentCenterYAtTop, transformComponentTargetCenterY ) );
105 |
106 | manager.SnapToBottom = false;
107 | }
108 |
109 | private void OnLogItemClickedInternal( int itemIndex, DebugLogItem referenceItem = null )
110 | {
111 | int indexOfPreviouslySelectedLogEntry = indexOfSelectedLogEntry;
112 | DeselectSelectedLogItem();
113 |
114 | if( indexOfPreviouslySelectedLogEntry != itemIndex )
115 | {
116 | selectedLogEntry = entriesToShow[itemIndex];
117 | indexOfSelectedLogEntry = itemIndex;
118 | CalculateSelectedLogEntryHeight( referenceItem );
119 |
120 | manager.SnapToBottom = false;
121 | }
122 |
123 | CalculateContentHeight();
124 | UpdateItemsInTheList( true );
125 |
126 | manager.ValidateScrollPosition();
127 | }
128 |
129 | // Deselect the currently selected log item
130 | public void DeselectSelectedLogItem()
131 | {
132 | selectedLogEntry = null;
133 | indexOfSelectedLogEntry = int.MaxValue;
134 | heightOfSelectedLogEntry = 0f;
135 | }
136 |
137 | ///
138 | /// Cache the currently selected log item's properties so that its position can be restored after is called.
139 | ///
140 | public void OnBeforeFilterLogs()
141 | {
142 | collapsedOrderOfSelectedLogEntry = 0;
143 | scrollDistanceToSelectedLogEntry = 0f;
144 |
145 | if( selectedLogEntry != null )
146 | {
147 | if( !isCollapseOn )
148 | {
149 | for( int i = 0; i < indexOfSelectedLogEntry; i++ )
150 | {
151 | if( entriesToShow[i] == selectedLogEntry )
152 | collapsedOrderOfSelectedLogEntry++;
153 | }
154 | }
155 |
156 | scrollDistanceToSelectedLogEntry = indexOfSelectedLogEntry * ItemHeight - transformComponent.anchoredPosition.y;
157 | }
158 | }
159 |
160 | ///
161 | /// See .
162 | ///
163 | public void OnAfterFilterLogs()
164 | {
165 | // Refresh selected log entry's index
166 | int newIndexOfSelectedLogEntry = -1;
167 | if( selectedLogEntry != null )
168 | {
169 | for( int i = 0; i < entriesToShow.Count; i++ )
170 | {
171 | if( entriesToShow[i] == selectedLogEntry && collapsedOrderOfSelectedLogEntry-- == 0 )
172 | {
173 | newIndexOfSelectedLogEntry = i;
174 | break;
175 | }
176 | }
177 | }
178 |
179 | if( newIndexOfSelectedLogEntry < 0 )
180 | DeselectSelectedLogItem();
181 | else
182 | {
183 | indexOfSelectedLogEntry = newIndexOfSelectedLogEntry;
184 | transformComponent.anchoredPosition = new Vector2( 0f, newIndexOfSelectedLogEntry * ItemHeight - scrollDistanceToSelectedLogEntry );
185 | }
186 | }
187 |
188 | // Number of debug entries may have changed, update the list
189 | public void OnLogEntriesUpdated( bool updateAllVisibleItemContents )
190 | {
191 | CalculateContentHeight();
192 | UpdateItemsInTheList( updateAllVisibleItemContents );
193 | }
194 |
195 | // A single collapsed log entry at specified index is updated, refresh its item if visible
196 | public void OnCollapsedLogEntryAtIndexUpdated( int index )
197 | {
198 | if( index >= currentTopIndex && index <= currentBottomIndex )
199 | {
200 | DebugLogItem logItem = GetLogItemAtIndex( index );
201 | logItem.ShowCount();
202 |
203 | if( timestampsOfEntriesToShow != null )
204 | logItem.UpdateTimestamp( timestampsOfEntriesToShow[index] );
205 | }
206 | }
207 |
208 | public void RefreshCollapsedLogEntryCounts()
209 | {
210 | for( int i = 0; i < visibleLogItems.Count; i++ )
211 | visibleLogItems[i].ShowCount();
212 | }
213 |
214 | public void OnLogEntriesRemoved( int removedLogCount )
215 | {
216 | if( selectedLogEntry != null )
217 | {
218 | bool isSelectedLogEntryRemoved = isCollapseOn ? ( selectedLogEntry.count == 0 ) : ( indexOfSelectedLogEntry < removedLogCount );
219 | if( isSelectedLogEntryRemoved )
220 | DeselectSelectedLogItem();
221 | else
222 | indexOfSelectedLogEntry = isCollapseOn ? FindIndexOfLogEntryInReverseDirection( selectedLogEntry, indexOfSelectedLogEntry ) : ( indexOfSelectedLogEntry - removedLogCount );
223 | }
224 |
225 | if( !manager.IsLogWindowVisible && manager.SnapToBottom )
226 | {
227 | // When log window becomes visible, it refreshes all logs. So unless snap to bottom is disabled, we don't need to
228 | // keep track of either the scroll position or the visible log items' positions.
229 | visibleLogItems.TrimStart( visibleLogItems.Count, poolLogItemAction );
230 | }
231 | else if( !isCollapseOn )
232 | visibleLogItems.TrimStart( Mathf.Clamp( removedLogCount - currentTopIndex, 0, visibleLogItems.Count ), poolLogItemAction );
233 | else
234 | {
235 | visibleLogItems.RemoveAll( shouldRemoveLogItemPredicate );
236 | if( visibleLogItems.Count > 0 )
237 | removedLogCount = currentTopIndex - FindIndexOfLogEntryInReverseDirection( visibleLogItems[0].Entry, visibleLogItems[0].Index );
238 | }
239 |
240 | if( visibleLogItems.Count == 0 )
241 | {
242 | currentTopIndex = -1;
243 |
244 | if( !manager.SnapToBottom )
245 | transformComponent.anchoredPosition = Vector2.zero;
246 | }
247 | else
248 | {
249 | currentTopIndex = Mathf.Max( 0, currentTopIndex - removedLogCount );
250 | currentBottomIndex = currentTopIndex + visibleLogItems.Count - 1;
251 |
252 | float firstVisibleLogItemInitialYPos = visibleLogItems[0].Transform.anchoredPosition.y;
253 | for( int i = 0; i < visibleLogItems.Count; i++ )
254 | {
255 | DebugLogItem logItem = visibleLogItems[i];
256 | logItem.Index = currentTopIndex + i;
257 |
258 | // If log window is visible, we need to manually refresh the visible items' visual properties. Otherwise, all log items will be refreshed when log window is opened
259 | if( manager.IsLogWindowVisible )
260 | {
261 | RepositionLogItem( logItem );
262 | ColorLogItem( logItem );
263 |
264 | // Update collapsed count of the log items in collapsed mode
265 | if( isCollapseOn )
266 | logItem.ShowCount();
267 | }
268 | }
269 |
270 | // Shift the ScrollRect
271 | if( !manager.SnapToBottom )
272 | transformComponent.anchoredPosition = new Vector2( 0f, Mathf.Max( 0f, transformComponent.anchoredPosition.y - ( visibleLogItems[0].Transform.anchoredPosition.y - firstVisibleLogItemInitialYPos ) ) );
273 | }
274 | }
275 |
276 | private bool ShouldRemoveLogItem( DebugLogItem logItem )
277 | {
278 | if( logItem.Entry.count == 0 )
279 | {
280 | poolLogItemAction( logItem );
281 | return true;
282 | }
283 |
284 | return false;
285 | }
286 |
287 | private int FindIndexOfLogEntryInReverseDirection( DebugLogEntry logEntry, int startIndex )
288 | {
289 | for( int i = Mathf.Min( startIndex, entriesToShow.Count - 1 ); i >= 0; i-- )
290 | {
291 | if( entriesToShow[i] == logEntry )
292 | return i;
293 | }
294 |
295 | return -1;
296 | }
297 |
298 | private void OnRectTransformDimensionsChange()
299 | {
300 | viewportSizeChanged = true;
301 | }
302 |
303 | private void LateUpdate()
304 | {
305 | if (viewportSizeChanged)
306 | {
307 | viewportSizeChanged = false;
308 | OnViewportSizeChanged();
309 | }
310 | }
311 |
312 | private void OnViewportSizeChanged()
313 | {
314 | if (indexOfSelectedLogEntry >= entriesToShow.Count)
315 | {
316 | UpdateItemsInTheList(false);
317 | return;
318 | }
319 |
320 | // Update the expanded (currently selected) log's height
321 | CalculateSelectedLogEntryHeight();
322 | CalculateContentHeight();
323 | UpdateItemsInTheList( true );
324 |
325 | manager.ValidateScrollPosition();
326 | }
327 |
328 | private void CalculateContentHeight()
329 | {
330 | float newHeight = Mathf.Max( 1f, entriesToShow.Count * logItemHeight );
331 | if( selectedLogEntry != null )
332 | newHeight += DeltaHeightOfSelectedLogEntry;
333 |
334 | transformComponent.sizeDelta = new Vector2( 0f, newHeight );
335 | }
336 |
337 | private void CalculateSelectedLogEntryHeight( DebugLogItem referenceItem = null )
338 | {
339 | if( !referenceItem )
340 | {
341 | if( visibleLogItems.Count == 0 )
342 | {
343 | UpdateItemsInTheList( false ); // Try to generate some DebugLogItems, we need one DebugLogItem to calculate the text height
344 | if( visibleLogItems.Count == 0 ) // No DebugLogItems are generated, weird
345 | return;
346 | }
347 |
348 | referenceItem = visibleLogItems[0];
349 | }
350 |
351 | heightOfSelectedLogEntry = referenceItem.CalculateExpandedHeight( selectedLogEntry, ( timestampsOfEntriesToShow != null ) ? timestampsOfEntriesToShow[indexOfSelectedLogEntry] : (DebugLogEntryTimestamp?) null );
352 | }
353 |
354 | // Calculate the indices of log entries to show
355 | // and handle log items accordingly
356 | private void UpdateItemsInTheList( bool updateAllVisibleItemContents )
357 | {
358 | if( entriesToShow.Count > 0 )
359 | {
360 | float contentPosTop = transformComponent.anchoredPosition.y - 1f;
361 | float contentPosBottom = contentPosTop + viewportTransform.rect.height + 2f;
362 | float positionOfSelectedLogEntry = indexOfSelectedLogEntry * logItemHeight;
363 |
364 | if( positionOfSelectedLogEntry <= contentPosBottom )
365 | {
366 | if( positionOfSelectedLogEntry <= contentPosTop )
367 | {
368 | contentPosTop = Mathf.Max( contentPosTop - DeltaHeightOfSelectedLogEntry, positionOfSelectedLogEntry - 1f );
369 | contentPosBottom = Mathf.Max( contentPosBottom - DeltaHeightOfSelectedLogEntry, contentPosTop + 2f );
370 | }
371 | else
372 | contentPosBottom = Mathf.Max( contentPosBottom - DeltaHeightOfSelectedLogEntry, positionOfSelectedLogEntry + 1f );
373 | }
374 |
375 | int newBottomIndex = Mathf.Min( (int) ( contentPosBottom / logItemHeight ), entriesToShow.Count - 1 );
376 | int newTopIndex = Mathf.Clamp( (int) ( contentPosTop / logItemHeight ), 0, newBottomIndex );
377 |
378 | if( currentTopIndex == -1 )
379 | {
380 | // There are no log items visible on screen,
381 | // just create the new log items
382 | updateAllVisibleItemContents = true;
383 | for( int i = 0, count = newBottomIndex - newTopIndex + 1; i < count; i++ )
384 | visibleLogItems.Add( manager.PopLogItem() );
385 | }
386 | else
387 | {
388 | // There are some log items visible on screen
389 |
390 | if( newBottomIndex < currentTopIndex || newTopIndex > currentBottomIndex )
391 | {
392 | // If user scrolled a lot such that, none of the log items are now within
393 | // the bounds of the scroll view, pool all the previous log items and create
394 | // new log items for the new list of visible debug entries
395 | updateAllVisibleItemContents = true;
396 |
397 | visibleLogItems.TrimStart( visibleLogItems.Count, poolLogItemAction );
398 | for( int i = 0, count = newBottomIndex - newTopIndex + 1; i < count; i++ )
399 | visibleLogItems.Add( manager.PopLogItem() );
400 | }
401 | else
402 | {
403 | // User did not scroll a lot such that, there are still some log items within
404 | // the bounds of the scroll view. Don't destroy them but update their content,
405 | // if necessary
406 | if( newTopIndex > currentTopIndex )
407 | visibleLogItems.TrimStart( newTopIndex - currentTopIndex, poolLogItemAction );
408 |
409 | if( newBottomIndex < currentBottomIndex )
410 | visibleLogItems.TrimEnd( currentBottomIndex - newBottomIndex, poolLogItemAction );
411 |
412 | if( newTopIndex < currentTopIndex )
413 | {
414 | for( int i = 0, count = currentTopIndex - newTopIndex; i < count; i++ )
415 | visibleLogItems.AddFirst( manager.PopLogItem() );
416 |
417 | // If it is not necessary to update all the log items,
418 | // then just update the newly created log items. Otherwise,
419 | // wait for the major update
420 | if( !updateAllVisibleItemContents )
421 | UpdateLogItemContentsBetweenIndices( newTopIndex, currentTopIndex - 1, newTopIndex );
422 | }
423 |
424 | if( newBottomIndex > currentBottomIndex )
425 | {
426 | for( int i = 0, count = newBottomIndex - currentBottomIndex; i < count; i++ )
427 | visibleLogItems.Add( manager.PopLogItem() );
428 |
429 | // If it is not necessary to update all the log items,
430 | // then just update the newly created log items. Otherwise,
431 | // wait for the major update
432 | if( !updateAllVisibleItemContents )
433 | UpdateLogItemContentsBetweenIndices( currentBottomIndex + 1, newBottomIndex, newTopIndex );
434 | }
435 | }
436 | }
437 |
438 | currentTopIndex = newTopIndex;
439 | currentBottomIndex = newBottomIndex;
440 |
441 | if( updateAllVisibleItemContents )
442 | {
443 | // Update all the log items
444 | UpdateLogItemContentsBetweenIndices( currentTopIndex, currentBottomIndex, newTopIndex );
445 | }
446 | }
447 | else if( currentTopIndex != -1 )
448 | {
449 | // There is nothing to show but some log items are still visible; pool them
450 | visibleLogItems.TrimStart( visibleLogItems.Count, poolLogItemAction );
451 | currentTopIndex = -1;
452 | }
453 | }
454 |
455 | private DebugLogItem GetLogItemAtIndex( int index )
456 | {
457 | return visibleLogItems[index - currentTopIndex];
458 | }
459 |
460 | private void UpdateLogItemContentsBetweenIndices( int topIndex, int bottomIndex, int logItemOffset )
461 | {
462 | for( int i = topIndex; i <= bottomIndex; i++ )
463 | {
464 | DebugLogItem logItem = visibleLogItems[i - logItemOffset];
465 | logItem.SetContent( entriesToShow[i], ( timestampsOfEntriesToShow != null ) ? timestampsOfEntriesToShow[i] : (DebugLogEntryTimestamp?) null, i, i == indexOfSelectedLogEntry );
466 |
467 | RepositionLogItem( logItem );
468 | ColorLogItem( logItem );
469 |
470 | if( isCollapseOn )
471 | logItem.ShowCount();
472 | else
473 | logItem.HideCount();
474 | }
475 | }
476 |
477 | private void RepositionLogItem( DebugLogItem logItem )
478 | {
479 | int index = logItem.Index;
480 | Vector2 anchoredPosition = new Vector2( 1f, -index * logItemHeight );
481 | if( index > indexOfSelectedLogEntry )
482 | anchoredPosition.y -= DeltaHeightOfSelectedLogEntry;
483 |
484 | logItem.Transform.anchoredPosition = anchoredPosition;
485 | }
486 |
487 | private void ColorLogItem( DebugLogItem logItem )
488 | {
489 | int index = logItem.Index;
490 | if( index == indexOfSelectedLogEntry )
491 | logItem.Image.color = logItemSelectedColor;
492 | else if( index % 2 == 0 )
493 | logItem.Image.color = logItemNormalColor1;
494 | else
495 | logItem.Image.color = logItemNormalColor2;
496 | }
497 | }
498 | }
--------------------------------------------------------------------------------
/Plugins/IngameDebugConsole/Prefabs/DebugLogItem.prefab:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!1 &104862
4 | GameObject:
5 | m_ObjectHideFlags: 0
6 | m_CorrespondingSourceObject: {fileID: 0}
7 | m_PrefabInstance: {fileID: 0}
8 | m_PrefabAsset: {fileID: 0}
9 | serializedVersion: 6
10 | m_Component:
11 | - component: {fileID: 22461494}
12 | - component: {fileID: 22233942}
13 | - component: {fileID: 11411806}
14 | m_Layer: 5
15 | m_Name: LogCount
16 | m_TagString: Untagged
17 | m_Icon: {fileID: 0}
18 | m_NavMeshLayer: 0
19 | m_StaticEditorFlags: 0
20 | m_IsActive: 0
21 | --- !u!224 &22461494
22 | RectTransform:
23 | m_ObjectHideFlags: 0
24 | m_CorrespondingSourceObject: {fileID: 0}
25 | m_PrefabInstance: {fileID: 0}
26 | m_PrefabAsset: {fileID: 0}
27 | m_GameObject: {fileID: 104862}
28 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
29 | m_LocalPosition: {x: 0, y: 0, z: 0}
30 | m_LocalScale: {x: 1, y: 1, z: 1}
31 | m_ConstrainProportionsScale: 0
32 | m_Children:
33 | - {fileID: 22420350}
34 | m_Father: {fileID: 22479264}
35 | m_RootOrder: 2
36 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
37 | m_AnchorMin: {x: 1, y: 0.5}
38 | m_AnchorMax: {x: 1, y: 0.5}
39 | m_AnchoredPosition: {x: -20, y: 0}
40 | m_SizeDelta: {x: 30, y: 25}
41 | m_Pivot: {x: 0.5, y: 0.5}
42 | --- !u!222 &22233942
43 | CanvasRenderer:
44 | m_ObjectHideFlags: 0
45 | m_CorrespondingSourceObject: {fileID: 0}
46 | m_PrefabInstance: {fileID: 0}
47 | m_PrefabAsset: {fileID: 0}
48 | m_GameObject: {fileID: 104862}
49 | m_CullTransparentMesh: 1
50 | --- !u!114 &11411806
51 | MonoBehaviour:
52 | m_ObjectHideFlags: 0
53 | m_CorrespondingSourceObject: {fileID: 0}
54 | m_PrefabInstance: {fileID: 0}
55 | m_PrefabAsset: {fileID: 0}
56 | m_GameObject: {fileID: 104862}
57 | m_Enabled: 1
58 | m_EditorHideFlags: 0
59 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
60 | m_Name:
61 | m_EditorClassIdentifier:
62 | m_Material: {fileID: 0}
63 | m_Color: {r: 0.42647058, g: 0.42647058, b: 0.42647058, a: 1}
64 | m_RaycastTarget: 0
65 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
66 | m_Maskable: 1
67 | m_OnCullStateChanged:
68 | m_PersistentCalls:
69 | m_Calls: []
70 | m_Sprite: {fileID: 21300000, guid: b3f0d976f6d6802479d6465d11b3aa68, type: 3}
71 | m_Type: 1
72 | m_PreserveAspect: 0
73 | m_FillCenter: 1
74 | m_FillMethod: 4
75 | m_FillAmount: 1
76 | m_FillClockwise: 1
77 | m_FillOrigin: 0
78 | m_UseSpriteMesh: 0
79 | m_PixelsPerUnitMultiplier: 1.3
80 | --- !u!1 &151462
81 | GameObject:
82 | m_ObjectHideFlags: 0
83 | m_CorrespondingSourceObject: {fileID: 0}
84 | m_PrefabInstance: {fileID: 0}
85 | m_PrefabAsset: {fileID: 0}
86 | serializedVersion: 6
87 | m_Component:
88 | - component: {fileID: 22420350}
89 | - component: {fileID: 22200920}
90 | - component: {fileID: 5450305048240168820}
91 | m_Layer: 5
92 | m_Name: LogCountText
93 | m_TagString: Untagged
94 | m_Icon: {fileID: 0}
95 | m_NavMeshLayer: 0
96 | m_StaticEditorFlags: 0
97 | m_IsActive: 1
98 | --- !u!224 &22420350
99 | RectTransform:
100 | m_ObjectHideFlags: 0
101 | m_CorrespondingSourceObject: {fileID: 0}
102 | m_PrefabInstance: {fileID: 0}
103 | m_PrefabAsset: {fileID: 0}
104 | m_GameObject: {fileID: 151462}
105 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
106 | m_LocalPosition: {x: 0, y: 0, z: 0}
107 | m_LocalScale: {x: 1, y: 1, z: 1}
108 | m_ConstrainProportionsScale: 0
109 | m_Children: []
110 | m_Father: {fileID: 22461494}
111 | m_RootOrder: 0
112 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
113 | m_AnchorMin: {x: 0, y: 0}
114 | m_AnchorMax: {x: 1, y: 1}
115 | m_AnchoredPosition: {x: 0, y: 0}
116 | m_SizeDelta: {x: -2, y: 0}
117 | m_Pivot: {x: 0.5, y: 0.5}
118 | --- !u!222 &22200920
119 | CanvasRenderer:
120 | m_ObjectHideFlags: 0
121 | m_CorrespondingSourceObject: {fileID: 0}
122 | m_PrefabInstance: {fileID: 0}
123 | m_PrefabAsset: {fileID: 0}
124 | m_GameObject: {fileID: 151462}
125 | m_CullTransparentMesh: 1
126 | --- !u!114 &5450305048240168820
127 | MonoBehaviour:
128 | m_ObjectHideFlags: 0
129 | m_CorrespondingSourceObject: {fileID: 0}
130 | m_PrefabInstance: {fileID: 0}
131 | m_PrefabAsset: {fileID: 0}
132 | m_GameObject: {fileID: 151462}
133 | m_Enabled: 1
134 | m_EditorHideFlags: 0
135 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
136 | m_Name:
137 | m_EditorClassIdentifier:
138 | m_Material: {fileID: 0}
139 | m_Color: {r: 1, g: 1, b: 1, a: 1}
140 | m_RaycastTarget: 0
141 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
142 | m_Maskable: 1
143 | m_OnCullStateChanged:
144 | m_PersistentCalls:
145 | m_Calls: []
146 | m_text: 1
147 | m_isRightToLeft: 0
148 | m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
149 | m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
150 | m_fontSharedMaterials: []
151 | m_fontMaterial: {fileID: 0}
152 | m_fontMaterials: []
153 | m_fontColor32:
154 | serializedVersion: 2
155 | rgba: 4292335574
156 | m_fontColor: {r: 0.83823526, g: 0.84439874, b: 0.84439874, a: 1}
157 | m_enableVertexGradient: 0
158 | m_colorMode: 3
159 | m_fontColorGradient:
160 | topLeft: {r: 1, g: 1, b: 1, a: 1}
161 | topRight: {r: 1, g: 1, b: 1, a: 1}
162 | bottomLeft: {r: 1, g: 1, b: 1, a: 1}
163 | bottomRight: {r: 1, g: 1, b: 1, a: 1}
164 | m_fontColorGradientPreset: {fileID: 0}
165 | m_spriteAsset: {fileID: 0}
166 | m_tintAllSprites: 0
167 | m_StyleSheet: {fileID: 0}
168 | m_TextStyleHashCode: -1183493901
169 | m_overrideHtmlColors: 0
170 | m_faceColor:
171 | serializedVersion: 2
172 | rgba: 4294967295
173 | m_fontSize: 14
174 | m_fontSizeBase: 36
175 | m_fontWeight: 400
176 | m_enableAutoSizing: 1
177 | m_fontSizeMin: 8
178 | m_fontSizeMax: 14
179 | m_fontStyle: 0
180 | m_HorizontalAlignment: 2
181 | m_VerticalAlignment: 512
182 | m_textAlignment: 65535
183 | m_characterSpacing: 0
184 | m_wordSpacing: 0
185 | m_lineSpacing: 0
186 | m_lineSpacingMax: 0
187 | m_paragraphSpacing: 0
188 | m_charWidthMaxAdj: 0
189 | m_enableWordWrapping: 1
190 | m_wordWrappingRatios: 0.4
191 | m_overflowMode: 0
192 | m_linkedTextComponent: {fileID: 0}
193 | parentLinkedComponent: {fileID: 0}
194 | m_enableKerning: 0
195 | m_enableExtraPadding: 0
196 | checkPaddingRequired: 0
197 | m_isRichText: 1
198 | m_parseCtrlCharacters: 0
199 | m_isOrthographic: 1
200 | m_isCullingEnabled: 0
201 | m_horizontalMapping: 0
202 | m_verticalMapping: 0
203 | m_uvLineOffset: 0
204 | m_geometrySortingOrder: 0
205 | m_IsTextObjectScaleStatic: 0
206 | m_VertexBufferAutoSizeReduction: 0
207 | m_useMaxVisibleDescender: 1
208 | m_pageToDisplay: 1
209 | m_margin: {x: 0, y: 0, z: 0, w: 0}
210 | m_isUsingLegacyAnimationComponent: 0
211 | m_isVolumetricText: 0
212 | m_hasFontAssetChanged: 0
213 | m_baseMaterial: {fileID: 0}
214 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
215 | --- !u!1 &152362
216 | GameObject:
217 | m_ObjectHideFlags: 0
218 | m_CorrespondingSourceObject: {fileID: 0}
219 | m_PrefabInstance: {fileID: 0}
220 | m_PrefabAsset: {fileID: 0}
221 | serializedVersion: 6
222 | m_Component:
223 | - component: {fileID: 22427300}
224 | - component: {fileID: 22262284}
225 | - component: {fileID: 11404142}
226 | m_Layer: 5
227 | m_Name: LogType
228 | m_TagString: Untagged
229 | m_Icon: {fileID: 0}
230 | m_NavMeshLayer: 0
231 | m_StaticEditorFlags: 0
232 | m_IsActive: 1
233 | --- !u!224 &22427300
234 | RectTransform:
235 | m_ObjectHideFlags: 0
236 | m_CorrespondingSourceObject: {fileID: 0}
237 | m_PrefabInstance: {fileID: 0}
238 | m_PrefabAsset: {fileID: 0}
239 | m_GameObject: {fileID: 152362}
240 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
241 | m_LocalPosition: {x: 0, y: 0, z: 0}
242 | m_LocalScale: {x: 1, y: 1, z: 1}
243 | m_ConstrainProportionsScale: 0
244 | m_Children: []
245 | m_Father: {fileID: 22479264}
246 | m_RootOrder: 0
247 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
248 | m_AnchorMin: {x: 0, y: 0.5}
249 | m_AnchorMax: {x: 0, y: 0.5}
250 | m_AnchoredPosition: {x: 15, y: 0}
251 | m_SizeDelta: {x: 25, y: 25}
252 | m_Pivot: {x: 0.5, y: 0.5}
253 | --- !u!222 &22262284
254 | CanvasRenderer:
255 | m_ObjectHideFlags: 0
256 | m_CorrespondingSourceObject: {fileID: 0}
257 | m_PrefabInstance: {fileID: 0}
258 | m_PrefabAsset: {fileID: 0}
259 | m_GameObject: {fileID: 152362}
260 | m_CullTransparentMesh: 1
261 | --- !u!114 &11404142
262 | MonoBehaviour:
263 | m_ObjectHideFlags: 0
264 | m_CorrespondingSourceObject: {fileID: 0}
265 | m_PrefabInstance: {fileID: 0}
266 | m_PrefabAsset: {fileID: 0}
267 | m_GameObject: {fileID: 152362}
268 | m_Enabled: 1
269 | m_EditorHideFlags: 0
270 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
271 | m_Name:
272 | m_EditorClassIdentifier:
273 | m_Material: {fileID: 0}
274 | m_Color: {r: 1, g: 1, b: 1, a: 1}
275 | m_RaycastTarget: 0
276 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
277 | m_Maskable: 1
278 | m_OnCullStateChanged:
279 | m_PersistentCalls:
280 | m_Calls: []
281 | m_Sprite: {fileID: 21300000, guid: 5a97d5afa6254804f81b7ba956296996, type: 3}
282 | m_Type: 0
283 | m_PreserveAspect: 0
284 | m_FillCenter: 1
285 | m_FillMethod: 4
286 | m_FillAmount: 1
287 | m_FillClockwise: 1
288 | m_FillOrigin: 0
289 | m_UseSpriteMesh: 0
290 | m_PixelsPerUnitMultiplier: 1
291 | --- !u!1 &166880
292 | GameObject:
293 | m_ObjectHideFlags: 0
294 | m_CorrespondingSourceObject: {fileID: 0}
295 | m_PrefabInstance: {fileID: 0}
296 | m_PrefabAsset: {fileID: 0}
297 | serializedVersion: 6
298 | m_Component:
299 | - component: {fileID: 22479264}
300 | - component: {fileID: 22288988}
301 | - component: {fileID: 11459012}
302 | - component: {fileID: 11408050}
303 | - component: {fileID: 11456372}
304 | - component: {fileID: 225819852034701160}
305 | m_Layer: 5
306 | m_Name: DebugLogItem
307 | m_TagString: Untagged
308 | m_Icon: {fileID: 0}
309 | m_NavMeshLayer: 0
310 | m_StaticEditorFlags: 0
311 | m_IsActive: 1
312 | --- !u!224 &22479264
313 | RectTransform:
314 | m_ObjectHideFlags: 0
315 | m_CorrespondingSourceObject: {fileID: 0}
316 | m_PrefabInstance: {fileID: 0}
317 | m_PrefabAsset: {fileID: 0}
318 | m_GameObject: {fileID: 166880}
319 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
320 | m_LocalPosition: {x: 0, y: 0, z: 0}
321 | m_LocalScale: {x: 1, y: 1, z: 1}
322 | m_ConstrainProportionsScale: 0
323 | m_Children:
324 | - {fileID: 22427300}
325 | - {fileID: 224737693311518052}
326 | - {fileID: 22461494}
327 | - {fileID: 224006190298411330}
328 | m_Father: {fileID: 0}
329 | m_RootOrder: 0
330 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
331 | m_AnchorMin: {x: 0, y: 1}
332 | m_AnchorMax: {x: 1, y: 1}
333 | m_AnchoredPosition: {x: 0, y: 0}
334 | m_SizeDelta: {x: 0, y: 35}
335 | m_Pivot: {x: 0, y: 1}
336 | --- !u!222 &22288988
337 | CanvasRenderer:
338 | m_ObjectHideFlags: 0
339 | m_CorrespondingSourceObject: {fileID: 0}
340 | m_PrefabInstance: {fileID: 0}
341 | m_PrefabAsset: {fileID: 0}
342 | m_GameObject: {fileID: 166880}
343 | m_CullTransparentMesh: 1
344 | --- !u!114 &11459012
345 | MonoBehaviour:
346 | m_ObjectHideFlags: 0
347 | m_CorrespondingSourceObject: {fileID: 0}
348 | m_PrefabInstance: {fileID: 0}
349 | m_PrefabAsset: {fileID: 0}
350 | m_GameObject: {fileID: 166880}
351 | m_Enabled: 1
352 | m_EditorHideFlags: 0
353 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
354 | m_Name:
355 | m_EditorClassIdentifier:
356 | m_Material: {fileID: 0}
357 | m_Color: {r: 0.23529412, g: 0.23529412, b: 0.23529412, a: 0.697}
358 | m_RaycastTarget: 1
359 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
360 | m_Maskable: 1
361 | m_OnCullStateChanged:
362 | m_PersistentCalls:
363 | m_Calls: []
364 | m_Sprite: {fileID: 21300000, guid: 98e8e1cf8dc7dbf469617c2e40c8a944, type: 3}
365 | m_Type: 1
366 | m_PreserveAspect: 0
367 | m_FillCenter: 1
368 | m_FillMethod: 4
369 | m_FillAmount: 1
370 | m_FillClockwise: 1
371 | m_FillOrigin: 0
372 | m_UseSpriteMesh: 0
373 | m_PixelsPerUnitMultiplier: 1
374 | --- !u!114 &11408050
375 | MonoBehaviour:
376 | m_ObjectHideFlags: 0
377 | m_CorrespondingSourceObject: {fileID: 0}
378 | m_PrefabInstance: {fileID: 0}
379 | m_PrefabAsset: {fileID: 0}
380 | m_GameObject: {fileID: 166880}
381 | m_Enabled: 1
382 | m_EditorHideFlags: 0
383 | m_Script: {fileID: 11500000, guid: d2ea291be9de70a4abfec595203c96c1, type: 3}
384 | m_Name:
385 | m_EditorClassIdentifier:
386 | transformComponent: {fileID: 22479264}
387 | imageComponent: {fileID: 11459012}
388 | canvasGroupComponent: {fileID: 225819852034701160}
389 | logText: {fileID: 3887244321031527211}
390 | logTypeImage: {fileID: 11404142}
391 | logCountParent: {fileID: 104862}
392 | logCountText: {fileID: 5450305048240168820}
393 | copyLogButton: {fileID: 114694923173451186}
394 | --- !u!114 &11456372
395 | MonoBehaviour:
396 | m_ObjectHideFlags: 0
397 | m_CorrespondingSourceObject: {fileID: 0}
398 | m_PrefabInstance: {fileID: 0}
399 | m_PrefabAsset: {fileID: 0}
400 | m_GameObject: {fileID: 166880}
401 | m_Enabled: 1
402 | m_EditorHideFlags: 0
403 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
404 | m_Name:
405 | m_EditorClassIdentifier:
406 | m_Navigation:
407 | m_Mode: 3
408 | m_WrapAround: 0
409 | m_SelectOnUp: {fileID: 0}
410 | m_SelectOnDown: {fileID: 0}
411 | m_SelectOnLeft: {fileID: 0}
412 | m_SelectOnRight: {fileID: 0}
413 | m_Transition: 0
414 | m_Colors:
415 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
416 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
417 | m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
418 | m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
419 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
420 | m_ColorMultiplier: 1
421 | m_FadeDuration: 0.1
422 | m_SpriteState:
423 | m_HighlightedSprite: {fileID: 0}
424 | m_PressedSprite: {fileID: 0}
425 | m_SelectedSprite: {fileID: 0}
426 | m_DisabledSprite: {fileID: 0}
427 | m_AnimationTriggers:
428 | m_NormalTrigger: Normal
429 | m_HighlightedTrigger: Highlighted
430 | m_PressedTrigger: Pressed
431 | m_SelectedTrigger: Highlighted
432 | m_DisabledTrigger: Disabled
433 | m_Interactable: 1
434 | m_TargetGraphic: {fileID: 11459012}
435 | m_OnClick:
436 | m_PersistentCalls:
437 | m_Calls: []
438 | --- !u!225 &225819852034701160
439 | CanvasGroup:
440 | m_ObjectHideFlags: 0
441 | m_CorrespondingSourceObject: {fileID: 0}
442 | m_PrefabInstance: {fileID: 0}
443 | m_PrefabAsset: {fileID: 0}
444 | m_GameObject: {fileID: 166880}
445 | m_Enabled: 1
446 | m_Alpha: 1
447 | m_Interactable: 1
448 | m_BlocksRaycasts: 1
449 | m_IgnoreParentGroups: 0
450 | --- !u!1 &1396836967994216
451 | GameObject:
452 | m_ObjectHideFlags: 0
453 | m_CorrespondingSourceObject: {fileID: 0}
454 | m_PrefabInstance: {fileID: 0}
455 | m_PrefabAsset: {fileID: 0}
456 | serializedVersion: 6
457 | m_Component:
458 | - component: {fileID: 224006190298411330}
459 | - component: {fileID: 222870443111501910}
460 | - component: {fileID: 114119781176956926}
461 | - component: {fileID: 114694923173451186}
462 | m_Layer: 5
463 | m_Name: CopyLogButton
464 | m_TagString: Untagged
465 | m_Icon: {fileID: 0}
466 | m_NavMeshLayer: 0
467 | m_StaticEditorFlags: 0
468 | m_IsActive: 0
469 | --- !u!224 &224006190298411330
470 | RectTransform:
471 | m_ObjectHideFlags: 0
472 | m_CorrespondingSourceObject: {fileID: 0}
473 | m_PrefabInstance: {fileID: 0}
474 | m_PrefabAsset: {fileID: 0}
475 | m_GameObject: {fileID: 1396836967994216}
476 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
477 | m_LocalPosition: {x: 0, y: 0, z: 0}
478 | m_LocalScale: {x: 1, y: 1, z: 1}
479 | m_ConstrainProportionsScale: 0
480 | m_Children:
481 | - {fileID: 224887990600088790}
482 | m_Father: {fileID: 22479264}
483 | m_RootOrder: 3
484 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
485 | m_AnchorMin: {x: 0, y: 0}
486 | m_AnchorMax: {x: 1, y: 0}
487 | m_AnchoredPosition: {x: 0, y: 2}
488 | m_SizeDelta: {x: -80, y: 36}
489 | m_Pivot: {x: 0.5, y: 0}
490 | --- !u!222 &222870443111501910
491 | CanvasRenderer:
492 | m_ObjectHideFlags: 0
493 | m_CorrespondingSourceObject: {fileID: 0}
494 | m_PrefabInstance: {fileID: 0}
495 | m_PrefabAsset: {fileID: 0}
496 | m_GameObject: {fileID: 1396836967994216}
497 | m_CullTransparentMesh: 1
498 | --- !u!114 &114119781176956926
499 | MonoBehaviour:
500 | m_ObjectHideFlags: 0
501 | m_CorrespondingSourceObject: {fileID: 0}
502 | m_PrefabInstance: {fileID: 0}
503 | m_PrefabAsset: {fileID: 0}
504 | m_GameObject: {fileID: 1396836967994216}
505 | m_Enabled: 1
506 | m_EditorHideFlags: 0
507 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
508 | m_Name:
509 | m_EditorClassIdentifier:
510 | m_Material: {fileID: 0}
511 | m_Color: {r: 0.42647058, g: 0.42647058, b: 0.42647058, a: 1}
512 | m_RaycastTarget: 1
513 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
514 | m_Maskable: 1
515 | m_OnCullStateChanged:
516 | m_PersistentCalls:
517 | m_Calls: []
518 | m_Sprite: {fileID: 21300000, guid: 066d3840badf4d24dba1d42b4c59b888, type: 3}
519 | m_Type: 1
520 | m_PreserveAspect: 0
521 | m_FillCenter: 1
522 | m_FillMethod: 4
523 | m_FillAmount: 1
524 | m_FillClockwise: 1
525 | m_FillOrigin: 0
526 | m_UseSpriteMesh: 0
527 | m_PixelsPerUnitMultiplier: 1
528 | --- !u!114 &114694923173451186
529 | MonoBehaviour:
530 | m_ObjectHideFlags: 0
531 | m_CorrespondingSourceObject: {fileID: 0}
532 | m_PrefabInstance: {fileID: 0}
533 | m_PrefabAsset: {fileID: 0}
534 | m_GameObject: {fileID: 1396836967994216}
535 | m_Enabled: 1
536 | m_EditorHideFlags: 0
537 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
538 | m_Name:
539 | m_EditorClassIdentifier:
540 | m_Navigation:
541 | m_Mode: 3
542 | m_WrapAround: 0
543 | m_SelectOnUp: {fileID: 0}
544 | m_SelectOnDown: {fileID: 0}
545 | m_SelectOnLeft: {fileID: 0}
546 | m_SelectOnRight: {fileID: 0}
547 | m_Transition: 1
548 | m_Colors:
549 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
550 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
551 | m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
552 | m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
553 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
554 | m_ColorMultiplier: 1
555 | m_FadeDuration: 0.1
556 | m_SpriteState:
557 | m_HighlightedSprite: {fileID: 0}
558 | m_PressedSprite: {fileID: 0}
559 | m_SelectedSprite: {fileID: 0}
560 | m_DisabledSprite: {fileID: 0}
561 | m_AnimationTriggers:
562 | m_NormalTrigger: Normal
563 | m_HighlightedTrigger: Highlighted
564 | m_PressedTrigger: Pressed
565 | m_SelectedTrigger: Highlighted
566 | m_DisabledTrigger: Disabled
567 | m_Interactable: 1
568 | m_TargetGraphic: {fileID: 114119781176956926}
569 | m_OnClick:
570 | m_PersistentCalls:
571 | m_Calls: []
572 | --- !u!1 &1503640463151286
573 | GameObject:
574 | m_ObjectHideFlags: 0
575 | m_CorrespondingSourceObject: {fileID: 0}
576 | m_PrefabInstance: {fileID: 0}
577 | m_PrefabAsset: {fileID: 0}
578 | serializedVersion: 6
579 | m_Component:
580 | - component: {fileID: 224887990600088790}
581 | - component: {fileID: 222313182602304162}
582 | - component: {fileID: 6497267641603342931}
583 | m_Layer: 5
584 | m_Name: Text
585 | m_TagString: Untagged
586 | m_Icon: {fileID: 0}
587 | m_NavMeshLayer: 0
588 | m_StaticEditorFlags: 0
589 | m_IsActive: 1
590 | --- !u!224 &224887990600088790
591 | RectTransform:
592 | m_ObjectHideFlags: 0
593 | m_CorrespondingSourceObject: {fileID: 0}
594 | m_PrefabInstance: {fileID: 0}
595 | m_PrefabAsset: {fileID: 0}
596 | m_GameObject: {fileID: 1503640463151286}
597 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
598 | m_LocalPosition: {x: 0, y: 0, z: 0}
599 | m_LocalScale: {x: 1, y: 1, z: 1}
600 | m_ConstrainProportionsScale: 0
601 | m_Children: []
602 | m_Father: {fileID: 224006190298411330}
603 | m_RootOrder: 0
604 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
605 | m_AnchorMin: {x: 0, y: 0}
606 | m_AnchorMax: {x: 1, y: 1}
607 | m_AnchoredPosition: {x: 0, y: 0}
608 | m_SizeDelta: {x: 0, y: 0}
609 | m_Pivot: {x: 0.5, y: 0.5}
610 | --- !u!222 &222313182602304162
611 | CanvasRenderer:
612 | m_ObjectHideFlags: 0
613 | m_CorrespondingSourceObject: {fileID: 0}
614 | m_PrefabInstance: {fileID: 0}
615 | m_PrefabAsset: {fileID: 0}
616 | m_GameObject: {fileID: 1503640463151286}
617 | m_CullTransparentMesh: 1
618 | --- !u!114 &6497267641603342931
619 | MonoBehaviour:
620 | m_ObjectHideFlags: 0
621 | m_CorrespondingSourceObject: {fileID: 0}
622 | m_PrefabInstance: {fileID: 0}
623 | m_PrefabAsset: {fileID: 0}
624 | m_GameObject: {fileID: 1503640463151286}
625 | m_Enabled: 1
626 | m_EditorHideFlags: 0
627 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
628 | m_Name:
629 | m_EditorClassIdentifier:
630 | m_Material: {fileID: 0}
631 | m_Color: {r: 1, g: 1, b: 1, a: 1}
632 | m_RaycastTarget: 0
633 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
634 | m_Maskable: 1
635 | m_OnCullStateChanged:
636 | m_PersistentCalls:
637 | m_Calls: []
638 | m_text: Copy
639 | m_isRightToLeft: 0
640 | m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
641 | m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
642 | m_fontSharedMaterials: []
643 | m_fontMaterial: {fileID: 0}
644 | m_fontMaterials: []
645 | m_fontColor32:
646 | serializedVersion: 2
647 | rgba: 4292335574
648 | m_fontColor: {r: 0.83823526, g: 0.84439874, b: 0.84439874, a: 1}
649 | m_enableVertexGradient: 0
650 | m_colorMode: 3
651 | m_fontColorGradient:
652 | topLeft: {r: 1, g: 1, b: 1, a: 1}
653 | topRight: {r: 1, g: 1, b: 1, a: 1}
654 | bottomLeft: {r: 1, g: 1, b: 1, a: 1}
655 | bottomRight: {r: 1, g: 1, b: 1, a: 1}
656 | m_fontColorGradientPreset: {fileID: 0}
657 | m_spriteAsset: {fileID: 0}
658 | m_tintAllSprites: 0
659 | m_StyleSheet: {fileID: 0}
660 | m_TextStyleHashCode: -1183493901
661 | m_overrideHtmlColors: 0
662 | m_faceColor:
663 | serializedVersion: 2
664 | rgba: 4294967295
665 | m_fontSize: 16
666 | m_fontSizeBase: 16
667 | m_fontWeight: 400
668 | m_enableAutoSizing: 0
669 | m_fontSizeMin: 1
670 | m_fontSizeMax: 40
671 | m_fontStyle: 0
672 | m_HorizontalAlignment: 2
673 | m_VerticalAlignment: 512
674 | m_textAlignment: 65535
675 | m_characterSpacing: 0
676 | m_wordSpacing: 0
677 | m_lineSpacing: 0
678 | m_lineSpacingMax: 0
679 | m_paragraphSpacing: 0
680 | m_charWidthMaxAdj: 0
681 | m_enableWordWrapping: 1
682 | m_wordWrappingRatios: 0.4
683 | m_overflowMode: 0
684 | m_linkedTextComponent: {fileID: 0}
685 | parentLinkedComponent: {fileID: 0}
686 | m_enableKerning: 0
687 | m_enableExtraPadding: 0
688 | checkPaddingRequired: 0
689 | m_isRichText: 1
690 | m_parseCtrlCharacters: 0
691 | m_isOrthographic: 1
692 | m_isCullingEnabled: 0
693 | m_horizontalMapping: 0
694 | m_verticalMapping: 0
695 | m_uvLineOffset: 0
696 | m_geometrySortingOrder: 0
697 | m_IsTextObjectScaleStatic: 0
698 | m_VertexBufferAutoSizeReduction: 0
699 | m_useMaxVisibleDescender: 1
700 | m_pageToDisplay: 1
701 | m_margin: {x: 0, y: 0, z: 0, w: 0}
702 | m_isUsingLegacyAnimationComponent: 0
703 | m_isVolumetricText: 0
704 | m_hasFontAssetChanged: 0
705 | m_baseMaterial: {fileID: 0}
706 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
707 | --- !u!1 &1785910143472904
708 | GameObject:
709 | m_ObjectHideFlags: 0
710 | m_CorrespondingSourceObject: {fileID: 0}
711 | m_PrefabInstance: {fileID: 0}
712 | m_PrefabAsset: {fileID: 0}
713 | serializedVersion: 6
714 | m_Component:
715 | - component: {fileID: 224737693311518052}
716 | - component: {fileID: 222175805939703770}
717 | - component: {fileID: 3887244321031527211}
718 | m_Layer: 5
719 | m_Name: LogText
720 | m_TagString: Untagged
721 | m_Icon: {fileID: 0}
722 | m_NavMeshLayer: 0
723 | m_StaticEditorFlags: 0
724 | m_IsActive: 1
725 | --- !u!224 &224737693311518052
726 | RectTransform:
727 | m_ObjectHideFlags: 0
728 | m_CorrespondingSourceObject: {fileID: 0}
729 | m_PrefabInstance: {fileID: 0}
730 | m_PrefabAsset: {fileID: 0}
731 | m_GameObject: {fileID: 1785910143472904}
732 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
733 | m_LocalPosition: {x: 0, y: 0, z: 0}
734 | m_LocalScale: {x: 1, y: 1, z: 1}
735 | m_ConstrainProportionsScale: 0
736 | m_Children: []
737 | m_Father: {fileID: 22479264}
738 | m_RootOrder: 1
739 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
740 | m_AnchorMin: {x: 0, y: 0}
741 | m_AnchorMax: {x: 1, y: 1}
742 | m_AnchoredPosition: {x: 12.5, y: 0}
743 | m_SizeDelta: {x: -35, y: 0}
744 | m_Pivot: {x: 0.5, y: 0.5}
745 | --- !u!222 &222175805939703770
746 | CanvasRenderer:
747 | m_ObjectHideFlags: 0
748 | m_CorrespondingSourceObject: {fileID: 0}
749 | m_PrefabInstance: {fileID: 0}
750 | m_PrefabAsset: {fileID: 0}
751 | m_GameObject: {fileID: 1785910143472904}
752 | m_CullTransparentMesh: 1
753 | --- !u!114 &3887244321031527211
754 | MonoBehaviour:
755 | m_ObjectHideFlags: 0
756 | m_CorrespondingSourceObject: {fileID: 0}
757 | m_PrefabInstance: {fileID: 0}
758 | m_PrefabAsset: {fileID: 0}
759 | m_GameObject: {fileID: 1785910143472904}
760 | m_Enabled: 1
761 | m_EditorHideFlags: 0
762 | m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
763 | m_Name:
764 | m_EditorClassIdentifier:
765 | m_Material: {fileID: 0}
766 | m_Color: {r: 1, g: 1, b: 1, a: 1}
767 | m_RaycastTarget: 0
768 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
769 | m_Maskable: 1
770 | m_OnCullStateChanged:
771 | m_PersistentCalls:
772 | m_Calls: []
773 | m_text: Debug.Log summary
774 | m_isRightToLeft: 0
775 | m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
776 | m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
777 | m_fontSharedMaterials: []
778 | m_fontMaterial: {fileID: 0}
779 | m_fontMaterials: []
780 | m_fontColor32:
781 | serializedVersion: 2
782 | rgba: 4292335574
783 | m_fontColor: {r: 0.83823526, g: 0.84439874, b: 0.84439874, a: 1}
784 | m_enableVertexGradient: 0
785 | m_colorMode: 3
786 | m_fontColorGradient:
787 | topLeft: {r: 1, g: 1, b: 1, a: 1}
788 | topRight: {r: 1, g: 1, b: 1, a: 1}
789 | bottomLeft: {r: 1, g: 1, b: 1, a: 1}
790 | bottomRight: {r: 1, g: 1, b: 1, a: 1}
791 | m_fontColorGradientPreset: {fileID: 0}
792 | m_spriteAsset: {fileID: 0}
793 | m_tintAllSprites: 0
794 | m_StyleSheet: {fileID: 0}
795 | m_TextStyleHashCode: -1183493901
796 | m_overrideHtmlColors: 0
797 | m_faceColor:
798 | serializedVersion: 2
799 | rgba: 4294967295
800 | m_fontSize: 13.5
801 | m_fontSizeBase: 13.5
802 | m_fontWeight: 400
803 | m_enableAutoSizing: 0
804 | m_fontSizeMin: 1
805 | m_fontSizeMax: 40
806 | m_fontStyle: 0
807 | m_HorizontalAlignment: 1
808 | m_VerticalAlignment: 512
809 | m_textAlignment: 65535
810 | m_characterSpacing: 0
811 | m_wordSpacing: 0
812 | m_lineSpacing: 0
813 | m_lineSpacingMax: 0
814 | m_paragraphSpacing: 0
815 | m_charWidthMaxAdj: 0
816 | m_enableWordWrapping: 1
817 | m_wordWrappingRatios: 0.4
818 | m_overflowMode: 1
819 | m_linkedTextComponent: {fileID: 0}
820 | parentLinkedComponent: {fileID: 0}
821 | m_enableKerning: 1
822 | m_enableExtraPadding: 0
823 | checkPaddingRequired: 0
824 | m_isRichText: 1
825 | m_parseCtrlCharacters: 0
826 | m_isOrthographic: 1
827 | m_isCullingEnabled: 0
828 | m_horizontalMapping: 0
829 | m_verticalMapping: 0
830 | m_uvLineOffset: 0
831 | m_geometrySortingOrder: 0
832 | m_IsTextObjectScaleStatic: 0
833 | m_VertexBufferAutoSizeReduction: 0
834 | m_useMaxVisibleDescender: 1
835 | m_pageToDisplay: 1
836 | m_margin: {x: 0, y: 0, z: 0, w: 0}
837 | m_isUsingLegacyAnimationComponent: 0
838 | m_isVolumetricText: 0
839 | m_hasFontAssetChanged: 0
840 | m_baseMaterial: {fileID: 0}
841 | m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
842 |
--------------------------------------------------------------------------------