├── .git-images ├── 1.png ├── 2.png ├── 3.png └── 4.png ├── .gitignore ├── Assets ├── Editor.meta ├── Editor │ ├── EditorInputDialog.cs │ ├── EditorInputDialog.cs.meta │ ├── Ripgrep.Types.cs │ ├── Ripgrep.Types.cs.meta │ ├── Ripgrep.cs │ ├── Ripgrep.cs.meta │ ├── RipgrepSearchResultsTreeView.cs │ ├── RipgrepSearchResultsTreeView.cs.meta │ ├── RipgrepSearchWindow.cs │ ├── RipgrepSearchWindow.cs.meta │ ├── RipgrepSettings.cs │ ├── RipgrepSettings.cs.meta │ ├── RipgrepStyles.cs │ ├── RipgrepStyles.cs.meta │ ├── TextMate.cs │ └── TextMate.cs.meta ├── Scenes.meta └── Scenes │ ├── SampleScene.unity │ └── SampleScene.unity.meta ├── LICENSE ├── Packages ├── manifest.json └── packages-lock.json ├── ProjectSettings ├── AudioManager.asset ├── ClusterInputManager.asset ├── DynamicsManager.asset ├── EditorBuildSettings.asset ├── EditorSettings.asset ├── GraphicsSettings.asset ├── InputManager.asset ├── MemorySettings.asset ├── NavMeshAreas.asset ├── NetworkManager.asset ├── PackageManagerSettings.asset ├── Physics2DSettings.asset ├── PresetManager.asset ├── ProjectSettings.asset ├── ProjectVersion.txt ├── QualitySettings.asset ├── TagManager.asset ├── TimeManager.asset ├── UnityConnectSettings.asset ├── VFXManager.asset ├── VersionControlSettings.asset └── XRSettings.asset └── README.md /.git-images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prime31/Unity-Ripgrep-Search-Tool/351e1b190d2f266998a2832e660f956be3271c40/.git-images/1.png -------------------------------------------------------------------------------- /.git-images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prime31/Unity-Ripgrep-Search-Tool/351e1b190d2f266998a2832e660f956be3271c40/.git-images/2.png -------------------------------------------------------------------------------- /.git-images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prime31/Unity-Ripgrep-Search-Tool/351e1b190d2f266998a2832e660f956be3271c40/.git-images/3.png -------------------------------------------------------------------------------- /.git-images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prime31/Unity-Ripgrep-Search-Tool/351e1b190d2f266998a2832e660f956be3271c40/.git-images/4.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # This .gitignore file should be placed at the root of your Unity project directory 2 | # 3 | # Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore 4 | # 5 | /[Ll]ibrary/ 6 | /[Tt]emp/ 7 | /[Oo]bj/ 8 | /[Bb]uild/ 9 | /[Bb]uilds/ 10 | /[Ll]ogs/ 11 | /[Uu]ser[Ss]ettings/ 12 | 13 | # MemoryCaptures can get excessive in size. 14 | # They also could contain extremely sensitive data 15 | /[Mm]emoryCaptures/ 16 | 17 | # Recordings can get excessive in size 18 | /[Rr]ecordings/ 19 | 20 | # Uncomment this line if you wish to ignore the asset store tools plugin 21 | # /[Aa]ssets/AssetStoreTools* 22 | 23 | # Autogenerated Jetbrains Rider plugin 24 | /[Aa]ssets/Plugins/Editor/JetBrains* 25 | 26 | # Visual Studio cache directory 27 | .vs/ 28 | 29 | # Gradle cache directory 30 | .gradle/ 31 | 32 | # Autogenerated VS/MD/Consulo solution and project files 33 | ExportedObj/ 34 | .consulo/ 35 | *.csproj 36 | *.unityproj 37 | *.sln 38 | *.suo 39 | *.tmp 40 | *.user 41 | *.userprefs 42 | *.pidb 43 | *.booproj 44 | *.svd 45 | *.pdb 46 | *.mdb 47 | *.opendb 48 | *.VC.db 49 | 50 | # Unity3D generated meta files 51 | *.pidb.meta 52 | *.pdb.meta 53 | *.mdb.meta 54 | 55 | # Unity3D generated file on crash reports 56 | sysinfo.txt 57 | 58 | # Builds 59 | *.apk 60 | *.aab 61 | *.unitypackage 62 | *.app 63 | 64 | # Crashlytics generated file 65 | crashlytics-build.properties 66 | 67 | # Packed Addressables 68 | /[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin* 69 | 70 | # Temporary auto-generated Android Assets 71 | /[Aa]ssets/[Ss]treamingAssets/aa.meta 72 | /[Aa]ssets/[Ss]treamingAssets/aa/* 73 | .idea 74 | -------------------------------------------------------------------------------- /Assets/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8540282d128904a2ca3e7e2ded91498e 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Editor/EditorInputDialog.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEditor; 3 | using UnityEngine; 4 | 5 | namespace Editor.Tools.Ripgrep 6 | { 7 | public class EditorInputDialog : EditorWindow 8 | { 9 | string description, inputText; 10 | string okButton, cancelButton; 11 | bool initializedPosition; 12 | Action onOKButton; 13 | bool shouldClose; 14 | 15 | void OnGUI() 16 | { 17 | // Check if Esc/Return have been pressed 18 | var e = Event.current; 19 | if (e.type == EventType.KeyDown) 20 | { 21 | switch (e.keyCode) 22 | { 23 | // Escape pressed 24 | case KeyCode.Escape: 25 | shouldClose = true; 26 | e.Use(); 27 | break; 28 | 29 | // Enter pressed 30 | case KeyCode.Return: 31 | case KeyCode.KeypadEnter: 32 | onOKButton?.Invoke(); 33 | shouldClose = true; 34 | e.Use(); 35 | break; 36 | } 37 | } 38 | 39 | if (shouldClose) 40 | Close(); 41 | 42 | // Draw our control 43 | var rect = EditorGUILayout.BeginVertical(); 44 | 45 | EditorGUILayout.Space(12); 46 | EditorGUILayout.LabelField(description); 47 | 48 | EditorGUILayout.Space(8); 49 | GUI.SetNextControlName("inText"); 50 | inputText = EditorGUILayout.TextField("", inputText); 51 | GUI.FocusControl("inText"); 52 | EditorGUILayout.Space(12); 53 | 54 | // OK / Cancel buttons 55 | using (new GUILayout.HorizontalScope()) 56 | { 57 | if (GUILayout.Button(okButton)) 58 | { 59 | onOKButton(); 60 | shouldClose = true; 61 | } 62 | } 63 | 64 | using (new GUILayout.HorizontalScope()) 65 | { 66 | if (GUILayout.Button(cancelButton)) 67 | { 68 | inputText = null; 69 | shouldClose = true; 70 | } 71 | } 72 | 73 | EditorGUILayout.Space(8); 74 | EditorGUILayout.EndVertical(); 75 | 76 | // Force change size of the window 77 | if (rect.width != 0 && minSize != rect.size) 78 | minSize = maxSize = rect.size; 79 | 80 | // Set dialog position next to mouse position 81 | if (!initializedPosition && e.type == EventType.Layout) 82 | { 83 | initializedPosition = true; 84 | Focus(); 85 | } 86 | } 87 | 88 | public static string Show(string title, string description, string inputText, string okButton = "OK", string cancelButton = "Cancel") 89 | { 90 | string ret = null; 91 | 92 | var window = CreateInstance(); 93 | window.titleContent = new GUIContent(title); 94 | window.description = description; 95 | window.inputText = inputText ?? string.Empty; 96 | window.okButton = okButton; 97 | window.cancelButton = cancelButton; 98 | window.onOKButton += () => ret = window.inputText; 99 | window.ShowModalUtility(); 100 | window.Repaint(); 101 | 102 | return ret; 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /Assets/Editor/EditorInputDialog.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 98b0fc90ec32c46cb947920c50656d16 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Editor/Ripgrep.Types.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Editor.Tools.Ripgrep 4 | { 5 | // used to extract just the type. The data object can be multiple types so its ignored here. 6 | [System.Serializable] 7 | struct JsonLine 8 | { 9 | public string type; 10 | } 11 | 12 | // type: begin 13 | [System.Serializable] 14 | public struct JsonBegin 15 | { 16 | public string type; 17 | public BeginData data; 18 | } 19 | 20 | [System.Serializable] 21 | public struct BeginData 22 | { 23 | public Text path; 24 | } 25 | 26 | // type: end 27 | [System.Serializable] 28 | public struct JsonEnd 29 | { 30 | public string type; 31 | public EndData EndData; 32 | } 33 | 34 | [System.Serializable] 35 | public struct EndData 36 | { 37 | public Text path; 38 | public object binary_offset; 39 | public Stats stats; 40 | } 41 | 42 | [System.Serializable] 43 | public struct Elapsed 44 | { 45 | public int secs; 46 | public int nanos; 47 | public string human; 48 | } 49 | 50 | [System.Serializable] 51 | public struct Stats 52 | { 53 | public Elapsed elapsed; 54 | public int searches; 55 | public int searches_with_match; 56 | public int bytes_searched; 57 | public int bytes_printed; 58 | public int matched_lines; 59 | public int matches; 60 | } 61 | 62 | // type: match 63 | [System.Serializable] 64 | public struct JsonMatch 65 | { 66 | public string type; 67 | public MatchData data; 68 | } 69 | 70 | [System.Serializable] 71 | public struct MatchData 72 | { 73 | public Text path; 74 | public Text lines; 75 | public int line_number; 76 | public int absolute_offset; 77 | public List submatches; 78 | } 79 | 80 | [System.Serializable] 81 | public struct Submatch 82 | { 83 | public Text match; 84 | public int start; 85 | public int end; 86 | } 87 | 88 | // type: summary 89 | [System.Serializable] 90 | public class JsonSummary 91 | { 92 | public SummaryData data; 93 | public string type; 94 | } 95 | 96 | [System.Serializable] 97 | public class SummaryData 98 | { 99 | public Elapsed elapsed_total; 100 | public Stats stats; 101 | } 102 | 103 | // Common text type 104 | 105 | [System.Serializable] 106 | public struct Text 107 | { 108 | public string text; 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /Assets/Editor/Ripgrep.Types.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2f3d0b9d0c08483cb20ac90dc6f634eb 3 | timeCreated: 1689958483 -------------------------------------------------------------------------------- /Assets/Editor/Ripgrep.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Diagnostics; 4 | using System.Text; 5 | using System.Threading; 6 | using System.Threading.Tasks; 7 | using UnityEditor; 8 | using UnityEngine; 9 | 10 | namespace Editor.Tools.Ripgrep 11 | { 12 | public class Ripgrep 13 | { 14 | public struct Options 15 | { 16 | #if UNITY_EDITOR_WIN 17 | const string QUOTE = "\""; 18 | const string RIPGREP_CMD = "rg "; 19 | #else 20 | const string QUOTE = "'"; 21 | const string RIPGREP_CMD = "/usr/local/bin/rg "; 22 | #endif 23 | public string SearchTerm; 24 | public string WorkingDir; 25 | public bool LiteralStringSearch; // -F, disables regex 26 | public bool IgnoreCase; // -i 27 | public bool Multiline; // --multiline 28 | public string[] IncludedFileTypes; // -g '*.{asset,unity}' or -g 'Assets/**/*.{asset}' 29 | public string[] ExcludedFileTypes; // -g '!*.{asset}' or -g '!Assets/**/*.{asset}' 30 | public string[] SearchFolders; 31 | public string[] AdditionalArgs; 32 | public int ThreadCount; 33 | public Action OnResultParsed; 34 | 35 | internal string GetCommand() 36 | { 37 | AdditionalArgs ??= Array.Empty(); 38 | Array.Resize(ref AdditionalArgs, AdditionalArgs.Length + 1); 39 | AdditionalArgs[^1] = "--json"; 40 | 41 | if (ThreadCount > 1) 42 | { 43 | Array.Resize(ref AdditionalArgs, AdditionalArgs.Length + 2); 44 | AdditionalArgs[^2] = "-j"; 45 | AdditionalArgs[^1] = ThreadCount.ToString(); 46 | } 47 | 48 | if (IgnoreCase) 49 | { 50 | Array.Resize(ref AdditionalArgs, AdditionalArgs.Length + 1); 51 | AdditionalArgs[^1] = "-i"; 52 | } 53 | else // default to Smart Case, -S 54 | { 55 | Array.Resize(ref AdditionalArgs, AdditionalArgs.Length + 1); 56 | AdditionalArgs[^1] = "-S"; 57 | } 58 | 59 | if (Multiline) 60 | { 61 | Array.Resize(ref AdditionalArgs, AdditionalArgs.Length + 1); 62 | AdditionalArgs[^1] = "--multiline"; 63 | } 64 | 65 | if (LiteralStringSearch) 66 | { 67 | Array.Resize(ref AdditionalArgs, AdditionalArgs.Length + 1); 68 | AdditionalArgs[^1] = "-F"; 69 | } 70 | 71 | // add our folders including file type filters if present. This is done for each SearchFolder if we have any 72 | if (SearchFolders?.Length > 0) 73 | { 74 | var includeExtensions = IncludedFileTypes?.Length > 0 ? string.Join(',', IncludedFileTypes) : "*"; 75 | var includeTypeFilter = $"*.{{{includeExtensions}}}"; 76 | foreach (var folder in SearchFolders) 77 | { 78 | Array.Resize(ref AdditionalArgs, AdditionalArgs.Length + 2); 79 | AdditionalArgs[^2] = "-g"; 80 | AdditionalArgs[^1] = $"{QUOTE}{folder}/**/{includeTypeFilter}{QUOTE}"; 81 | } 82 | 83 | if (ExcludedFileTypes?.Length > 0) 84 | { 85 | var excludeTypeFilter = $"*.{{{string.Join(',', ExcludedFileTypes)}}}"; 86 | foreach (var folder in SearchFolders) 87 | { 88 | Array.Resize(ref AdditionalArgs, AdditionalArgs.Length + 2); 89 | AdditionalArgs[^2] = "-g"; 90 | AdditionalArgs[^1] = $"{QUOTE}!{folder}/**/{excludeTypeFilter}{QUOTE}"; 91 | } 92 | } 93 | } 94 | else 95 | { 96 | if (IncludedFileTypes?.Length > 0) // no folders but we have filetypes to glob for so add them 97 | { 98 | Array.Resize(ref AdditionalArgs, AdditionalArgs.Length + 2); 99 | AdditionalArgs[^2] = "-g"; 100 | AdditionalArgs[^1] = $"{QUOTE}*.{{{string.Join(',', IncludedFileTypes)}}}{QUOTE}"; 101 | } 102 | 103 | if (ExcludedFileTypes?.Length > 0) 104 | { 105 | Array.Resize(ref AdditionalArgs, AdditionalArgs.Length + 2); 106 | AdditionalArgs[^2] = "-g"; 107 | AdditionalArgs[^1] = $"{QUOTE}*.{{{string.Join(',', ExcludedFileTypes)}}}{QUOTE}"; 108 | } 109 | } 110 | 111 | var command = new StringBuilder(RIPGREP_CMD); 112 | var searchStrings = SearchTerm.Split(' '); 113 | for (var i = 0; i < searchStrings.Length; i++) 114 | command.Append($"-e {QUOTE}{searchStrings[i]}{QUOTE} "); 115 | 116 | if (AdditionalArgs != null) 117 | command.AppendJoin(' ', AdditionalArgs); 118 | return command.ToString(); 119 | } 120 | 121 | public void RestrictToUnityAssetFiles() => IncludedFileTypes = new[] { "asset", "prefab", "unity" }; 122 | 123 | public void AddIncludedFileType(string extension) 124 | { 125 | IncludedFileTypes ??= Array.Empty(); 126 | Array.Resize(ref IncludedFileTypes, IncludedFileTypes.Length + 1); 127 | IncludedFileTypes[^1] = extension; 128 | } 129 | 130 | public void AddExcludedFileType(string extension) 131 | { 132 | ExcludedFileTypes ??= Array.Empty(); 133 | Array.Resize(ref ExcludedFileTypes, ExcludedFileTypes.Length + 1); 134 | ExcludedFileTypes[^1] = extension; 135 | } 136 | 137 | public void AddSearchFolder(string folder) 138 | { 139 | SearchFolders ??= Array.Empty(); 140 | Array.Resize(ref SearchFolders, SearchFolders.Length + 1); 141 | SearchFolders[^1] = folder; 142 | } 143 | } 144 | 145 | public class Results 146 | { 147 | public string Text; 148 | public int LineNumber = -1; 149 | public List Children = new(); 150 | } 151 | 152 | public class Future 153 | { 154 | double StartTime; 155 | Action onComplete; 156 | internal CancellationTokenSource cancellationTokenSource = new(); 157 | public Future() => StartTime = EditorApplication.timeSinceStartup; 158 | public double GetElapsedTime() => EditorApplication.timeSinceStartup - StartTime; 159 | public void WhenComplete(Action action) => onComplete = action; 160 | public void SetResults(Results[] value) => onComplete?.Invoke(value); 161 | public void Cancel() => cancellationTokenSource.Cancel(); 162 | } 163 | 164 | /// Runs the command in a Task. The Future will trigger on the main thread. 165 | public static Future RunAsync(Options opts, CancellationToken? token = null) 166 | { 167 | var future = new Future(); 168 | Task.Run(() => 169 | { 170 | var res = Run(opts, future.cancellationTokenSource.Token); 171 | EditorApplication.delayCall += () => future.SetResults(res); 172 | }, future.cancellationTokenSource.Token); 173 | return future; 174 | } 175 | 176 | /// Runs the Ripgrep command and parses the results 177 | public static Results[] Run(Options opts, CancellationToken? token = null) 178 | { 179 | var processStartInfo = GetProcessStartInfo(opts); 180 | var process = Process.Start(processStartInfo) ?? throw new Exception("Process failed to start"); 181 | 182 | var results = new List(); 183 | Results currentResult = default; 184 | string json; 185 | while ((json = process.StandardOutput.ReadLine()) != null) 186 | { 187 | if (token.HasValue && token.Value.IsCancellationRequested) 188 | { 189 | process.Kill(); 190 | process.Dispose(); 191 | return results.ToArray(); 192 | } 193 | 194 | var jsonLine = JsonUtility.FromJson(json); 195 | switch (jsonLine.type) 196 | { 197 | case "begin": 198 | var beginData = JsonUtility.FromJson(json).data; 199 | currentResult = new Results 200 | { 201 | Text = beginData.path.text 202 | }; 203 | results.Add(currentResult); 204 | 205 | if (opts.OnResultParsed != null) 206 | { 207 | var cnt = results.Count; 208 | EditorApplication.delayCall += () => opts.OnResultParsed(cnt); 209 | } 210 | break; 211 | case "match": 212 | var matchData = JsonUtility.FromJson(json).data; 213 | 214 | currentResult.Children.Add(new Results 215 | { 216 | LineNumber = matchData.line_number, 217 | Text = matchData.lines.text.Trim() 218 | }); 219 | break; 220 | case "end": 221 | currentResult = null; 222 | break; 223 | case "summary": // stats, not very useful 224 | // var summaryData = JsonUtility.FromJson(json).data; 225 | goto LoopDone; // Windows never exits the loop so we use this to jump out when we hit a summary 226 | case "context": // never seen it returned 227 | break; 228 | } 229 | } 230 | 231 | LoopDone: 232 | 233 | while ((json = process.StandardError.ReadLine()) != null) 234 | UnityEngine.Debug.LogError(json); 235 | 236 | process.WaitForExit(); 237 | process.Dispose(); 238 | 239 | return results.ToArray(); 240 | } 241 | 242 | static ProcessStartInfo GetProcessStartInfo(Options opts) 243 | { 244 | opts.WorkingDir ??= Environment.CurrentDirectory; 245 | 246 | var command = opts.GetCommand(); 247 | 248 | #if UNITY_EDITOR_OSX 249 | return new ProcessStartInfo 250 | { 251 | FileName = "/bin/zsh", 252 | Arguments = $"-c \"{command}\"", 253 | UseShellExecute = false, 254 | RedirectStandardOutput = true, 255 | RedirectStandardError = true, 256 | CreateNoWindow = true, 257 | WorkingDirectory = opts.WorkingDir 258 | }; 259 | #else 260 | var workingDirectory = opts.WorkingDir.Replace("/", "\\"); 261 | return new ProcessStartInfo 262 | { 263 | FileName = "CMD.EXE", 264 | Arguments = $"/K \" {command} \"", 265 | UseShellExecute = false, 266 | RedirectStandardOutput = true, 267 | RedirectStandardError = true, 268 | CreateNoWindow = true, 269 | WorkingDirectory = opts.WorkingDir 270 | }; 271 | #endif 272 | } 273 | } 274 | } 275 | -------------------------------------------------------------------------------- /Assets/Editor/Ripgrep.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4dd186edd2f564de2a8554eac0211603 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Editor/RipgrepSearchResultsTreeView.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using UnityEditor.IMGUI.Controls; 4 | using UnityEngine; 5 | 6 | namespace Editor.Tools.Ripgrep 7 | { 8 | public class RipgrepSearchResultsTreeView : TreeView 9 | { 10 | public Action OnContextClicked; 11 | public Action OnSingleClicked; 12 | public Action OnDoubleClicked; 13 | public Action OnSelectionChanged; 14 | public SearchField SearchField; 15 | public bool HasCompletedSearch => rgResults != null; 16 | public bool HasCompletedSearchWithNoResults => HasCompletedSearch && rgResults.Length == 0; 17 | Ripgrep.Results[] rgResults; 18 | 19 | public RipgrepSearchResultsTreeView(TreeViewState state) : base(state) 20 | { 21 | showBorder = true; 22 | showAlternatingRowBackgrounds = true; 23 | 24 | SetMultiColumnHeader("Ripgrep Search Results", "Result tree roots are the file path and branches are the line in the file that matched the query"); 25 | multiColumnHeader.ResizeToFit(); 26 | 27 | Reload(); 28 | } 29 | 30 | public void SetResults(Ripgrep.Results[] results) 31 | { 32 | var headerTitle = results != null ? $"Total Search Results: {results.Length}" : "Ripgrep Search Results"; 33 | multiColumnHeader.state.columns[0].headerContent = new GUIContent(headerTitle, multiColumnHeader.state.columns[0].headerContent.tooltip); 34 | 35 | SetSelection(Array.Empty()); 36 | SetExpanded(new List()); 37 | 38 | rgResults = results; 39 | Reload(); 40 | } 41 | 42 | public void SetMultiColumnHeader(string title, string tooltip) 43 | { 44 | multiColumnHeader = new MultiColumnHeader(new MultiColumnHeaderState(new[] 45 | { 46 | new MultiColumnHeaderState.Column 47 | { 48 | headerContent = new GUIContent(title, tooltip), 49 | headerTextAlignment = TextAlignment.Center, 50 | canSort = false, 51 | autoResize = true, 52 | allowToggleVisibility = false 53 | } 54 | })); 55 | } 56 | 57 | public void OpenItemInTextMate(int id) => OpenItemInTextMate((RipgrepTreeViewItem)FindItem(id, rootItem)); 58 | 59 | public void OpenItemInTextMate(RipgrepTreeViewItem item) => TextMate.Open(item.FilePath, item.LineNumber > 0 ? item.LineNumber : 1); 60 | 61 | protected override TreeViewItem BuildRoot() 62 | { 63 | Texture2D TextureForFileType(string extension) 64 | { 65 | return extension switch 66 | { 67 | ".cs" => RipgrepStyles.scriptTex, 68 | ".xml" => RipgrepStyles.xmlTex, 69 | ".php" => RipgrepStyles.booScriptTex, 70 | ".txt" => RipgrepStyles.textAssetTex, 71 | ".shader" => RipgrepStyles.shaderTex, 72 | var ext when ext == ".js" || ext == ".json" => RipgrepStyles.jsScriptTex, 73 | ".scene" => RipgrepStyles.sceneFileTex, 74 | ".unity" => RipgrepStyles.sceneFileTex, 75 | ".anim" => RipgrepStyles.animationAssetTex, 76 | ".prefab" => RipgrepStyles.prefabTex, 77 | ".asset" => RipgrepStyles.scriptableObjectTex, 78 | ".mat" => RipgrepStyles.materialFileTex, 79 | ".preset" => RipgrepStyles.presetFileTex, 80 | ".spriteatlas" => RipgrepStyles.spriteAtlasTex, 81 | ".gradle" => RipgrepStyles.androidTex, 82 | ".meta" => RipgrepStyles.metaFileTex, 83 | var ext when ext == ".png" || ext == ".jpg" => RipgrepStyles.textureTex, 84 | _ => null 85 | }; 86 | } 87 | 88 | var root = new RipgrepTreeViewItem { id = int.MaxValue, depth = -1, displayName = "Root", children = new List()}; 89 | 90 | if (rgResults != null) 91 | { 92 | var uniqueId = 0; 93 | for (var i = 0; i < rgResults.Length; i++) 94 | { 95 | void BuildChildren(RipgrepTreeViewItem parent, Ripgrep.Results result) 96 | { 97 | for (var j = 0; j < result.Children.Count; j++) 98 | { 99 | var displayName = result.Children[j].LineNumber >= 0 ? $"{result.Children[j].LineNumber}: {result.Children[j].Text}" : result.Children[j].Text; 100 | var child = new RipgrepTreeViewItem(uniqueId++, displayName, parent.depth + 1); 101 | child.LineNumber = result.Children[j].LineNumber; 102 | 103 | // LineNumber < 0 means this is not a line in a file but an actual asset 104 | if (child.LineNumber < 0) 105 | child.icon = TextureForFileType(System.IO.Path.GetExtension(displayName)); 106 | child.parent = parent; 107 | parent.AddChild(child); 108 | 109 | BuildChildren(child, result.Children[j]); 110 | } 111 | } 112 | 113 | var treeViewItem = new RipgrepTreeViewItem { id = uniqueId++, depth = 0, displayName = rgResults[i].Text, parent = root, children = new List() }; 114 | treeViewItem.icon = TextureForFileType(System.IO.Path.GetExtension(treeViewItem.FilePath)); 115 | root.AddChild(treeViewItem); 116 | 117 | BuildChildren(treeViewItem, rgResults[i]); 118 | } 119 | } 120 | 121 | return root; 122 | } 123 | 124 | protected override void SelectionChanged(IList selectedIds) 125 | { 126 | if (selectedIds == null) return; 127 | OnSelectionChanged?.Invoke((RipgrepTreeViewItem)FindItem(selectedIds[0], rootItem)); 128 | } 129 | 130 | protected override void ContextClickedItem(int id) => OnContextClicked?.Invoke((RipgrepTreeViewItem)FindItem(id, rootItem)); 131 | protected override void SingleClickedItem(int id) => OnSingleClicked?.Invoke((RipgrepTreeViewItem)FindItem(id, rootItem)); 132 | protected override void DoubleClickedItem(int id) => OnDoubleClicked?.Invoke((RipgrepTreeViewItem)FindItem(id, rootItem)); 133 | } 134 | 135 | public class RipgrepTreeViewItem : TreeViewItem 136 | { 137 | public int LineNumber = -1; 138 | public string FilePath 139 | { 140 | get 141 | { 142 | var path = depth == 1 && LineNumber > 0 ? parent.displayName : displayName; 143 | if (path.StartsWith("Packages")) 144 | return System.IO.Path.GetFullPath(path); 145 | return path; 146 | } 147 | } 148 | 149 | public RipgrepTreeViewItem() 150 | { } 151 | 152 | public RipgrepTreeViewItem(int id, string displayName, int depth = 0) : base(id, depth, displayName) 153 | {} 154 | 155 | public bool IsMetaFile() => FilePath.EndsWith(".meta"); 156 | public bool IsInAssetFolder() => FilePath.StartsWith("Assets"); 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /Assets/Editor/RipgrepSearchResultsTreeView.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f919c4ee795ac4c63aefd7f1214bdcfa 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Editor/RipgrepSearchWindow.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using UnityEditor; 6 | using UnityEditor.IMGUI.Controls; 7 | using UnityEngine; 8 | 9 | namespace Editor.Tools.Ripgrep 10 | { 11 | public class RipgrepSearchWindow : EditorWindow 12 | { 13 | [SerializeField] string searchStr = string.Empty; 14 | [SerializeField] bool isOptionsOpen; 15 | [SerializeField] TreeViewState treeViewState = new(); 16 | 17 | // options, persisted in saved searches 18 | RipgrepSettings.SearchOptions searchOptions = RipgrepSettings.SearchOptions.ExcludeMetaFiles; 19 | 20 | // history 21 | [SerializeField] List searchHistory = new(); 22 | [SerializeField] int searchHistoryCursor = -1; 23 | Ripgrep.Future rgResultFuture; 24 | RipgrepSearchResultsTreeView treeView; 25 | bool focusTextField; 26 | 27 | [MenuItem("Tools/Editors/Open Ripgrep Search Window %g")] 28 | static public RipgrepSearchWindow ShowWindow() 29 | { 30 | var window = GetWindow(); 31 | window.titleContent = new GUIContent("Ripgrep Search"); 32 | window.minSize = new Vector2(750, 350); 33 | window.ShowUtility(); 34 | 35 | return window; 36 | } 37 | 38 | [MenuItem("Assets/Search for this asset's GUID %&g")] 39 | public static void SearchAssetGuid() 40 | { 41 | UnityEngine.Object selectedObject = Selection.activeObject; 42 | string assetPath = AssetDatabase.GetAssetPath(selectedObject); 43 | string guid = AssetDatabase.AssetPathToGUID(assetPath); 44 | 45 | var window = ShowWindow(); 46 | window.EnsureTreeView(); 47 | 48 | if (selectedObject == null || string.IsNullOrEmpty(guid)) { 49 | window.ShowNotification(new GUIContent("No asset selected")); 50 | } else { 51 | window.searchStr = guid; 52 | window.StartSearch(); 53 | } 54 | } 55 | 56 | void OnEnable() => EditorApplication.delayCall += () => focusTextField = true; 57 | 58 | void OnInspectorUpdate() 59 | { 60 | // force a repaint when our background task is running 61 | if (rgResultFuture != null) 62 | Repaint(); 63 | } 64 | 65 | void EnsureTreeView() 66 | { 67 | if (treeView != null) return; 68 | 69 | treeView = new RipgrepSearchResultsTreeView(treeViewState); 70 | treeView.OnDoubleClicked += item => treeView.OpenItemInTextMate(item.id); 71 | treeView.OnSingleClicked += item => 72 | { 73 | if (RipgrepSettings.instance.PingObjectsOnSelectionChange) 74 | { 75 | var foundObject = AssetDatabase.LoadAssetAtPath(item.FilePath); 76 | Selection.activeObject = foundObject; 77 | EditorGUIUtility.PingObject(foundObject); 78 | } 79 | }; 80 | 81 | treeView.OnContextClicked += item => 82 | { 83 | var menu = new GenericMenu(); 84 | if (item.LineNumber < 0) 85 | { 86 | if (!item.IsMetaFile() && item.IsInAssetFolder()) 87 | { 88 | menu.AddItem(new GUIContent("Search for this asset's GUID"), false, () => 89 | { 90 | searchStr = AssetDatabase.AssetPathToGUID(item.FilePath); 91 | StartSearch(); 92 | }); 93 | 94 | menu.AddItem(new GUIContent("Get Dependency Tree"), false, () => 95 | { 96 | treeView.SetResults(null); 97 | 98 | var results = new List(); 99 | var root = new Ripgrep.Results { Text = item.FilePath }; 100 | results.Add(root); 101 | 102 | var paths = new HashSet { item.FilePath }; 103 | 104 | void RecurseChildDependencies(Ripgrep.Results parent, string assetPath) 105 | { 106 | foreach (var dep in AssetDatabase.GetDependencies(item.displayName)) 107 | { 108 | if (paths.Add(dep)) 109 | { 110 | var child = new Ripgrep.Results { Text = dep }; 111 | parent.Children.Add(child); 112 | // TODO: make the UI reasonable for a dependency tree, for now its just one level 113 | // RecurseChildDependencies(child, dep); 114 | } 115 | else if (dep != assetPath) 116 | { 117 | parent.Children.Add(new Ripgrep.Results { Text = $"Dupe - {System.IO.Path.GetFileName(dep)}" }); 118 | } 119 | } 120 | } 121 | 122 | RecurseChildDependencies(root, item.FilePath); 123 | 124 | treeView.SetResults(results.ToArray()); 125 | }); 126 | } 127 | 128 | menu.AddItem(new GUIContent("Open in TextMate"), false, () => treeView.OpenItemInTextMate(item.id)); 129 | } 130 | else 131 | { 132 | menu.AddItem(new GUIContent("Open in TextMate at this line"), false, () => treeView.OpenItemInTextMate(item.id)); 133 | } 134 | 135 | menu.ShowAsContext(); 136 | }; 137 | 138 | treeView.SearchField = new SearchField(); 139 | } 140 | 141 | void DrawTips() 142 | { 143 | using (new GUILayout.VerticalScope(RipgrepStyles.noResult)) 144 | { 145 | GUILayout.FlexibleSpace(); 146 | using (new GUILayout.HorizontalScope(RipgrepStyles.noResult, GUILayout.ExpandHeight(true))) 147 | { 148 | GUILayout.FlexibleSpace(); 149 | using (new GUILayout.VerticalScope(EditorStyles.helpBox, GUILayout.Height(240))) 150 | { 151 | GUILayout.Label("Search Tips", RipgrepStyles.tipTextTitle); 152 | GUILayout.Space(15); 153 | for (var i = 0; i < RipgrepStyles.searchTipIcons.Length; ++i) 154 | { 155 | using (new GUILayout.HorizontalScope(RipgrepStyles.noResult)) 156 | { 157 | GUILayout.Label(RipgrepStyles.searchTipIcons[i], RipgrepStyles.tipIcon); 158 | GUILayout.Label(RipgrepStyles.searchTipLabels[i], RipgrepStyles.tipText, GUILayout.Width(Mathf.Min(RipgrepStyles.tipMaxSize, position.width - RipgrepStyles.tipSizeOffset))); 159 | } 160 | } 161 | 162 | GUILayout.FlexibleSpace(); 163 | } 164 | 165 | GUILayout.FlexibleSpace(); 166 | } 167 | 168 | GUILayout.FlexibleSpace(); 169 | } 170 | } 171 | 172 | void DrawNoResults() 173 | { 174 | using (new GUILayout.VerticalScope(RipgrepStyles.noResult)) 175 | { 176 | GUILayout.FlexibleSpace(); 177 | using (new GUILayout.HorizontalScope(RipgrepStyles.noResult, GUILayout.ExpandHeight(true))) 178 | { 179 | GUILayout.FlexibleSpace(); 180 | using (new GUILayout.VerticalScope(EditorStyles.helpBox, GUILayout.Height(25))) 181 | { 182 | GUILayout.Label(L10n.Tr("No results"), RipgrepStyles.tipText); 183 | GUILayout.FlexibleSpace(); 184 | } 185 | 186 | GUILayout.FlexibleSpace(); 187 | } 188 | 189 | GUILayout.FlexibleSpace(); 190 | } 191 | } 192 | 193 | void DrawOptions(float optionsWidth) 194 | { 195 | using (new GUILayout.VerticalScope(RipgrepStyles.optionsPanel, GUILayout.Width(optionsWidth), GUILayout.ExpandHeight(true))) 196 | { 197 | GUILayout.Label("Search Options", RipgrepStyles.panelHeader); 198 | 199 | // options 200 | SearchOptionsExt.OnGui(ref searchOptions); 201 | 202 | GUILayout.Space(10); 203 | GUILayout.Label("Persisted Settings", RipgrepStyles.panelHeader); 204 | RipgrepSettings.instance.ShowResultNotifications = GUILayout.Toggle(RipgrepSettings.instance.ShowResultNotifications, "Show live result count notifications"); 205 | RipgrepSettings.instance.PingObjectsOnSelectionChange = GUILayout.Toggle(RipgrepSettings.instance.PingObjectsOnSelectionChange, "Ping objects on selection change"); 206 | 207 | using (new GUILayout.HorizontalScope()) 208 | { 209 | GUILayout.Label($"Threads ({RipgrepSettings.instance.ThreadCount})", GUILayout.Width(75)); 210 | RipgrepSettings.instance.ThreadCount = (int)GUILayout.HorizontalSlider(RipgrepSettings.instance.ThreadCount, 1, 16); 211 | } 212 | 213 | // built-in searches 214 | GUILayout.Space(20); 215 | GUILayout.Label("Built-in Searches", RipgrepStyles.panelHeader); 216 | 217 | if (GUILayout.Button("All Assets with WeakReferences")) 218 | StartSearch(@"guid:\s[a-zA-Z0-9]{32}\n.*?subAssetName", RipgrepSettings.SearchOptions.Multiline | RipgrepSettings.SearchOptions.RestrictToUnityAssetFiles | RipgrepSettings.SearchOptions.ExcludeMetaFiles); 219 | 220 | if (GUILayout.Button("All WeakReferences with Missing GUIDs")) 221 | StartSearch(@"\s+-\sguid:\s*$\n.*?subAssetName", RipgrepSettings.SearchOptions.Multiline | RipgrepSettings.SearchOptions.RestrictToUnityAssetFiles | RipgrepSettings.SearchOptions.ExcludeMetaFiles); 222 | 223 | GUILayout.FlexibleSpace(); 224 | } 225 | } 226 | 227 | void OnGUI() 228 | { 229 | if (Event.current.type == EventType.KeyUp && Event.current.keyCode == KeyCode.Escape) 230 | { 231 | if (rgResultFuture != null) 232 | { 233 | rgResultFuture.Cancel(); 234 | rgResultFuture = null; 235 | ShowNotification(new GUIContent("Search cancelled, only partial results returned")); 236 | return; 237 | } 238 | 239 | Event.current.Use(); 240 | Close(); 241 | return; 242 | } 243 | 244 | EnsureTreeView(); 245 | 246 | GUI.enabled = rgResultFuture == null; 247 | 248 | using (new GUILayout.HorizontalScope()) 249 | { 250 | isOptionsOpen = GUILayout.Toggle(isOptionsOpen, RipgrepStyles.openOptionsIconContent, RipgrepStyles.openOptionsPanelButton); 251 | 252 | EditorGUI.BeginDisabledGroup(searchHistoryCursor <= 0); 253 | if (GUILayout.Button("<", RipgrepStyles.historyButton)) 254 | { 255 | searchStr = searchHistory[--searchHistoryCursor]; 256 | StartSearch(true); 257 | } 258 | EditorGUI.EndDisabledGroup(); 259 | 260 | EditorGUI.BeginDisabledGroup(searchHistoryCursor == searchHistory.Count - 1); 261 | if (GUILayout.Button(">", RipgrepStyles.historyButton, GUILayout.MaxWidth(20))) 262 | { 263 | searchStr = searchHistory[++searchHistoryCursor]; 264 | StartSearch(true); 265 | } 266 | EditorGUI.EndDisabledGroup(); 267 | 268 | EditorGUIUtility.labelWidth = 1; 269 | var nextControlId = GUIUtility.GetControlID(FocusType.Passive) + 1; 270 | GUI.SetNextControlName("SearchTF"); 271 | searchStr = EditorGUILayout.TextField((string)null, searchStr, RipgrepStyles.searchTextField, GUILayout.Height(34)); 272 | EditorGUIUtility.labelWidth = -1; 273 | 274 | if (GUIUtility.keyboardControl == nextControlId && Event.current.type == EventType.KeyUp && Event.current.keyCode == KeyCode.Return) 275 | StartSearch(); 276 | 277 | if (GUILayout.Button(RipgrepStyles.clearSearchIconContent, RipgrepStyles.openOptionsPanelButton)) 278 | { 279 | searchStr = string.Empty; 280 | treeView.SetResults(null); 281 | } 282 | 283 | if (EditorGUILayout.DropdownButton(RipgrepStyles.optionsIconContent, FocusType.Keyboard, RipgrepStyles.optionsHeaderIcon)) 284 | OnClickShowSavedSearches(); 285 | } 286 | 287 | if (focusTextField) 288 | { 289 | GUI.FocusControl("SearchTF"); 290 | focusTextField = false; 291 | } 292 | 293 | if (rgResultFuture != null) 294 | EditorGUILayout.HelpBox($"Ripgrepping. Elapsed time: {rgResultFuture.GetElapsedTime():F1}", MessageType.Info); 295 | 296 | var lastRect = GUILayoutUtility.GetLastRect(); 297 | lastRect.y += 10; 298 | using (new GUILayout.HorizontalScope()) 299 | { 300 | var optionsWidth = 5; 301 | if (isOptionsOpen) 302 | { 303 | optionsWidth += 250; 304 | DrawOptions(optionsWidth); 305 | optionsWidth += 60; // TODO: why do we have so much extra width here? 306 | } 307 | 308 | if (treeView.HasCompletedSearchWithNoResults) 309 | { 310 | DrawNoResults(); 311 | } 312 | else if (treeView.HasCompletedSearch) 313 | { 314 | const float SEARCH_FIELD_HEIGHT = 20; 315 | const float SEARCH_FIELD_MARGIN = 20; 316 | const float TREE_MARGIN = 5; 317 | var width = position.width - optionsWidth - TREE_MARGIN; 318 | var height = position.height - lastRect.yMax - SEARCH_FIELD_HEIGHT - TREE_MARGIN; 319 | 320 | treeView.searchString = treeView.SearchField.OnToolbarGUI(new Rect(optionsWidth + SEARCH_FIELD_MARGIN, lastRect.yMax, width - SEARCH_FIELD_MARGIN * 2, SEARCH_FIELD_HEIGHT), treeView.searchString); 321 | treeView.OnGUI(new Rect(optionsWidth, lastRect.yMax + SEARCH_FIELD_HEIGHT, width, height)); 322 | } 323 | else 324 | { 325 | DrawTips(); 326 | } 327 | } 328 | } 329 | 330 | void OnClickShowSavedSearches() 331 | { 332 | var menu = new GenericMenu(); 333 | menu.AddSeparator("Saved Searches"); 334 | menu.AddSeparator(""); 335 | 336 | foreach (var savedSearch in RipgrepSettings.instance.SavedSearches) 337 | { 338 | menu.AddItem(new GUIContent(savedSearch.SearchTerm + "/Execute Search"), false, () => 339 | { 340 | searchStr = savedSearch.SearchTerm; 341 | searchOptions = savedSearch.SearchOptions; 342 | EditorApplication.delayCall += () => StartSearch(); 343 | }); 344 | 345 | menu.AddItem(new GUIContent(savedSearch.SearchTerm + "/Delete"), false, () => RipgrepSettings.instance.RemoveSavedSearch(savedSearch)); 346 | menu.AddSeparator(savedSearch.SearchTerm + "/"); 347 | 348 | var searchName = string.IsNullOrEmpty(savedSearch.Name) ? "Set Name" : savedSearch.Name; 349 | menu.AddItem(new GUIContent(savedSearch.SearchTerm + "/" + searchName), false, () => 350 | { 351 | var newName = EditorInputDialog.Show("Rename Saved Search", "Set the name for this saved search", savedSearch.Name, "Save"); 352 | if (newName != null) 353 | savedSearch.Name = newName; 354 | EditorUtility.SetDirty(RipgrepSettings.instance); 355 | }); 356 | 357 | if (!string.IsNullOrEmpty(savedSearch.Name)) 358 | menu.AddSeparator(savedSearch.SearchTerm + "/" + savedSearch.SearchTerm); 359 | } 360 | 361 | menu.AddSeparator(""); 362 | if (searchStr.Length >= 3) 363 | menu.AddItem(new GUIContent("Save Current Search"), false, () => RipgrepSettings.instance.AddSavedSearch(searchStr, searchOptions)); 364 | else 365 | menu.AddDisabledItem(new GUIContent("Save Current Search")); 366 | menu.ShowAsContext(); 367 | } 368 | 369 | void OnResultParsed(int totalResults) => ShowNotification(new($"Total Results {totalResults}"), 0.1); 370 | 371 | void StartSearch(string query, RipgrepSettings.SearchOptions options) 372 | { 373 | searchStr = query; 374 | searchOptions = options; 375 | StartSearch(); 376 | } 377 | 378 | void StartSearch(bool ignoreHistory = false) 379 | { 380 | if (searchStr.Length < 3) 381 | { 382 | ShowNotification(new GUIContent("At least 3 characters are required for a search")); 383 | return; 384 | } 385 | 386 | treeView.SetResults(null); 387 | 388 | if (searchHistory.LastOrDefault() != searchStr && !ignoreHistory) 389 | { 390 | searchHistory.Add(searchStr); 391 | searchHistoryCursor = searchHistory.Count - 1; 392 | } 393 | 394 | var opts = new Ripgrep.Options 395 | { 396 | SearchTerm = searchStr, 397 | WorkingDir = Environment.CurrentDirectory, 398 | IgnoreCase = searchOptions.ContainsFlag(RipgrepSettings.SearchOptions.IgnoreCase), 399 | Multiline = searchOptions.ContainsFlag(RipgrepSettings.SearchOptions.Multiline), 400 | LiteralStringSearch = searchOptions.ContainsFlag(RipgrepSettings.SearchOptions.LiteralStringSearch), 401 | ThreadCount = RipgrepSettings.instance.ThreadCount, 402 | OnResultParsed = RipgrepSettings.instance.ShowResultNotifications ? OnResultParsed : null 403 | }; 404 | 405 | if (searchOptions.ContainsFlag(RipgrepSettings.SearchOptions.RestrictToUnityAssetFiles)) 406 | opts.RestrictToUnityAssetFiles(); 407 | 408 | if (searchOptions.ContainsFlag(RipgrepSettings.SearchOptions.RestrictToCodeFiles)) 409 | opts.AddIncludedFileType("cs"); 410 | 411 | if (searchOptions.ContainsFlag(RipgrepSettings.SearchOptions.ExcludeMetaFiles)) 412 | opts.AddExcludedFileType("meta"); 413 | 414 | // always include Assets folder 415 | opts.AddSearchFolder("Assets"); 416 | 417 | if (searchOptions.ContainsFlag(RipgrepSettings.SearchOptions.IncludePackagesFolder)) 418 | opts.AddSearchFolder("Packages"); 419 | 420 | rgResultFuture = Ripgrep.RunAsync(opts); 421 | rgResultFuture.WhenComplete(rgResults => 422 | { 423 | rgResultFuture = null; 424 | treeView.SetResults(rgResults); 425 | EditorApplication.delayCall += Repaint; 426 | }); 427 | } 428 | } 429 | } 430 | -------------------------------------------------------------------------------- /Assets/Editor/RipgrepSearchWindow.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6be11caed8bc946bf88920c83463fd3d 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Editor/RipgrepSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using UnityEditor; 4 | using UnityEngine; 5 | 6 | namespace Editor.Tools.Ripgrep 7 | { 8 | [FilePath("UserSettings/ripgrep.settings", FilePathAttribute.Location.ProjectFolder)] 9 | public class RipgrepSettings : ScriptableSingleton 10 | { 11 | [Flags] 12 | public enum SearchOptions 13 | { 14 | None = 0, 15 | IgnoreCase = 1 << 0, 16 | LiteralStringSearch = 1 << 1, 17 | Multiline = 1 << 2, 18 | IncludePackagesFolder = 1 << 3, 19 | RestrictToCodeFiles = 1 << 4, 20 | RestrictToUnityAssetFiles = 1 << 5, 21 | ExcludeMetaFiles = 1 << 6, 22 | } 23 | 24 | [Serializable] 25 | public class SavedSearch 26 | { 27 | public string SearchTerm; 28 | public string Name; 29 | public SearchOptions SearchOptions; 30 | } 31 | 32 | public List SavedSearches = new(); 33 | public bool ShowResultNotifications = true; 34 | public int ThreadCount = 4; 35 | public bool PingObjectsOnSelectionChange = true; 36 | 37 | public void AddSavedSearch(string search, SearchOptions options) 38 | { 39 | SavedSearches.Add(new SavedSearch { SearchTerm = search, SearchOptions = options}); 40 | Save(true); 41 | } 42 | 43 | public void RemoveSavedSearch(SavedSearch search) 44 | { 45 | SavedSearches.Remove(search); 46 | Save(true); 47 | } 48 | } 49 | 50 | public static class SearchOptionsExt 51 | { 52 | public static void OnGui(ref RipgrepSettings.SearchOptions opts) 53 | { 54 | void Draw(ref RipgrepSettings.SearchOptions opts, RipgrepSettings.SearchOptions flag, string text) 55 | { 56 | var isChecked = GUILayout.Toggle(opts.ContainsFlag(flag), text); 57 | SetFlag(ref opts, flag, isChecked); 58 | } 59 | 60 | Draw(ref opts, RipgrepSettings.SearchOptions.IgnoreCase, "Ignore case (a lowercase search does the same)"); 61 | Draw(ref opts, RipgrepSettings.SearchOptions.LiteralStringSearch, "Literal string search (disable regex)"); 62 | Draw(ref opts, RipgrepSettings.SearchOptions.Multiline, "Multiline regex search"); 63 | Draw(ref opts, RipgrepSettings.SearchOptions.IncludePackagesFolder, "Include Packages folder in searches"); 64 | Draw(ref opts, RipgrepSettings.SearchOptions.RestrictToCodeFiles, "Restrict to code files (cs)"); 65 | Draw(ref opts, RipgrepSettings.SearchOptions.RestrictToUnityAssetFiles, "Restrict to asset files (asset/prefab/unity)"); 66 | Draw(ref opts, RipgrepSettings.SearchOptions.ExcludeMetaFiles, "Exclude meta files"); 67 | } 68 | 69 | public static bool ContainsFlag(this RipgrepSettings.SearchOptions self, RipgrepSettings.SearchOptions flag) => (self & flag) == flag; 70 | 71 | public static void SetFlag(ref RipgrepSettings.SearchOptions self, RipgrepSettings.SearchOptions flag, bool isSet) 72 | { 73 | if (isSet) self |= flag; 74 | else self &= ~flag; 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /Assets/Editor/RipgrepSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0baad04fda39f4f4dbd2d79359931b66 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Editor/RipgrepStyles.cs: -------------------------------------------------------------------------------- 1 | using UnityEditor; 2 | using UnityEngine; 3 | 4 | // https://github.com/halak/unity-editor-icons 5 | namespace Editor.Tools.Ripgrep 6 | { 7 | static class RipgrepStyles 8 | { 9 | public static readonly Texture2D scriptTex = EditorGUIUtility.FindTexture("cs Script Icon"); 10 | public static readonly Texture2D jsScriptTex = (Texture2D)EditorGUIUtility.IconContent("Js Script Icon").image; 11 | public static readonly Texture2D booScriptTex = (Texture2D)EditorGUIUtility.IconContent("boo Script Icon").image; 12 | public static readonly Texture2D textAssetTex = (Texture2D)EditorGUIUtility.IconContent("d_TextAsset Icon").image; 13 | public static readonly Texture2D animationAssetTex = (Texture2D)EditorGUIUtility.IconContent("Animation.FilterBySelection").image; 14 | public static readonly Texture2D shaderTex = (Texture2D)EditorGUIUtility.IconContent("d_Shader Icon").image; 15 | public static readonly Texture2D prefabTex = EditorGUIUtility.FindTexture("Prefab Icon"); 16 | public static readonly Texture2D scriptableObjectTex = (Texture2D)EditorGUIUtility.IconContent("ScriptableObject Icon").image; 17 | public static readonly Texture2D textureTex = (Texture2D)EditorGUIUtility.IconContent("d_Texture Icon").image; 18 | public static readonly Texture2D spriteAtlasTex = (Texture2D)EditorGUIUtility.IconContent("SpriteAtlasAsset Icon").image; 19 | public static readonly Texture2D androidTex = (Texture2D)EditorGUIUtility.IconContent("BuildSettings.Android On").image; 20 | public static readonly Texture2D xmlTex = (Texture2D)EditorGUIUtility.IconContent("UxmlScript Icon").image; 21 | public static readonly Texture2D metaFileTex = (Texture2D)EditorGUIUtility.IconContent("MetaFile Icon").image; 22 | public static readonly Texture2D sceneFileTex = (Texture2D)EditorGUIUtility.IconContent("d_Scene").image; 23 | public static readonly Texture2D materialFileTex = (Texture2D)EditorGUIUtility.IconContent("d_Material Icon").image; 24 | public static readonly Texture2D presetFileTex = (Texture2D)EditorGUIUtility.IconContent("d_Preset.Context@2x").image; 25 | 26 | private static readonly RectOffset marginNone = new(0, 0, 0, 0); 27 | private static readonly RectOffset paddingNone = new(0, 0, 0, 0); 28 | 29 | public static readonly GUIStyle optionsPanel = new(EditorStyles.helpBox) 30 | { 31 | name = "options", 32 | fontSize = 20, 33 | fixedHeight = 0, 34 | fixedWidth = 0, 35 | wordWrap = true, 36 | richText = true, 37 | alignment = TextAnchor.UpperLeft, 38 | margin = marginNone, 39 | padding = new RectOffset(10, 10, 5, 5), 40 | normal = new GUIStyleState 41 | { 42 | background = GenerateSolidColorTexture(new Color(0.2f, 0.2f, 0.2f, 1f)) 43 | } 44 | }; 45 | 46 | public static readonly GUIContent optionsIconContent = new(string.Empty, EditorGUIUtility.FindTexture("d_UnityEditor.AnimationWindow@2x"), "Show Saved Searches"); 47 | 48 | public static readonly GUIStyle noResult = new(EditorStyles.centeredGreyMiniLabel) 49 | { 50 | name = "no-result", 51 | fontSize = 20, 52 | fixedHeight = 0, 53 | fixedWidth = 0, 54 | wordWrap = true, 55 | richText = true, 56 | alignment = TextAnchor.MiddleCenter, 57 | margin = marginNone, 58 | padding = paddingNone 59 | }; 60 | 61 | public static readonly GUIStyle optionsHeaderIcon = new("IconButton") 62 | { 63 | margin = new RectOffset(4, 4, 4, 4), 64 | padding = new RectOffset(2, 2, 4, 4), 65 | fixedWidth = 30, 66 | fixedHeight = 30, 67 | imagePosition = ImagePosition.ImageOnly, 68 | alignment = TextAnchor.MiddleCenter 69 | }; 70 | 71 | public static readonly GUIStyle panelHeader = new(EditorStyles.whiteLabel) 72 | { 73 | margin = new RectOffset(2, 2, 2, 2), 74 | padding = new RectOffset(1, 1, 4, 4), 75 | fontSize = 14, 76 | fixedHeight = 24, 77 | wordWrap = false, 78 | alignment = TextAnchor.MiddleLeft, 79 | stretchWidth = false, 80 | clipping = TextClipping.Clip 81 | }; 82 | 83 | public static readonly GUIStyle tipIcon = new("Label") 84 | { 85 | margin = new RectOffset(4, 4, 2, 2), 86 | stretchWidth = false 87 | }; 88 | 89 | public static readonly GUIStyle tipTextTitle = new("Label") 90 | { 91 | fontSize = 20, 92 | richText = true, 93 | wordWrap = false, 94 | alignment = TextAnchor.MiddleCenter 95 | }; 96 | 97 | public static readonly GUIStyle tipText = new("Label") 98 | { 99 | wordWrap = false, 100 | richText = true, 101 | }; 102 | 103 | public static readonly GUIStyle searchTextField = new("TextField") 104 | { 105 | fontSize = 24, 106 | wordWrap = false 107 | }; 108 | 109 | public const float tipSizeOffset = 100f; 110 | public const float tipMaxSize = 350f; 111 | 112 | public static readonly GUIContent[] searchTipIcons = 113 | { 114 | new(string.Empty, EditorGUIUtility.FindTexture("_Popup")), 115 | new(string.Empty, EditorGUIUtility.IconContent("Toolbar Plus More").image), 116 | new(string.Empty, EditorGUIUtility.FindTexture("SaveAs")), 117 | new(string.Empty, EditorGUIUtility.FindTexture("d_Profiler.UIDetails")), 118 | new(string.Empty, EditorGUIUtility.FindTexture("UnityEditor.InspectorWindow")), 119 | new(string.Empty, EditorGUIUtility.FindTexture("Refresh")), 120 | new(string.Empty, EditorGUIUtility.FindTexture("Linked")), 121 | new(string.Empty, EditorGUIUtility.FindTexture("winbtn_win_close")) 122 | }; 123 | 124 | public static readonly GUIContent[] searchTipLabels = 125 | { 126 | new("Press enter to start a search"), 127 | new("Search history remembers your previous searches"), 128 | new("Right click search results for more options"), 129 | new("Double click search results to open in a text editor"), 130 | new("Check the options panel for search settings"), 131 | new("Separate multiple search terms with spaces"), 132 | new("Cancel a search by pressing escape when it is running"), 133 | new("Escape closes the window if there is no search running") 134 | }; 135 | 136 | public static readonly GUIContent clearSearchIconContent = new(string.Empty, EditorGUIUtility.FindTexture("d_winbtn_win_close@2x"), "Clear Search and Results"); 137 | public static readonly GUIContent openOptionsIconContent = new(string.Empty, EditorGUIUtility.FindTexture("Audio Mixer@2x"), "Open Options Panel"); 138 | 139 | public static readonly GUIStyle openOptionsPanelButton = new("IconButton") 140 | { 141 | margin = new RectOffset(4, 4, 4, 4), 142 | padding = new RectOffset(2, 2, 2, 2), 143 | fixedWidth = 30f, 144 | fixedHeight = 30f, 145 | imagePosition = ImagePosition.ImageOnly, 146 | alignment = TextAnchor.MiddleCenter 147 | }; 148 | 149 | public static readonly GUIStyle historyButton = new("Button") 150 | { 151 | margin = new RectOffset(4, 4, 6, 6), 152 | padding = new RectOffset(2, 2, 2, 2), 153 | fixedWidth = 24f, 154 | fixedHeight = 24f 155 | }; 156 | 157 | private static Texture2D GenerateSolidColorTexture(Color fillColor) 158 | { 159 | var texture = new Texture2D(1, 1); 160 | var fillColorArray = texture.GetPixels(); 161 | 162 | for (var i = 0; i < fillColorArray.Length; ++i) 163 | fillColorArray[i] = fillColor; 164 | 165 | texture.hideFlags = HideFlags.HideAndDontSave; 166 | texture.SetPixels(fillColorArray); 167 | texture.Apply(); 168 | 169 | return texture; 170 | } 171 | } 172 | } 173 | -------------------------------------------------------------------------------- /Assets/Editor/RipgrepStyles.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 79c222bd18cc04fdcaa7a2636f89a8db 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Editor/TextMate.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using UnityEditor; 3 | using UnityEngine; 4 | 5 | namespace Editor.Tools.Ripgrep 6 | { 7 | public static class TextMate 8 | { 9 | public static bool IsInstalled() => File.Exists("/usr/local/bin/mate"); 10 | 11 | /// opens the file in TextMate or if it is not installed the default text editor 12 | public static void Open(string path, int lineNumber = 1) 13 | { 14 | var command = IsInstalled() ? $"/usr/local/bin/mate {path} -l {lineNumber}" : $"open -t {path}"; 15 | var process = new System.Diagnostics.Process(); 16 | process.StartInfo.FileName = "/bin/zsh"; 17 | process.StartInfo.Arguments = "-c \" " + command + " \""; 18 | process.StartInfo.UseShellExecute = false; 19 | process.StartInfo.RedirectStandardOutput = true; 20 | process.StartInfo.RedirectStandardError = true; 21 | process.Start(); 22 | 23 | var txt = process.StandardOutput.ReadToEnd(); 24 | if (!string.IsNullOrWhiteSpace(txt)) 25 | Debug.LogError($"Output: {txt}"); 26 | 27 | txt = process.StandardError.ReadToEnd(); 28 | if (!string.IsNullOrWhiteSpace(txt)) 29 | Debug.LogError($"Error: {txt}"); 30 | 31 | process.WaitForExit(); 32 | } 33 | 34 | public static void OpenSelectedAsset() 35 | { 36 | if (Selection.assetGUIDs.Length > 0) Open(AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0])); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Assets/Editor/TextMate.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 59af34c1c4ff54f5189d54be2753bfd4 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/Scenes.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 131a6b21c8605f84396be9f6751fb6e3 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scenes/SampleScene.unity: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!29 &1 4 | OcclusionCullingSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_OcclusionBakeSettings: 8 | smallestOccluder: 5 9 | smallestHole: 0.25 10 | backfaceThreshold: 100 11 | m_SceneGUID: 00000000000000000000000000000000 12 | m_OcclusionCullingData: {fileID: 0} 13 | --- !u!104 &2 14 | RenderSettings: 15 | m_ObjectHideFlags: 0 16 | serializedVersion: 9 17 | m_Fog: 0 18 | m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} 19 | m_FogMode: 3 20 | m_FogDensity: 0.01 21 | m_LinearFogStart: 0 22 | m_LinearFogEnd: 300 23 | m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} 24 | m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} 25 | m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} 26 | m_AmbientIntensity: 1 27 | m_AmbientMode: 3 28 | m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} 29 | m_SkyboxMaterial: {fileID: 0} 30 | m_HaloStrength: 0.5 31 | m_FlareStrength: 1 32 | m_FlareFadeSpeed: 3 33 | m_HaloTexture: {fileID: 0} 34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} 35 | m_DefaultReflectionMode: 0 36 | m_DefaultReflectionResolution: 128 37 | m_ReflectionBounces: 1 38 | m_ReflectionIntensity: 1 39 | m_CustomReflection: {fileID: 0} 40 | m_Sun: {fileID: 0} 41 | m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} 42 | m_UseRadianceAmbientProbe: 0 43 | --- !u!157 &3 44 | LightmapSettings: 45 | m_ObjectHideFlags: 0 46 | serializedVersion: 12 47 | m_GIWorkflowMode: 1 48 | m_GISettings: 49 | serializedVersion: 2 50 | m_BounceScale: 1 51 | m_IndirectOutputScale: 1 52 | m_AlbedoBoost: 1 53 | m_EnvironmentLightingMode: 0 54 | m_EnableBakedLightmaps: 0 55 | m_EnableRealtimeLightmaps: 0 56 | m_LightmapEditorSettings: 57 | serializedVersion: 12 58 | m_Resolution: 2 59 | m_BakeResolution: 40 60 | m_AtlasSize: 1024 61 | m_AO: 0 62 | m_AOMaxDistance: 1 63 | m_CompAOExponent: 1 64 | m_CompAOExponentDirect: 0 65 | m_ExtractAmbientOcclusion: 0 66 | m_Padding: 2 67 | m_LightmapParameters: {fileID: 0} 68 | m_LightmapsBakeMode: 1 69 | m_TextureCompression: 1 70 | m_FinalGather: 0 71 | m_FinalGatherFiltering: 1 72 | m_FinalGatherRayCount: 256 73 | m_ReflectionCompression: 2 74 | m_MixedBakeMode: 2 75 | m_BakeBackend: 0 76 | m_PVRSampling: 1 77 | m_PVRDirectSampleCount: 32 78 | m_PVRSampleCount: 500 79 | m_PVRBounces: 2 80 | m_PVREnvironmentSampleCount: 500 81 | m_PVREnvironmentReferencePointCount: 2048 82 | m_PVRFilteringMode: 2 83 | m_PVRDenoiserTypeDirect: 0 84 | m_PVRDenoiserTypeIndirect: 0 85 | m_PVRDenoiserTypeAO: 0 86 | m_PVRFilterTypeDirect: 0 87 | m_PVRFilterTypeIndirect: 0 88 | m_PVRFilterTypeAO: 0 89 | m_PVREnvironmentMIS: 0 90 | m_PVRCulling: 1 91 | m_PVRFilteringGaussRadiusDirect: 1 92 | m_PVRFilteringGaussRadiusIndirect: 5 93 | m_PVRFilteringGaussRadiusAO: 2 94 | m_PVRFilteringAtrousPositionSigmaDirect: 0.5 95 | m_PVRFilteringAtrousPositionSigmaIndirect: 2 96 | m_PVRFilteringAtrousPositionSigmaAO: 1 97 | m_ExportTrainingData: 0 98 | m_TrainingDataDestination: TrainingData 99 | m_LightProbeSampleCountMultiplier: 4 100 | m_LightingDataAsset: {fileID: 0} 101 | m_LightingSettings: {fileID: 0} 102 | --- !u!196 &4 103 | NavMeshSettings: 104 | serializedVersion: 2 105 | m_ObjectHideFlags: 0 106 | m_BuildSettings: 107 | serializedVersion: 2 108 | agentTypeID: 0 109 | agentRadius: 0.5 110 | agentHeight: 2 111 | agentSlope: 45 112 | agentClimb: 0.4 113 | ledgeDropHeight: 0 114 | maxJumpAcrossDistance: 0 115 | minRegionArea: 2 116 | manualCellSize: 0 117 | cellSize: 0.16666667 118 | manualTileSize: 0 119 | tileSize: 256 120 | accuratePlacement: 0 121 | maxJobWorkers: 0 122 | preserveTilesOutsideBounds: 0 123 | debug: 124 | m_Flags: 0 125 | m_NavMeshData: {fileID: 0} 126 | --- !u!1 &519420028 127 | GameObject: 128 | m_ObjectHideFlags: 0 129 | m_CorrespondingSourceObject: {fileID: 0} 130 | m_PrefabInstance: {fileID: 0} 131 | m_PrefabAsset: {fileID: 0} 132 | serializedVersion: 6 133 | m_Component: 134 | - component: {fileID: 519420032} 135 | - component: {fileID: 519420031} 136 | - component: {fileID: 519420029} 137 | m_Layer: 0 138 | m_Name: Main Camera 139 | m_TagString: MainCamera 140 | m_Icon: {fileID: 0} 141 | m_NavMeshLayer: 0 142 | m_StaticEditorFlags: 0 143 | m_IsActive: 1 144 | --- !u!81 &519420029 145 | AudioListener: 146 | m_ObjectHideFlags: 0 147 | m_CorrespondingSourceObject: {fileID: 0} 148 | m_PrefabInstance: {fileID: 0} 149 | m_PrefabAsset: {fileID: 0} 150 | m_GameObject: {fileID: 519420028} 151 | m_Enabled: 1 152 | --- !u!20 &519420031 153 | Camera: 154 | m_ObjectHideFlags: 0 155 | m_CorrespondingSourceObject: {fileID: 0} 156 | m_PrefabInstance: {fileID: 0} 157 | m_PrefabAsset: {fileID: 0} 158 | m_GameObject: {fileID: 519420028} 159 | m_Enabled: 1 160 | serializedVersion: 2 161 | m_ClearFlags: 2 162 | m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} 163 | m_projectionMatrixMode: 1 164 | m_GateFitMode: 2 165 | m_FOVAxisMode: 0 166 | m_SensorSize: {x: 36, y: 24} 167 | m_LensShift: {x: 0, y: 0} 168 | m_FocalLength: 50 169 | m_NormalizedViewPortRect: 170 | serializedVersion: 2 171 | x: 0 172 | y: 0 173 | width: 1 174 | height: 1 175 | near clip plane: 0.3 176 | far clip plane: 1000 177 | field of view: 60 178 | orthographic: 1 179 | orthographic size: 5 180 | m_Depth: -1 181 | m_CullingMask: 182 | serializedVersion: 2 183 | m_Bits: 4294967295 184 | m_RenderingPath: -1 185 | m_TargetTexture: {fileID: 0} 186 | m_TargetDisplay: 0 187 | m_TargetEye: 0 188 | m_HDR: 1 189 | m_AllowMSAA: 0 190 | m_AllowDynamicResolution: 0 191 | m_ForceIntoRT: 0 192 | m_OcclusionCulling: 0 193 | m_StereoConvergence: 10 194 | m_StereoSeparation: 0.022 195 | --- !u!4 &519420032 196 | Transform: 197 | m_ObjectHideFlags: 0 198 | m_CorrespondingSourceObject: {fileID: 0} 199 | m_PrefabInstance: {fileID: 0} 200 | m_PrefabAsset: {fileID: 0} 201 | m_GameObject: {fileID: 519420028} 202 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 203 | m_LocalPosition: {x: 0, y: 0, z: -10} 204 | m_LocalScale: {x: 1, y: 1, z: 1} 205 | m_Children: [] 206 | m_Father: {fileID: 0} 207 | m_RootOrder: 0 208 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 209 | -------------------------------------------------------------------------------- /Assets/Scenes/SampleScene.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2cda990e2423bbf4892e6590ba056729 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD Zero Clause License 2 | 3 | Copyright (c) 2023 prime31 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 9 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 11 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 13 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14 | PERFORMANCE OF THIS SOFTWARE. 15 | -------------------------------------------------------------------------------- /Packages/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.ide.rider": "3.0.24", 4 | "com.unity.textmeshpro": "3.0.6", 5 | "com.unity.ugui": "1.0.0", 6 | "com.unity.modules.audio": "1.0.0", 7 | "com.unity.modules.imageconversion": "1.0.0", 8 | "com.unity.modules.imgui": "1.0.0", 9 | "com.unity.modules.jsonserialize": "1.0.0", 10 | "com.unity.modules.ui": "1.0.0", 11 | "com.unity.modules.uielements": "1.0.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Packages/packages-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.ext.nunit": { 4 | "version": "1.0.6", 5 | "depth": 1, 6 | "source": "registry", 7 | "dependencies": {}, 8 | "url": "https://packages.unity.com" 9 | }, 10 | "com.unity.ide.rider": { 11 | "version": "3.0.24", 12 | "depth": 0, 13 | "source": "registry", 14 | "dependencies": { 15 | "com.unity.ext.nunit": "1.0.6" 16 | }, 17 | "url": "https://packages.unity.com" 18 | }, 19 | "com.unity.textmeshpro": { 20 | "version": "3.0.6", 21 | "depth": 0, 22 | "source": "registry", 23 | "dependencies": { 24 | "com.unity.ugui": "1.0.0" 25 | }, 26 | "url": "https://packages.unity.com" 27 | }, 28 | "com.unity.ugui": { 29 | "version": "1.0.0", 30 | "depth": 0, 31 | "source": "builtin", 32 | "dependencies": { 33 | "com.unity.modules.ui": "1.0.0", 34 | "com.unity.modules.imgui": "1.0.0" 35 | } 36 | }, 37 | "com.unity.modules.audio": { 38 | "version": "1.0.0", 39 | "depth": 0, 40 | "source": "builtin", 41 | "dependencies": {} 42 | }, 43 | "com.unity.modules.imageconversion": { 44 | "version": "1.0.0", 45 | "depth": 0, 46 | "source": "builtin", 47 | "dependencies": {} 48 | }, 49 | "com.unity.modules.imgui": { 50 | "version": "1.0.0", 51 | "depth": 0, 52 | "source": "builtin", 53 | "dependencies": {} 54 | }, 55 | "com.unity.modules.jsonserialize": { 56 | "version": "1.0.0", 57 | "depth": 0, 58 | "source": "builtin", 59 | "dependencies": {} 60 | }, 61 | "com.unity.modules.ui": { 62 | "version": "1.0.0", 63 | "depth": 0, 64 | "source": "builtin", 65 | "dependencies": {} 66 | }, 67 | "com.unity.modules.uielements": { 68 | "version": "1.0.0", 69 | "depth": 0, 70 | "source": "builtin", 71 | "dependencies": { 72 | "com.unity.modules.ui": "1.0.0", 73 | "com.unity.modules.imgui": "1.0.0", 74 | "com.unity.modules.jsonserialize": "1.0.0" 75 | } 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Volume: 1 8 | Rolloff Scale: 1 9 | Doppler Factor: 1 10 | Default Speaker Mode: 2 11 | m_SampleRate: 0 12 | m_DSPBufferSize: 1024 13 | m_VirtualVoiceCount: 512 14 | m_RealVoiceCount: 32 15 | m_SpatializerPlugin: 16 | m_AmbisonicDecoderPlugin: 17 | m_DisableAudio: 0 18 | m_VirtualizeEffects: 1 19 | m_RequestedDSPBufferSize: 0 20 | -------------------------------------------------------------------------------- /ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 13 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_DefaultMaxDepenetrationVelocity: 10 11 | m_SleepThreshold: 0.005 12 | m_DefaultContactOffset: 0.01 13 | m_DefaultSolverIterations: 6 14 | m_DefaultSolverVelocityIterations: 1 15 | m_QueriesHitBackfaces: 0 16 | m_QueriesHitTriggers: 1 17 | m_EnableAdaptiveForce: 0 18 | m_ClothInterCollisionDistance: 0.1 19 | m_ClothInterCollisionStiffness: 0.2 20 | m_ContactsGeneration: 1 21 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 22 | m_AutoSimulation: 1 23 | m_AutoSyncTransforms: 0 24 | m_ReuseCollisionCallbacks: 1 25 | m_ClothInterCollisionSettingsToggle: 0 26 | m_ClothGravity: {x: 0, y: -9.81, z: 0} 27 | m_ContactPairsMode: 0 28 | m_BroadphaseType: 0 29 | m_WorldBounds: 30 | m_Center: {x: 0, y: 0, z: 0} 31 | m_Extent: {x: 250, y: 250, z: 250} 32 | m_WorldSubdivisions: 8 33 | m_FrictionType: 0 34 | m_EnableEnhancedDeterminism: 0 35 | m_EnableUnifiedHeightmaps: 1 36 | m_SolverType: 0 37 | m_DefaultMaxAngularSpeed: 50 38 | -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: 8 | - enabled: 1 9 | path: Assets/Scenes/SampleScene.unity 10 | guid: 2cda990e2423bbf4892e6590ba056729 11 | m_configObjects: {} 12 | -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 11 7 | m_SerializationMode: 2 8 | m_LineEndingsForNewScripts: 0 9 | m_DefaultBehaviorMode: 1 10 | m_PrefabRegularEnvironment: {fileID: 0} 11 | m_PrefabUIEnvironment: {fileID: 0} 12 | m_SpritePackerMode: 5 13 | m_SpritePackerPaddingPower: 1 14 | m_EtcTextureCompressorBehavior: 1 15 | m_EtcTextureFastCompressor: 1 16 | m_EtcTextureNormalCompressor: 2 17 | m_EtcTextureBestCompressor: 4 18 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;asmref;rsp 19 | m_ProjectGenerationRootNamespace: 20 | m_EnableTextureStreamingInEditMode: 1 21 | m_EnableTextureStreamingInPlayMode: 1 22 | m_AsyncShaderCompilation: 1 23 | m_CachingShaderPreprocessor: 1 24 | m_PrefabModeAllowAutoSave: 1 25 | m_EnterPlayModeOptionsEnabled: 0 26 | m_EnterPlayModeOptions: 3 27 | m_GameObjectNamingDigits: 1 28 | m_GameObjectNamingScheme: 0 29 | m_AssetNamingUsesSpace: 1 30 | m_UseLegacyProbeSampleCount: 0 31 | m_SerializeInlineMappingsOnOneLine: 1 32 | m_DisableCookiesInLightmapper: 1 33 | m_AssetPipelineMode: 1 34 | m_CacheServerMode: 0 35 | m_CacheServerEndpoint: 36 | m_CacheServerNamespacePrefix: default 37 | m_CacheServerEnableDownload: 1 38 | m_CacheServerEnableUpload: 1 39 | m_CacheServerEnableAuth: 0 40 | m_CacheServerEnableTls: 0 41 | -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 13 7 | m_Deferred: 8 | m_Mode: 1 9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} 10 | m_DeferredReflections: 11 | m_Mode: 1 12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 1 15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} 16 | m_LegacyDeferred: 17 | m_Mode: 1 18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} 19 | m_DepthNormals: 20 | m_Mode: 1 21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 22 | m_MotionVectors: 23 | m_Mode: 1 24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LightHalo: 26 | m_Mode: 1 27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 28 | m_LensFlare: 29 | m_Mode: 1 30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 31 | m_VideoShadersIncludeMode: 2 32 | m_AlwaysIncludedShaders: 33 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 37 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 38 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 39 | - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} 40 | m_PreloadedShaders: [] 41 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} 42 | m_CustomRenderPipeline: {fileID: 0} 43 | m_TransparencySortMode: 0 44 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 45 | m_DefaultRenderingPath: 1 46 | m_DefaultMobileRenderingPath: 1 47 | m_TierSettings: [] 48 | m_LightmapStripping: 0 49 | m_FogStripping: 0 50 | m_InstancingStripping: 0 51 | m_LightmapKeepPlain: 1 52 | m_LightmapKeepDirCombined: 1 53 | m_LightmapKeepDynamicPlain: 1 54 | m_LightmapKeepDynamicDirCombined: 1 55 | m_LightmapKeepShadowMask: 1 56 | m_LightmapKeepSubtractive: 1 57 | m_FogKeepLinear: 1 58 | m_FogKeepExp: 1 59 | m_FogKeepExp2: 1 60 | m_AlbedoSwatchInfos: [] 61 | m_LightsUseLinearIntensity: 0 62 | m_LightsUseColorTemperature: 0 63 | m_DefaultRenderingLayerMask: 1 64 | m_LogWhenShaderIsCompiled: 0 65 | -------------------------------------------------------------------------------- /ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!13 &1 4 | InputManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Axes: 8 | - serializedVersion: 3 9 | m_Name: Horizontal 10 | descriptiveName: 11 | descriptiveNegativeName: 12 | negativeButton: left 13 | positiveButton: right 14 | altNegativeButton: a 15 | altPositiveButton: d 16 | gravity: 3 17 | dead: 0.001 18 | sensitivity: 3 19 | snap: 1 20 | invert: 0 21 | type: 0 22 | axis: 0 23 | joyNum: 0 24 | - serializedVersion: 3 25 | m_Name: Vertical 26 | descriptiveName: 27 | descriptiveNegativeName: 28 | negativeButton: down 29 | positiveButton: up 30 | altNegativeButton: s 31 | altPositiveButton: w 32 | gravity: 3 33 | dead: 0.001 34 | sensitivity: 3 35 | snap: 1 36 | invert: 0 37 | type: 0 38 | axis: 0 39 | joyNum: 0 40 | - serializedVersion: 3 41 | m_Name: Fire1 42 | descriptiveName: 43 | descriptiveNegativeName: 44 | negativeButton: 45 | positiveButton: left ctrl 46 | altNegativeButton: 47 | altPositiveButton: mouse 0 48 | gravity: 1000 49 | dead: 0.001 50 | sensitivity: 1000 51 | snap: 0 52 | invert: 0 53 | type: 0 54 | axis: 0 55 | joyNum: 0 56 | - serializedVersion: 3 57 | m_Name: Fire2 58 | descriptiveName: 59 | descriptiveNegativeName: 60 | negativeButton: 61 | positiveButton: left alt 62 | altNegativeButton: 63 | altPositiveButton: mouse 1 64 | gravity: 1000 65 | dead: 0.001 66 | sensitivity: 1000 67 | snap: 0 68 | invert: 0 69 | type: 0 70 | axis: 0 71 | joyNum: 0 72 | - serializedVersion: 3 73 | m_Name: Fire3 74 | descriptiveName: 75 | descriptiveNegativeName: 76 | negativeButton: 77 | positiveButton: left shift 78 | altNegativeButton: 79 | altPositiveButton: mouse 2 80 | gravity: 1000 81 | dead: 0.001 82 | sensitivity: 1000 83 | snap: 0 84 | invert: 0 85 | type: 0 86 | axis: 0 87 | joyNum: 0 88 | - serializedVersion: 3 89 | m_Name: Jump 90 | descriptiveName: 91 | descriptiveNegativeName: 92 | negativeButton: 93 | positiveButton: space 94 | altNegativeButton: 95 | altPositiveButton: 96 | gravity: 1000 97 | dead: 0.001 98 | sensitivity: 1000 99 | snap: 0 100 | invert: 0 101 | type: 0 102 | axis: 0 103 | joyNum: 0 104 | - serializedVersion: 3 105 | m_Name: Mouse X 106 | descriptiveName: 107 | descriptiveNegativeName: 108 | negativeButton: 109 | positiveButton: 110 | altNegativeButton: 111 | altPositiveButton: 112 | gravity: 0 113 | dead: 0 114 | sensitivity: 0.1 115 | snap: 0 116 | invert: 0 117 | type: 1 118 | axis: 0 119 | joyNum: 0 120 | - serializedVersion: 3 121 | m_Name: Mouse Y 122 | descriptiveName: 123 | descriptiveNegativeName: 124 | negativeButton: 125 | positiveButton: 126 | altNegativeButton: 127 | altPositiveButton: 128 | gravity: 0 129 | dead: 0 130 | sensitivity: 0.1 131 | snap: 0 132 | invert: 0 133 | type: 1 134 | axis: 1 135 | joyNum: 0 136 | - serializedVersion: 3 137 | m_Name: Mouse ScrollWheel 138 | descriptiveName: 139 | descriptiveNegativeName: 140 | negativeButton: 141 | positiveButton: 142 | altNegativeButton: 143 | altPositiveButton: 144 | gravity: 0 145 | dead: 0 146 | sensitivity: 0.1 147 | snap: 0 148 | invert: 0 149 | type: 1 150 | axis: 2 151 | joyNum: 0 152 | - serializedVersion: 3 153 | m_Name: Horizontal 154 | descriptiveName: 155 | descriptiveNegativeName: 156 | negativeButton: 157 | positiveButton: 158 | altNegativeButton: 159 | altPositiveButton: 160 | gravity: 0 161 | dead: 0.19 162 | sensitivity: 1 163 | snap: 0 164 | invert: 0 165 | type: 2 166 | axis: 0 167 | joyNum: 0 168 | - serializedVersion: 3 169 | m_Name: Vertical 170 | descriptiveName: 171 | descriptiveNegativeName: 172 | negativeButton: 173 | positiveButton: 174 | altNegativeButton: 175 | altPositiveButton: 176 | gravity: 0 177 | dead: 0.19 178 | sensitivity: 1 179 | snap: 0 180 | invert: 1 181 | type: 2 182 | axis: 1 183 | joyNum: 0 184 | - serializedVersion: 3 185 | m_Name: Fire1 186 | descriptiveName: 187 | descriptiveNegativeName: 188 | negativeButton: 189 | positiveButton: joystick button 0 190 | altNegativeButton: 191 | altPositiveButton: 192 | gravity: 1000 193 | dead: 0.001 194 | sensitivity: 1000 195 | snap: 0 196 | invert: 0 197 | type: 0 198 | axis: 0 199 | joyNum: 0 200 | - serializedVersion: 3 201 | m_Name: Fire2 202 | descriptiveName: 203 | descriptiveNegativeName: 204 | negativeButton: 205 | positiveButton: joystick button 1 206 | altNegativeButton: 207 | altPositiveButton: 208 | gravity: 1000 209 | dead: 0.001 210 | sensitivity: 1000 211 | snap: 0 212 | invert: 0 213 | type: 0 214 | axis: 0 215 | joyNum: 0 216 | - serializedVersion: 3 217 | m_Name: Fire3 218 | descriptiveName: 219 | descriptiveNegativeName: 220 | negativeButton: 221 | positiveButton: joystick button 2 222 | altNegativeButton: 223 | altPositiveButton: 224 | gravity: 1000 225 | dead: 0.001 226 | sensitivity: 1000 227 | snap: 0 228 | invert: 0 229 | type: 0 230 | axis: 0 231 | joyNum: 0 232 | - serializedVersion: 3 233 | m_Name: Jump 234 | descriptiveName: 235 | descriptiveNegativeName: 236 | negativeButton: 237 | positiveButton: joystick button 3 238 | altNegativeButton: 239 | altPositiveButton: 240 | gravity: 1000 241 | dead: 0.001 242 | sensitivity: 1000 243 | snap: 0 244 | invert: 0 245 | type: 0 246 | axis: 0 247 | joyNum: 0 248 | - serializedVersion: 3 249 | m_Name: Submit 250 | descriptiveName: 251 | descriptiveNegativeName: 252 | negativeButton: 253 | positiveButton: return 254 | altNegativeButton: 255 | altPositiveButton: joystick button 0 256 | gravity: 1000 257 | dead: 0.001 258 | sensitivity: 1000 259 | snap: 0 260 | invert: 0 261 | type: 0 262 | axis: 0 263 | joyNum: 0 264 | - serializedVersion: 3 265 | m_Name: Submit 266 | descriptiveName: 267 | descriptiveNegativeName: 268 | negativeButton: 269 | positiveButton: enter 270 | altNegativeButton: 271 | altPositiveButton: space 272 | gravity: 1000 273 | dead: 0.001 274 | sensitivity: 1000 275 | snap: 0 276 | invert: 0 277 | type: 0 278 | axis: 0 279 | joyNum: 0 280 | - serializedVersion: 3 281 | m_Name: Cancel 282 | descriptiveName: 283 | descriptiveNegativeName: 284 | negativeButton: 285 | positiveButton: escape 286 | altNegativeButton: 287 | altPositiveButton: joystick button 1 288 | gravity: 1000 289 | dead: 0.001 290 | sensitivity: 1000 291 | snap: 0 292 | invert: 0 293 | type: 0 294 | axis: 0 295 | joyNum: 0 296 | - serializedVersion: 3 297 | m_Name: Enable Debug Button 1 298 | descriptiveName: 299 | descriptiveNegativeName: 300 | negativeButton: 301 | positiveButton: left ctrl 302 | altNegativeButton: 303 | altPositiveButton: joystick button 8 304 | gravity: 0 305 | dead: 0 306 | sensitivity: 0 307 | snap: 0 308 | invert: 0 309 | type: 0 310 | axis: 0 311 | joyNum: 0 312 | - serializedVersion: 3 313 | m_Name: Enable Debug Button 2 314 | descriptiveName: 315 | descriptiveNegativeName: 316 | negativeButton: 317 | positiveButton: backspace 318 | altNegativeButton: 319 | altPositiveButton: joystick button 9 320 | gravity: 0 321 | dead: 0 322 | sensitivity: 0 323 | snap: 0 324 | invert: 0 325 | type: 0 326 | axis: 0 327 | joyNum: 0 328 | - serializedVersion: 3 329 | m_Name: Debug Reset 330 | descriptiveName: 331 | descriptiveNegativeName: 332 | negativeButton: 333 | positiveButton: left alt 334 | altNegativeButton: 335 | altPositiveButton: joystick button 1 336 | gravity: 0 337 | dead: 0 338 | sensitivity: 0 339 | snap: 0 340 | invert: 0 341 | type: 0 342 | axis: 0 343 | joyNum: 0 344 | - serializedVersion: 3 345 | m_Name: Debug Next 346 | descriptiveName: 347 | descriptiveNegativeName: 348 | negativeButton: 349 | positiveButton: page down 350 | altNegativeButton: 351 | altPositiveButton: joystick button 5 352 | gravity: 0 353 | dead: 0 354 | sensitivity: 0 355 | snap: 0 356 | invert: 0 357 | type: 0 358 | axis: 0 359 | joyNum: 0 360 | - serializedVersion: 3 361 | m_Name: Debug Previous 362 | descriptiveName: 363 | descriptiveNegativeName: 364 | negativeButton: 365 | positiveButton: page up 366 | altNegativeButton: 367 | altPositiveButton: joystick button 4 368 | gravity: 0 369 | dead: 0 370 | sensitivity: 0 371 | snap: 0 372 | invert: 0 373 | type: 0 374 | axis: 0 375 | joyNum: 0 376 | - serializedVersion: 3 377 | m_Name: Debug Validate 378 | descriptiveName: 379 | descriptiveNegativeName: 380 | negativeButton: 381 | positiveButton: return 382 | altNegativeButton: 383 | altPositiveButton: joystick button 0 384 | gravity: 0 385 | dead: 0 386 | sensitivity: 0 387 | snap: 0 388 | invert: 0 389 | type: 0 390 | axis: 0 391 | joyNum: 0 392 | - serializedVersion: 3 393 | m_Name: Debug Persistent 394 | descriptiveName: 395 | descriptiveNegativeName: 396 | negativeButton: 397 | positiveButton: right shift 398 | altNegativeButton: 399 | altPositiveButton: joystick button 2 400 | gravity: 0 401 | dead: 0 402 | sensitivity: 0 403 | snap: 0 404 | invert: 0 405 | type: 0 406 | axis: 0 407 | joyNum: 0 408 | - serializedVersion: 3 409 | m_Name: Debug Multiplier 410 | descriptiveName: 411 | descriptiveNegativeName: 412 | negativeButton: 413 | positiveButton: left shift 414 | altNegativeButton: 415 | altPositiveButton: joystick button 3 416 | gravity: 0 417 | dead: 0 418 | sensitivity: 0 419 | snap: 0 420 | invert: 0 421 | type: 0 422 | axis: 0 423 | joyNum: 0 424 | - serializedVersion: 3 425 | m_Name: Debug Horizontal 426 | descriptiveName: 427 | descriptiveNegativeName: 428 | negativeButton: left 429 | positiveButton: right 430 | altNegativeButton: 431 | altPositiveButton: 432 | gravity: 1000 433 | dead: 0.001 434 | sensitivity: 1000 435 | snap: 0 436 | invert: 0 437 | type: 0 438 | axis: 0 439 | joyNum: 0 440 | - serializedVersion: 3 441 | m_Name: Debug Vertical 442 | descriptiveName: 443 | descriptiveNegativeName: 444 | negativeButton: down 445 | positiveButton: up 446 | altNegativeButton: 447 | altPositiveButton: 448 | gravity: 1000 449 | dead: 0.001 450 | sensitivity: 1000 451 | snap: 0 452 | invert: 0 453 | type: 0 454 | axis: 0 455 | joyNum: 0 456 | - serializedVersion: 3 457 | m_Name: Debug Vertical 458 | descriptiveName: 459 | descriptiveNegativeName: 460 | negativeButton: down 461 | positiveButton: up 462 | altNegativeButton: 463 | altPositiveButton: 464 | gravity: 1000 465 | dead: 0.001 466 | sensitivity: 1000 467 | snap: 0 468 | invert: 0 469 | type: 2 470 | axis: 6 471 | joyNum: 0 472 | - serializedVersion: 3 473 | m_Name: Debug Horizontal 474 | descriptiveName: 475 | descriptiveNegativeName: 476 | negativeButton: left 477 | positiveButton: right 478 | altNegativeButton: 479 | altPositiveButton: 480 | gravity: 1000 481 | dead: 0.001 482 | sensitivity: 1000 483 | snap: 0 484 | invert: 0 485 | type: 2 486 | axis: 5 487 | joyNum: 0 488 | -------------------------------------------------------------------------------- /ProjectSettings/MemorySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!387306366 &1 4 | MemorySettings: 5 | m_ObjectHideFlags: 0 6 | m_EditorMemorySettings: 7 | m_MainAllocatorBlockSize: -1 8 | m_ThreadAllocatorBlockSize: -1 9 | m_MainGfxBlockSize: -1 10 | m_ThreadGfxBlockSize: -1 11 | m_CacheBlockSize: -1 12 | m_TypetreeBlockSize: -1 13 | m_ProfilerBlockSize: -1 14 | m_ProfilerEditorBlockSize: -1 15 | m_BucketAllocatorGranularity: -1 16 | m_BucketAllocatorBucketsCount: -1 17 | m_BucketAllocatorBlockSize: -1 18 | m_BucketAllocatorBlockCount: -1 19 | m_ProfilerBucketAllocatorGranularity: -1 20 | m_ProfilerBucketAllocatorBucketsCount: -1 21 | m_ProfilerBucketAllocatorBlockSize: -1 22 | m_ProfilerBucketAllocatorBlockCount: -1 23 | m_TempAllocatorSizeMain: -1 24 | m_JobTempAllocatorBlockSize: -1 25 | m_BackgroundJobTempAllocatorBlockSize: -1 26 | m_JobTempAllocatorReducedBlockSize: -1 27 | m_TempAllocatorSizeGIBakingWorker: -1 28 | m_TempAllocatorSizeNavMeshWorker: -1 29 | m_TempAllocatorSizeAudioWorker: -1 30 | m_TempAllocatorSizeCloudWorker: -1 31 | m_TempAllocatorSizeGfx: -1 32 | m_TempAllocatorSizeJobWorker: -1 33 | m_TempAllocatorSizeBackgroundWorker: -1 34 | m_TempAllocatorSizePreloadManager: -1 35 | m_PlatformMemorySettings: {} 36 | -------------------------------------------------------------------------------- /ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 2 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | accuratePlacement: 0 88 | maxJobWorkers: 0 89 | preserveTilesOutsideBounds: 0 90 | debug: 91 | m_Flags: 0 92 | m_SettingNames: 93 | - Humanoid 94 | -------------------------------------------------------------------------------- /ProjectSettings/NetworkManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!149 &1 4 | NetworkManager: 5 | m_ObjectHideFlags: 0 6 | m_DebugLevel: 0 7 | m_Sendrate: 15 8 | m_AssetToPrefab: {} 9 | -------------------------------------------------------------------------------- /ProjectSettings/PackageManagerSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &1 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 61 6 | m_CorrespondingSourceObject: {fileID: 0} 7 | m_PrefabInstance: {fileID: 0} 8 | m_PrefabAsset: {fileID: 0} 9 | m_GameObject: {fileID: 0} 10 | m_Enabled: 1 11 | m_EditorHideFlags: 0 12 | m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} 13 | m_Name: 14 | m_EditorClassIdentifier: 15 | m_EnablePreReleasePackages: 0 16 | m_EnablePackageDependencies: 0 17 | m_AdvancedSettingsExpanded: 1 18 | m_ScopedRegistriesSettingsExpanded: 1 19 | m_SeeAllPackageVersions: 0 20 | oneTimeWarningShown: 0 21 | m_Registries: 22 | - m_Id: main 23 | m_Name: 24 | m_Url: https://packages.unity.com 25 | m_Scopes: [] 26 | m_IsDefault: 1 27 | m_Capabilities: 7 28 | m_UserSelectedRegistryName: 29 | m_UserAddingNewScopedRegistry: 0 30 | m_RegistryInfoDraft: 31 | m_ErrorMessage: 32 | m_Original: 33 | m_Id: 34 | m_Name: 35 | m_Url: 36 | m_Scopes: [] 37 | m_IsDefault: 0 38 | m_Capabilities: 0 39 | m_Modified: 0 40 | m_Name: 41 | m_Url: 42 | m_Scopes: 43 | - 44 | m_SelectedScopeIndex: 0 45 | -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_JobOptions: 23 | serializedVersion: 2 24 | useMultithreading: 0 25 | useConsistencySorting: 0 26 | m_InterpolationPosesPerJob: 100 27 | m_NewContactsPerJob: 30 28 | m_CollideContactsPerJob: 100 29 | m_ClearFlagsPerJob: 200 30 | m_ClearBodyForcesPerJob: 200 31 | m_SyncDiscreteFixturesPerJob: 50 32 | m_SyncContinuousFixturesPerJob: 50 33 | m_FindNearestContactsPerJob: 100 34 | m_UpdateTriggerContactsPerJob: 100 35 | m_IslandSolverCostThreshold: 100 36 | m_IslandSolverBodyCostScale: 1 37 | m_IslandSolverContactCostScale: 10 38 | m_IslandSolverJointCostScale: 10 39 | m_IslandSolverBodiesPerJob: 50 40 | m_IslandSolverContactsPerJob: 50 41 | m_SimulationMode: 0 42 | m_QueriesHitTriggers: 1 43 | m_QueriesStartInColliders: 1 44 | m_CallbacksOnDisable: 1 45 | m_ReuseCollisionCallbacks: 1 46 | m_AutoSyncTransforms: 0 47 | m_AlwaysShowColliders: 0 48 | m_ShowColliderSleep: 1 49 | m_ShowColliderContacts: 0 50 | m_ShowColliderAABB: 0 51 | m_ContactArrowScale: 0.2 52 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 53 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 54 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 55 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 56 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 57 | -------------------------------------------------------------------------------- /ProjectSettings/PresetManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1386491679 &1 4 | PresetManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_DefaultPresets: {} 8 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!129 &1 4 | PlayerSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 26 7 | productGUID: dcf355b16010148fdbfe45cc76feac21 8 | AndroidProfiler: 0 9 | AndroidFilterTouchesWhenObscured: 0 10 | AndroidEnableSustainedPerformanceMode: 0 11 | defaultScreenOrientation: 4 12 | targetDevice: 2 13 | useOnDemandResources: 0 14 | accelerometerFrequency: 60 15 | companyName: DefaultCompany 16 | productName: My project 17 | defaultCursor: {fileID: 0} 18 | cursorHotspot: {x: 0, y: 0} 19 | m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} 20 | m_ShowUnitySplashScreen: 1 21 | m_ShowUnitySplashLogo: 1 22 | m_SplashScreenOverlayOpacity: 1 23 | m_SplashScreenAnimation: 1 24 | m_SplashScreenLogoStyle: 1 25 | m_SplashScreenDrawMode: 0 26 | m_SplashScreenBackgroundAnimationZoom: 1 27 | m_SplashScreenLogoAnimationZoom: 1 28 | m_SplashScreenBackgroundLandscapeAspect: 1 29 | m_SplashScreenBackgroundPortraitAspect: 1 30 | m_SplashScreenBackgroundLandscapeUvs: 31 | serializedVersion: 2 32 | x: 0 33 | y: 0 34 | width: 1 35 | height: 1 36 | m_SplashScreenBackgroundPortraitUvs: 37 | serializedVersion: 2 38 | x: 0 39 | y: 0 40 | width: 1 41 | height: 1 42 | m_SplashScreenLogos: [] 43 | m_VirtualRealitySplashScreen: {fileID: 0} 44 | m_HolographicTrackingLossScreen: {fileID: 0} 45 | defaultScreenWidth: 1920 46 | defaultScreenHeight: 1080 47 | defaultScreenWidthWeb: 960 48 | defaultScreenHeightWeb: 600 49 | m_StereoRenderingPath: 0 50 | m_ActiveColorSpace: 1 51 | m_SpriteBatchVertexThreshold: 300 52 | m_MTRendering: 1 53 | mipStripping: 0 54 | numberOfMipsStripped: 0 55 | numberOfMipsStrippedPerMipmapLimitGroup: {} 56 | m_StackTraceTypes: 010000000100000001000000010000000100000001000000 57 | iosShowActivityIndicatorOnLoading: -1 58 | androidShowActivityIndicatorOnLoading: -1 59 | iosUseCustomAppBackgroundBehavior: 0 60 | allowedAutorotateToPortrait: 1 61 | allowedAutorotateToPortraitUpsideDown: 1 62 | allowedAutorotateToLandscapeRight: 1 63 | allowedAutorotateToLandscapeLeft: 1 64 | useOSAutorotation: 1 65 | use32BitDisplayBuffer: 1 66 | preserveFramebufferAlpha: 0 67 | disableDepthAndStencilBuffers: 0 68 | androidStartInFullscreen: 1 69 | androidRenderOutsideSafeArea: 1 70 | androidUseSwappy: 1 71 | androidBlitType: 0 72 | androidResizableWindow: 0 73 | androidDefaultWindowWidth: 1920 74 | androidDefaultWindowHeight: 1080 75 | androidMinimumWindowWidth: 400 76 | androidMinimumWindowHeight: 300 77 | androidFullscreenMode: 1 78 | defaultIsNativeResolution: 1 79 | macRetinaSupport: 1 80 | runInBackground: 0 81 | captureSingleScreen: 0 82 | muteOtherAudioSources: 0 83 | Prepare IOS For Recording: 0 84 | Force IOS Speakers When Recording: 0 85 | deferSystemGesturesMode: 0 86 | hideHomeButton: 0 87 | submitAnalytics: 1 88 | usePlayerLog: 1 89 | bakeCollisionMeshes: 0 90 | forceSingleInstance: 0 91 | useFlipModelSwapchain: 1 92 | resizableWindow: 0 93 | useMacAppStoreValidation: 0 94 | macAppStoreCategory: public.app-category.games 95 | gpuSkinning: 0 96 | xboxPIXTextureCapture: 0 97 | xboxEnableAvatar: 0 98 | xboxEnableKinect: 0 99 | xboxEnableKinectAutoTracking: 0 100 | xboxEnableFitness: 0 101 | visibleInBackground: 1 102 | allowFullscreenSwitch: 1 103 | fullscreenMode: 1 104 | xboxSpeechDB: 0 105 | xboxEnableHeadOrientation: 0 106 | xboxEnableGuest: 0 107 | xboxEnablePIXSampling: 0 108 | metalFramebufferOnly: 0 109 | xboxOneResolution: 0 110 | xboxOneSResolution: 0 111 | xboxOneXResolution: 3 112 | xboxOneMonoLoggingLevel: 0 113 | xboxOneLoggingLevel: 1 114 | xboxOneDisableEsram: 0 115 | xboxOneEnableTypeOptimization: 0 116 | xboxOnePresentImmediateThreshold: 0 117 | switchQueueCommandMemory: 1048576 118 | switchQueueControlMemory: 16384 119 | switchQueueComputeMemory: 262144 120 | switchNVNShaderPoolsGranularity: 33554432 121 | switchNVNDefaultPoolsGranularity: 16777216 122 | switchNVNOtherPoolsGranularity: 16777216 123 | switchGpuScratchPoolGranularity: 2097152 124 | switchAllowGpuScratchShrinking: 0 125 | switchNVNMaxPublicTextureIDCount: 0 126 | switchNVNMaxPublicSamplerIDCount: 0 127 | switchNVNGraphicsFirmwareMemory: 32 128 | stadiaPresentMode: 0 129 | stadiaTargetFramerate: 0 130 | vulkanNumSwapchainBuffers: 3 131 | vulkanEnableSetSRGBWrite: 0 132 | vulkanEnablePreTransform: 0 133 | vulkanEnableLateAcquireNextImage: 0 134 | vulkanEnableCommandBufferRecycling: 1 135 | loadStoreDebugModeEnabled: 0 136 | bundleVersion: 1.0 137 | preloadedAssets: [] 138 | metroInputSource: 0 139 | wsaTransparentSwapchain: 0 140 | m_HolographicPauseOnTrackingLoss: 1 141 | xboxOneDisableKinectGpuReservation: 1 142 | xboxOneEnable7thCore: 1 143 | vrSettings: 144 | enable360StereoCapture: 0 145 | isWsaHolographicRemotingEnabled: 0 146 | enableFrameTimingStats: 0 147 | enableOpenGLProfilerGPURecorders: 1 148 | useHDRDisplay: 0 149 | hdrBitDepth: 0 150 | m_ColorGamuts: 00000000 151 | targetPixelDensity: 30 152 | resolutionScalingMode: 0 153 | resetResolutionOnWindowResize: 0 154 | androidSupportedAspectRatio: 1 155 | androidMaxAspectRatio: 2.1 156 | applicationIdentifier: 157 | Standalone: com.DefaultCompany.2DProject 158 | buildNumber: 159 | Bratwurst: 0 160 | Standalone: 0 161 | iPhone: 0 162 | tvOS: 0 163 | overrideDefaultApplicationIdentifier: 1 164 | AndroidBundleVersionCode: 1 165 | AndroidMinSdkVersion: 22 166 | AndroidTargetSdkVersion: 0 167 | AndroidPreferredInstallLocation: 1 168 | aotOptions: 169 | stripEngineCode: 1 170 | iPhoneStrippingLevel: 0 171 | iPhoneScriptCallOptimization: 0 172 | ForceInternetPermission: 0 173 | ForceSDCardPermission: 0 174 | CreateWallpaper: 0 175 | APKExpansionFiles: 0 176 | keepLoadedShadersAlive: 0 177 | StripUnusedMeshComponents: 0 178 | strictShaderVariantMatching: 0 179 | VertexChannelCompressionMask: 4054 180 | iPhoneSdkVersion: 988 181 | iOSTargetOSVersionString: 12.0 182 | tvOSSdkVersion: 0 183 | tvOSRequireExtendedGameController: 0 184 | tvOSTargetOSVersionString: 12.0 185 | bratwurstSdkVersion: 0 186 | bratwurstTargetOSVersionString: 16.4 187 | uIPrerenderedIcon: 0 188 | uIRequiresPersistentWiFi: 0 189 | uIRequiresFullScreen: 1 190 | uIStatusBarHidden: 1 191 | uIExitOnSuspend: 0 192 | uIStatusBarStyle: 0 193 | appleTVSplashScreen: {fileID: 0} 194 | appleTVSplashScreen2x: {fileID: 0} 195 | tvOSSmallIconLayers: [] 196 | tvOSSmallIconLayers2x: [] 197 | tvOSLargeIconLayers: [] 198 | tvOSLargeIconLayers2x: [] 199 | tvOSTopShelfImageLayers: [] 200 | tvOSTopShelfImageLayers2x: [] 201 | tvOSTopShelfImageWideLayers: [] 202 | tvOSTopShelfImageWideLayers2x: [] 203 | iOSLaunchScreenType: 0 204 | iOSLaunchScreenPortrait: {fileID: 0} 205 | iOSLaunchScreenLandscape: {fileID: 0} 206 | iOSLaunchScreenBackgroundColor: 207 | serializedVersion: 2 208 | rgba: 0 209 | iOSLaunchScreenFillPct: 100 210 | iOSLaunchScreenSize: 100 211 | iOSLaunchScreenCustomXibPath: 212 | iOSLaunchScreeniPadType: 0 213 | iOSLaunchScreeniPadImage: {fileID: 0} 214 | iOSLaunchScreeniPadBackgroundColor: 215 | serializedVersion: 2 216 | rgba: 0 217 | iOSLaunchScreeniPadFillPct: 100 218 | iOSLaunchScreeniPadSize: 100 219 | iOSLaunchScreeniPadCustomXibPath: 220 | iOSLaunchScreenCustomStoryboardPath: 221 | iOSLaunchScreeniPadCustomStoryboardPath: 222 | iOSDeviceRequirements: [] 223 | iOSURLSchemes: [] 224 | macOSURLSchemes: [] 225 | iOSBackgroundModes: 0 226 | iOSMetalForceHardShadows: 0 227 | metalEditorSupport: 1 228 | metalAPIValidation: 1 229 | iOSRenderExtraFrameOnPause: 0 230 | iosCopyPluginsCodeInsteadOfSymlink: 0 231 | appleDeveloperTeamID: 232 | iOSManualSigningProvisioningProfileID: 233 | tvOSManualSigningProvisioningProfileID: 234 | bratwurstManualSigningProvisioningProfileID: 235 | iOSManualSigningProvisioningProfileType: 0 236 | tvOSManualSigningProvisioningProfileType: 0 237 | bratwurstManualSigningProvisioningProfileType: 0 238 | appleEnableAutomaticSigning: 0 239 | iOSRequireARKit: 0 240 | iOSAutomaticallyDetectAndAddCapabilities: 1 241 | appleEnableProMotion: 0 242 | shaderPrecisionModel: 0 243 | clonedFromGUID: 10ad67313f4034357812315f3c407484 244 | templatePackageId: com.unity.template.2d@7.0.3 245 | templateDefaultScene: Assets/Scenes/SampleScene.unity 246 | useCustomMainManifest: 0 247 | useCustomLauncherManifest: 0 248 | useCustomMainGradleTemplate: 0 249 | useCustomLauncherGradleManifest: 0 250 | useCustomBaseGradleTemplate: 0 251 | useCustomGradlePropertiesTemplate: 0 252 | useCustomGradleSettingsTemplate: 0 253 | useCustomProguardFile: 0 254 | AndroidTargetArchitectures: 1 255 | AndroidTargetDevices: 0 256 | AndroidSplashScreenScale: 0 257 | androidSplashScreen: {fileID: 0} 258 | AndroidKeystoreName: 259 | AndroidKeyaliasName: 260 | AndroidEnableArmv9SecurityFeatures: 0 261 | AndroidBuildApkPerCpuArchitecture: 0 262 | AndroidTVCompatibility: 0 263 | AndroidIsGame: 1 264 | AndroidEnableTango: 0 265 | androidEnableBanner: 1 266 | androidUseLowAccuracyLocation: 0 267 | androidUseCustomKeystore: 0 268 | m_AndroidBanners: 269 | - width: 320 270 | height: 180 271 | banner: {fileID: 0} 272 | androidGamepadSupportLevel: 0 273 | chromeosInputEmulation: 1 274 | AndroidMinifyRelease: 0 275 | AndroidMinifyDebug: 0 276 | AndroidValidateAppBundleSize: 1 277 | AndroidAppBundleSizeToValidate: 150 278 | m_BuildTargetIcons: [] 279 | m_BuildTargetPlatformIcons: 280 | - m_BuildTarget: iPhone 281 | m_Icons: 282 | - m_Textures: [] 283 | m_Width: 180 284 | m_Height: 180 285 | m_Kind: 0 286 | m_SubKind: iPhone 287 | - m_Textures: [] 288 | m_Width: 120 289 | m_Height: 120 290 | m_Kind: 0 291 | m_SubKind: iPhone 292 | - m_Textures: [] 293 | m_Width: 167 294 | m_Height: 167 295 | m_Kind: 0 296 | m_SubKind: iPad 297 | - m_Textures: [] 298 | m_Width: 152 299 | m_Height: 152 300 | m_Kind: 0 301 | m_SubKind: iPad 302 | - m_Textures: [] 303 | m_Width: 76 304 | m_Height: 76 305 | m_Kind: 0 306 | m_SubKind: iPad 307 | - m_Textures: [] 308 | m_Width: 120 309 | m_Height: 120 310 | m_Kind: 3 311 | m_SubKind: iPhone 312 | - m_Textures: [] 313 | m_Width: 80 314 | m_Height: 80 315 | m_Kind: 3 316 | m_SubKind: iPhone 317 | - m_Textures: [] 318 | m_Width: 80 319 | m_Height: 80 320 | m_Kind: 3 321 | m_SubKind: iPad 322 | - m_Textures: [] 323 | m_Width: 40 324 | m_Height: 40 325 | m_Kind: 3 326 | m_SubKind: iPad 327 | - m_Textures: [] 328 | m_Width: 87 329 | m_Height: 87 330 | m_Kind: 1 331 | m_SubKind: iPhone 332 | - m_Textures: [] 333 | m_Width: 58 334 | m_Height: 58 335 | m_Kind: 1 336 | m_SubKind: iPhone 337 | - m_Textures: [] 338 | m_Width: 29 339 | m_Height: 29 340 | m_Kind: 1 341 | m_SubKind: iPhone 342 | - m_Textures: [] 343 | m_Width: 58 344 | m_Height: 58 345 | m_Kind: 1 346 | m_SubKind: iPad 347 | - m_Textures: [] 348 | m_Width: 29 349 | m_Height: 29 350 | m_Kind: 1 351 | m_SubKind: iPad 352 | - m_Textures: [] 353 | m_Width: 60 354 | m_Height: 60 355 | m_Kind: 2 356 | m_SubKind: iPhone 357 | - m_Textures: [] 358 | m_Width: 40 359 | m_Height: 40 360 | m_Kind: 2 361 | m_SubKind: iPhone 362 | - m_Textures: [] 363 | m_Width: 40 364 | m_Height: 40 365 | m_Kind: 2 366 | m_SubKind: iPad 367 | - m_Textures: [] 368 | m_Width: 20 369 | m_Height: 20 370 | m_Kind: 2 371 | m_SubKind: iPad 372 | - m_Textures: [] 373 | m_Width: 1024 374 | m_Height: 1024 375 | m_Kind: 4 376 | m_SubKind: App Store 377 | - m_BuildTarget: Android 378 | m_Icons: 379 | - m_Textures: [] 380 | m_Width: 432 381 | m_Height: 432 382 | m_Kind: 2 383 | m_SubKind: 384 | - m_Textures: [] 385 | m_Width: 324 386 | m_Height: 324 387 | m_Kind: 2 388 | m_SubKind: 389 | - m_Textures: [] 390 | m_Width: 216 391 | m_Height: 216 392 | m_Kind: 2 393 | m_SubKind: 394 | - m_Textures: [] 395 | m_Width: 162 396 | m_Height: 162 397 | m_Kind: 2 398 | m_SubKind: 399 | - m_Textures: [] 400 | m_Width: 108 401 | m_Height: 108 402 | m_Kind: 2 403 | m_SubKind: 404 | - m_Textures: [] 405 | m_Width: 81 406 | m_Height: 81 407 | m_Kind: 2 408 | m_SubKind: 409 | - m_Textures: [] 410 | m_Width: 192 411 | m_Height: 192 412 | m_Kind: 1 413 | m_SubKind: 414 | - m_Textures: [] 415 | m_Width: 144 416 | m_Height: 144 417 | m_Kind: 1 418 | m_SubKind: 419 | - m_Textures: [] 420 | m_Width: 96 421 | m_Height: 96 422 | m_Kind: 1 423 | m_SubKind: 424 | - m_Textures: [] 425 | m_Width: 72 426 | m_Height: 72 427 | m_Kind: 1 428 | m_SubKind: 429 | - m_Textures: [] 430 | m_Width: 48 431 | m_Height: 48 432 | m_Kind: 1 433 | m_SubKind: 434 | - m_Textures: [] 435 | m_Width: 36 436 | m_Height: 36 437 | m_Kind: 1 438 | m_SubKind: 439 | - m_Textures: [] 440 | m_Width: 192 441 | m_Height: 192 442 | m_Kind: 0 443 | m_SubKind: 444 | - m_Textures: [] 445 | m_Width: 144 446 | m_Height: 144 447 | m_Kind: 0 448 | m_SubKind: 449 | - m_Textures: [] 450 | m_Width: 96 451 | m_Height: 96 452 | m_Kind: 0 453 | m_SubKind: 454 | - m_Textures: [] 455 | m_Width: 72 456 | m_Height: 72 457 | m_Kind: 0 458 | m_SubKind: 459 | - m_Textures: [] 460 | m_Width: 48 461 | m_Height: 48 462 | m_Kind: 0 463 | m_SubKind: 464 | - m_Textures: [] 465 | m_Width: 36 466 | m_Height: 36 467 | m_Kind: 0 468 | m_SubKind: 469 | m_BuildTargetBatching: [] 470 | m_BuildTargetShaderSettings: [] 471 | m_BuildTargetGraphicsJobs: 472 | - m_BuildTarget: MacStandaloneSupport 473 | m_GraphicsJobs: 0 474 | - m_BuildTarget: Switch 475 | m_GraphicsJobs: 0 476 | - m_BuildTarget: MetroSupport 477 | m_GraphicsJobs: 0 478 | - m_BuildTarget: AppleTVSupport 479 | m_GraphicsJobs: 0 480 | - m_BuildTarget: BJMSupport 481 | m_GraphicsJobs: 0 482 | - m_BuildTarget: LinuxStandaloneSupport 483 | m_GraphicsJobs: 0 484 | - m_BuildTarget: PS4Player 485 | m_GraphicsJobs: 0 486 | - m_BuildTarget: iOSSupport 487 | m_GraphicsJobs: 0 488 | - m_BuildTarget: WindowsStandaloneSupport 489 | m_GraphicsJobs: 0 490 | - m_BuildTarget: XboxOnePlayer 491 | m_GraphicsJobs: 0 492 | - m_BuildTarget: LuminSupport 493 | m_GraphicsJobs: 0 494 | - m_BuildTarget: AndroidPlayer 495 | m_GraphicsJobs: 0 496 | - m_BuildTarget: WebGLSupport 497 | m_GraphicsJobs: 0 498 | m_BuildTargetGraphicsJobMode: [] 499 | m_BuildTargetGraphicsAPIs: 500 | - m_BuildTarget: AndroidPlayer 501 | m_APIs: 150000000b000000 502 | m_Automatic: 1 503 | - m_BuildTarget: iOSSupport 504 | m_APIs: 10000000 505 | m_Automatic: 1 506 | m_BuildTargetVRSettings: [] 507 | m_DefaultShaderChunkSizeInMB: 16 508 | m_DefaultShaderChunkCount: 0 509 | openGLRequireES31: 0 510 | openGLRequireES31AEP: 0 511 | openGLRequireES32: 0 512 | m_TemplateCustomTags: {} 513 | mobileMTRendering: 514 | Android: 1 515 | iPhone: 1 516 | tvOS: 1 517 | m_BuildTargetGroupLightmapEncodingQuality: [] 518 | m_BuildTargetGroupHDRCubemapEncodingQuality: [] 519 | m_BuildTargetGroupLightmapSettings: [] 520 | m_BuildTargetGroupLoadStoreDebugModeSettings: [] 521 | m_BuildTargetNormalMapEncoding: [] 522 | m_BuildTargetDefaultTextureCompressionFormat: 523 | - m_BuildTarget: Android 524 | m_Format: 3 525 | playModeTestRunnerEnabled: 0 526 | runPlayModeTestAsEditModeTest: 0 527 | actionOnDotNetUnhandledException: 1 528 | enableInternalProfiler: 0 529 | logObjCUncaughtExceptions: 1 530 | enableCrashReportAPI: 0 531 | cameraUsageDescription: 532 | locationUsageDescription: 533 | microphoneUsageDescription: 534 | bluetoothUsageDescription: 535 | macOSTargetOSVersion: 10.13.0 536 | switchNMETAOverride: 537 | switchNetLibKey: 538 | switchSocketMemoryPoolSize: 6144 539 | switchSocketAllocatorPoolSize: 128 540 | switchSocketConcurrencyLimit: 14 541 | switchScreenResolutionBehavior: 2 542 | switchUseCPUProfiler: 0 543 | switchUseGOLDLinker: 0 544 | switchLTOSetting: 0 545 | switchApplicationID: 0x01004b9000490000 546 | switchNSODependencies: 547 | switchCompilerFlags: 548 | switchTitleNames_0: 549 | switchTitleNames_1: 550 | switchTitleNames_2: 551 | switchTitleNames_3: 552 | switchTitleNames_4: 553 | switchTitleNames_5: 554 | switchTitleNames_6: 555 | switchTitleNames_7: 556 | switchTitleNames_8: 557 | switchTitleNames_9: 558 | switchTitleNames_10: 559 | switchTitleNames_11: 560 | switchTitleNames_12: 561 | switchTitleNames_13: 562 | switchTitleNames_14: 563 | switchTitleNames_15: 564 | switchPublisherNames_0: 565 | switchPublisherNames_1: 566 | switchPublisherNames_2: 567 | switchPublisherNames_3: 568 | switchPublisherNames_4: 569 | switchPublisherNames_5: 570 | switchPublisherNames_6: 571 | switchPublisherNames_7: 572 | switchPublisherNames_8: 573 | switchPublisherNames_9: 574 | switchPublisherNames_10: 575 | switchPublisherNames_11: 576 | switchPublisherNames_12: 577 | switchPublisherNames_13: 578 | switchPublisherNames_14: 579 | switchPublisherNames_15: 580 | switchIcons_0: {fileID: 0} 581 | switchIcons_1: {fileID: 0} 582 | switchIcons_2: {fileID: 0} 583 | switchIcons_3: {fileID: 0} 584 | switchIcons_4: {fileID: 0} 585 | switchIcons_5: {fileID: 0} 586 | switchIcons_6: {fileID: 0} 587 | switchIcons_7: {fileID: 0} 588 | switchIcons_8: {fileID: 0} 589 | switchIcons_9: {fileID: 0} 590 | switchIcons_10: {fileID: 0} 591 | switchIcons_11: {fileID: 0} 592 | switchIcons_12: {fileID: 0} 593 | switchIcons_13: {fileID: 0} 594 | switchIcons_14: {fileID: 0} 595 | switchIcons_15: {fileID: 0} 596 | switchSmallIcons_0: {fileID: 0} 597 | switchSmallIcons_1: {fileID: 0} 598 | switchSmallIcons_2: {fileID: 0} 599 | switchSmallIcons_3: {fileID: 0} 600 | switchSmallIcons_4: {fileID: 0} 601 | switchSmallIcons_5: {fileID: 0} 602 | switchSmallIcons_6: {fileID: 0} 603 | switchSmallIcons_7: {fileID: 0} 604 | switchSmallIcons_8: {fileID: 0} 605 | switchSmallIcons_9: {fileID: 0} 606 | switchSmallIcons_10: {fileID: 0} 607 | switchSmallIcons_11: {fileID: 0} 608 | switchSmallIcons_12: {fileID: 0} 609 | switchSmallIcons_13: {fileID: 0} 610 | switchSmallIcons_14: {fileID: 0} 611 | switchSmallIcons_15: {fileID: 0} 612 | switchManualHTML: 613 | switchAccessibleURLs: 614 | switchLegalInformation: 615 | switchMainThreadStackSize: 1048576 616 | switchPresenceGroupId: 617 | switchLogoHandling: 0 618 | switchReleaseVersion: 0 619 | switchDisplayVersion: 1.0.0 620 | switchStartupUserAccount: 0 621 | switchSupportedLanguagesMask: 0 622 | switchLogoType: 0 623 | switchApplicationErrorCodeCategory: 624 | switchUserAccountSaveDataSize: 0 625 | switchUserAccountSaveDataJournalSize: 0 626 | switchApplicationAttribute: 0 627 | switchCardSpecSize: -1 628 | switchCardSpecClock: -1 629 | switchRatingsMask: 0 630 | switchRatingsInt_0: 0 631 | switchRatingsInt_1: 0 632 | switchRatingsInt_2: 0 633 | switchRatingsInt_3: 0 634 | switchRatingsInt_4: 0 635 | switchRatingsInt_5: 0 636 | switchRatingsInt_6: 0 637 | switchRatingsInt_7: 0 638 | switchRatingsInt_8: 0 639 | switchRatingsInt_9: 0 640 | switchRatingsInt_10: 0 641 | switchRatingsInt_11: 0 642 | switchRatingsInt_12: 0 643 | switchLocalCommunicationIds_0: 644 | switchLocalCommunicationIds_1: 645 | switchLocalCommunicationIds_2: 646 | switchLocalCommunicationIds_3: 647 | switchLocalCommunicationIds_4: 648 | switchLocalCommunicationIds_5: 649 | switchLocalCommunicationIds_6: 650 | switchLocalCommunicationIds_7: 651 | switchParentalControl: 0 652 | switchAllowsScreenshot: 1 653 | switchAllowsVideoCapturing: 1 654 | switchAllowsRuntimeAddOnContentInstall: 0 655 | switchDataLossConfirmation: 0 656 | switchUserAccountLockEnabled: 0 657 | switchSystemResourceMemory: 16777216 658 | switchSupportedNpadStyles: 22 659 | switchNativeFsCacheSize: 32 660 | switchIsHoldTypeHorizontal: 0 661 | switchSupportedNpadCount: 8 662 | switchEnableTouchScreen: 1 663 | switchSocketConfigEnabled: 0 664 | switchTcpInitialSendBufferSize: 32 665 | switchTcpInitialReceiveBufferSize: 64 666 | switchTcpAutoSendBufferSizeMax: 256 667 | switchTcpAutoReceiveBufferSizeMax: 256 668 | switchUdpSendBufferSize: 9 669 | switchUdpReceiveBufferSize: 42 670 | switchSocketBufferEfficiency: 4 671 | switchSocketInitializeEnabled: 1 672 | switchNetworkInterfaceManagerInitializeEnabled: 1 673 | switchPlayerConnectionEnabled: 1 674 | switchUseNewStyleFilepaths: 0 675 | switchUseLegacyFmodPriorities: 0 676 | switchUseMicroSleepForYield: 1 677 | switchEnableRamDiskSupport: 0 678 | switchMicroSleepForYieldTime: 25 679 | switchRamDiskSpaceSize: 12 680 | ps4NPAgeRating: 12 681 | ps4NPTitleSecret: 682 | ps4NPTrophyPackPath: 683 | ps4ParentalLevel: 11 684 | ps4ContentID: ED1633-NPXX51362_00-0000000000000000 685 | ps4Category: 0 686 | ps4MasterVersion: 01.00 687 | ps4AppVersion: 01.00 688 | ps4AppType: 0 689 | ps4ParamSfxPath: 690 | ps4VideoOutPixelFormat: 0 691 | ps4VideoOutInitialWidth: 1920 692 | ps4VideoOutBaseModeInitialWidth: 1920 693 | ps4VideoOutReprojectionRate: 60 694 | ps4PronunciationXMLPath: 695 | ps4PronunciationSIGPath: 696 | ps4BackgroundImagePath: 697 | ps4StartupImagePath: 698 | ps4StartupImagesFolder: 699 | ps4IconImagesFolder: 700 | ps4SaveDataImagePath: 701 | ps4SdkOverride: 702 | ps4BGMPath: 703 | ps4ShareFilePath: 704 | ps4ShareOverlayImagePath: 705 | ps4PrivacyGuardImagePath: 706 | ps4ExtraSceSysFile: 707 | ps4NPtitleDatPath: 708 | ps4RemotePlayKeyAssignment: -1 709 | ps4RemotePlayKeyMappingDir: 710 | ps4PlayTogetherPlayerCount: 0 711 | ps4EnterButtonAssignment: 2 712 | ps4ApplicationParam1: 0 713 | ps4ApplicationParam2: 0 714 | ps4ApplicationParam3: 0 715 | ps4ApplicationParam4: 0 716 | ps4DownloadDataSize: 0 717 | ps4GarlicHeapSize: 2048 718 | ps4ProGarlicHeapSize: 2560 719 | playerPrefsMaxSize: 32768 720 | ps4Passcode: bi9UOuSpM2Tlh01vOzwvSikHFswuzleh 721 | ps4pnSessions: 1 722 | ps4pnPresence: 1 723 | ps4pnFriends: 1 724 | ps4pnGameCustomData: 1 725 | playerPrefsSupport: 0 726 | enableApplicationExit: 0 727 | resetTempFolder: 1 728 | restrictedAudioUsageRights: 0 729 | ps4UseResolutionFallback: 0 730 | ps4ReprojectionSupport: 0 731 | ps4UseAudio3dBackend: 0 732 | ps4UseLowGarlicFragmentationMode: 1 733 | ps4SocialScreenEnabled: 0 734 | ps4ScriptOptimizationLevel: 2 735 | ps4Audio3dVirtualSpeakerCount: 14 736 | ps4attribCpuUsage: 0 737 | ps4PatchPkgPath: 738 | ps4PatchLatestPkgPath: 739 | ps4PatchChangeinfoPath: 740 | ps4PatchDayOne: 0 741 | ps4attribUserManagement: 0 742 | ps4attribMoveSupport: 0 743 | ps4attrib3DSupport: 0 744 | ps4attribShareSupport: 0 745 | ps4attribExclusiveVR: 0 746 | ps4disableAutoHideSplash: 0 747 | ps4videoRecordingFeaturesUsed: 0 748 | ps4contentSearchFeaturesUsed: 0 749 | ps4CompatibilityPS5: 0 750 | ps4AllowPS5Detection: 0 751 | ps4GPU800MHz: 1 752 | ps4attribEyeToEyeDistanceSettingVR: 0 753 | ps4IncludedModules: [] 754 | ps4attribVROutputEnabled: 0 755 | monoEnv: 756 | splashScreenBackgroundSourceLandscape: {fileID: 0} 757 | splashScreenBackgroundSourcePortrait: {fileID: 0} 758 | blurSplashScreenBackground: 1 759 | spritePackerPolicy: 760 | webGLMemorySize: 32 761 | webGLExceptionSupport: 1 762 | webGLNameFilesAsHashes: 0 763 | webGLShowDiagnostics: 0 764 | webGLDataCaching: 1 765 | webGLDebugSymbols: 0 766 | webGLEmscriptenArgs: 767 | webGLModulesDirectory: 768 | webGLTemplate: APPLICATION:Default 769 | webGLAnalyzeBuildSize: 0 770 | webGLUseEmbeddedResources: 0 771 | webGLCompressionFormat: 0 772 | webGLWasmArithmeticExceptions: 0 773 | webGLLinkerTarget: 1 774 | webGLThreadsSupport: 0 775 | webGLDecompressionFallback: 0 776 | webGLInitialMemorySize: 32 777 | webGLMaximumMemorySize: 2048 778 | webGLMemoryGrowthMode: 2 779 | webGLMemoryLinearGrowthStep: 16 780 | webGLMemoryGeometricGrowthStep: 0.2 781 | webGLMemoryGeometricGrowthCap: 96 782 | webGLPowerPreference: 2 783 | scriptingDefineSymbols: {} 784 | additionalCompilerArguments: {} 785 | platformArchitecture: {} 786 | scriptingBackend: {} 787 | il2cppCompilerConfiguration: {} 788 | il2cppCodeGeneration: {} 789 | managedStrippingLevel: 790 | Bratwurst: 1 791 | EmbeddedLinux: 1 792 | GameCoreScarlett: 1 793 | GameCoreXboxOne: 1 794 | Nintendo Switch: 1 795 | PS4: 1 796 | PS5: 1 797 | QNX: 1 798 | Stadia: 1 799 | WebGL: 1 800 | Windows Store Apps: 1 801 | XboxOne: 1 802 | iPhone: 1 803 | tvOS: 1 804 | incrementalIl2cppBuild: {} 805 | suppressCommonWarnings: 1 806 | allowUnsafeCode: 0 807 | useDeterministicCompilation: 1 808 | additionalIl2CppArgs: 809 | scriptingRuntimeVersion: 1 810 | gcIncremental: 1 811 | gcWBarrierValidation: 0 812 | apiCompatibilityLevelPerPlatform: {} 813 | m_RenderingPath: 1 814 | m_MobileRenderingPath: 1 815 | metroPackageName: My project 816 | metroPackageVersion: 817 | metroCertificatePath: 818 | metroCertificatePassword: 819 | metroCertificateSubject: 820 | metroCertificateIssuer: 821 | metroCertificateNotAfter: 0000000000000000 822 | metroApplicationDescription: My project 823 | wsaImages: {} 824 | metroTileShortName: 825 | metroTileShowName: 0 826 | metroMediumTileShowName: 0 827 | metroLargeTileShowName: 0 828 | metroWideTileShowName: 0 829 | metroSupportStreamingInstall: 0 830 | metroLastRequiredScene: 0 831 | metroDefaultTileSize: 1 832 | metroTileForegroundText: 2 833 | metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} 834 | metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} 835 | metroSplashScreenUseBackgroundColor: 0 836 | platformCapabilities: {} 837 | metroTargetDeviceFamilies: {} 838 | metroFTAName: 839 | metroFTAFileTypes: [] 840 | metroProtocolName: 841 | vcxProjDefaultLanguage: 842 | XboxOneProductId: 843 | XboxOneUpdateKey: 844 | XboxOneSandboxId: 845 | XboxOneContentId: 846 | XboxOneTitleId: 847 | XboxOneSCId: 848 | XboxOneGameOsOverridePath: 849 | XboxOnePackagingOverridePath: 850 | XboxOneAppManifestOverridePath: 851 | XboxOneVersion: 1.0.0.0 852 | XboxOnePackageEncryption: 0 853 | XboxOnePackageUpdateGranularity: 2 854 | XboxOneDescription: 855 | XboxOneLanguage: 856 | - enus 857 | XboxOneCapability: [] 858 | XboxOneGameRating: {} 859 | XboxOneIsContentPackage: 0 860 | XboxOneEnhancedXboxCompatibilityMode: 0 861 | XboxOneEnableGPUVariability: 1 862 | XboxOneSockets: {} 863 | XboxOneSplashScreen: {fileID: 0} 864 | XboxOneAllowedProductIds: [] 865 | XboxOnePersistentLocalStorageSize: 0 866 | XboxOneXTitleMemory: 8 867 | XboxOneOverrideIdentityName: 868 | XboxOneOverrideIdentityPublisher: 869 | vrEditorSettings: {} 870 | cloudServicesEnabled: {} 871 | luminIcon: 872 | m_Name: 873 | m_ModelFolderPath: 874 | m_PortalFolderPath: 875 | luminCert: 876 | m_CertPath: 877 | m_SignPackage: 1 878 | luminIsChannelApp: 0 879 | luminVersion: 880 | m_VersionCode: 1 881 | m_VersionName: 882 | hmiPlayerDataPath: 883 | hmiForceSRGBBlit: 1 884 | embeddedLinuxEnableGamepadInput: 1 885 | hmiLogStartupTiming: 0 886 | hmiCpuConfiguration: 887 | apiCompatibilityLevel: 6 888 | activeInputHandler: 0 889 | windowsGamepadBackendHint: 0 890 | cloudProjectId: 891 | framebufferDepthMemorylessMode: 0 892 | qualitySettingsNames: [] 893 | projectName: 894 | organizationId: 895 | cloudEnabled: 0 896 | legacyClampBlendShapeWeights: 0 897 | hmiLoadingImage: {fileID: 0} 898 | platformRequiresReadableAssets: 0 899 | virtualTexturingSupportEnabled: 0 900 | insecureHttpOption: 0 901 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2022.3.4f1 2 | m_EditorVersionWithRevision: 2022.3.4f1 (35713cd46cd7) 3 | -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 5 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Very Low 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 15 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 0 21 | skinWeights: 1 22 | textureQuality: 1 23 | anisotropicTextures: 0 24 | antiAliasing: 0 25 | softParticles: 0 26 | softVegetation: 0 27 | realtimeReflectionProbes: 0 28 | billboardsFaceCameraPosition: 0 29 | vSyncCount: 0 30 | lodBias: 0.3 31 | maximumLODLevel: 0 32 | streamingMipmapsActive: 0 33 | streamingMipmapsAddAllCameras: 1 34 | streamingMipmapsMemoryBudget: 512 35 | streamingMipmapsRenderersPerFrame: 512 36 | streamingMipmapsMaxLevelReduction: 2 37 | streamingMipmapsMaxFileIORequests: 1024 38 | particleRaycastBudget: 4 39 | asyncUploadTimeSlice: 2 40 | asyncUploadBufferSize: 16 41 | asyncUploadPersistentBuffer: 1 42 | resolutionScalingFixedDPIFactor: 1 43 | customRenderPipeline: {fileID: 0} 44 | excludedTargetPlatforms: [] 45 | - serializedVersion: 2 46 | name: Low 47 | pixelLightCount: 0 48 | shadows: 0 49 | shadowResolution: 0 50 | shadowProjection: 1 51 | shadowCascades: 1 52 | shadowDistance: 20 53 | shadowNearPlaneOffset: 3 54 | shadowCascade2Split: 0.33333334 55 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 56 | shadowmaskMode: 0 57 | skinWeights: 2 58 | textureQuality: 0 59 | anisotropicTextures: 0 60 | antiAliasing: 0 61 | softParticles: 0 62 | softVegetation: 0 63 | realtimeReflectionProbes: 0 64 | billboardsFaceCameraPosition: 0 65 | vSyncCount: 0 66 | lodBias: 0.4 67 | maximumLODLevel: 0 68 | streamingMipmapsActive: 0 69 | streamingMipmapsAddAllCameras: 1 70 | streamingMipmapsMemoryBudget: 512 71 | streamingMipmapsRenderersPerFrame: 512 72 | streamingMipmapsMaxLevelReduction: 2 73 | streamingMipmapsMaxFileIORequests: 1024 74 | particleRaycastBudget: 16 75 | asyncUploadTimeSlice: 2 76 | asyncUploadBufferSize: 16 77 | asyncUploadPersistentBuffer: 1 78 | resolutionScalingFixedDPIFactor: 1 79 | customRenderPipeline: {fileID: 0} 80 | excludedTargetPlatforms: [] 81 | - serializedVersion: 2 82 | name: Medium 83 | pixelLightCount: 1 84 | shadows: 1 85 | shadowResolution: 0 86 | shadowProjection: 1 87 | shadowCascades: 1 88 | shadowDistance: 20 89 | shadowNearPlaneOffset: 3 90 | shadowCascade2Split: 0.33333334 91 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 92 | shadowmaskMode: 0 93 | skinWeights: 2 94 | textureQuality: 0 95 | anisotropicTextures: 1 96 | antiAliasing: 0 97 | softParticles: 0 98 | softVegetation: 0 99 | realtimeReflectionProbes: 0 100 | billboardsFaceCameraPosition: 0 101 | vSyncCount: 1 102 | lodBias: 0.7 103 | maximumLODLevel: 0 104 | streamingMipmapsActive: 0 105 | streamingMipmapsAddAllCameras: 1 106 | streamingMipmapsMemoryBudget: 512 107 | streamingMipmapsRenderersPerFrame: 512 108 | streamingMipmapsMaxLevelReduction: 2 109 | streamingMipmapsMaxFileIORequests: 1024 110 | particleRaycastBudget: 64 111 | asyncUploadTimeSlice: 2 112 | asyncUploadBufferSize: 16 113 | asyncUploadPersistentBuffer: 1 114 | resolutionScalingFixedDPIFactor: 1 115 | customRenderPipeline: {fileID: 0} 116 | excludedTargetPlatforms: [] 117 | - serializedVersion: 2 118 | name: High 119 | pixelLightCount: 2 120 | shadows: 2 121 | shadowResolution: 1 122 | shadowProjection: 1 123 | shadowCascades: 2 124 | shadowDistance: 40 125 | shadowNearPlaneOffset: 3 126 | shadowCascade2Split: 0.33333334 127 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 128 | shadowmaskMode: 1 129 | skinWeights: 2 130 | textureQuality: 0 131 | anisotropicTextures: 1 132 | antiAliasing: 0 133 | softParticles: 0 134 | softVegetation: 1 135 | realtimeReflectionProbes: 1 136 | billboardsFaceCameraPosition: 1 137 | vSyncCount: 1 138 | lodBias: 1 139 | maximumLODLevel: 0 140 | streamingMipmapsActive: 0 141 | streamingMipmapsAddAllCameras: 1 142 | streamingMipmapsMemoryBudget: 512 143 | streamingMipmapsRenderersPerFrame: 512 144 | streamingMipmapsMaxLevelReduction: 2 145 | streamingMipmapsMaxFileIORequests: 1024 146 | particleRaycastBudget: 256 147 | asyncUploadTimeSlice: 2 148 | asyncUploadBufferSize: 16 149 | asyncUploadPersistentBuffer: 1 150 | resolutionScalingFixedDPIFactor: 1 151 | customRenderPipeline: {fileID: 0} 152 | excludedTargetPlatforms: [] 153 | - serializedVersion: 2 154 | name: Very High 155 | pixelLightCount: 3 156 | shadows: 2 157 | shadowResolution: 2 158 | shadowProjection: 1 159 | shadowCascades: 2 160 | shadowDistance: 70 161 | shadowNearPlaneOffset: 3 162 | shadowCascade2Split: 0.33333334 163 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 164 | shadowmaskMode: 1 165 | skinWeights: 4 166 | textureQuality: 0 167 | anisotropicTextures: 2 168 | antiAliasing: 2 169 | softParticles: 1 170 | softVegetation: 1 171 | realtimeReflectionProbes: 1 172 | billboardsFaceCameraPosition: 1 173 | vSyncCount: 1 174 | lodBias: 1.5 175 | maximumLODLevel: 0 176 | streamingMipmapsActive: 0 177 | streamingMipmapsAddAllCameras: 1 178 | streamingMipmapsMemoryBudget: 512 179 | streamingMipmapsRenderersPerFrame: 512 180 | streamingMipmapsMaxLevelReduction: 2 181 | streamingMipmapsMaxFileIORequests: 1024 182 | particleRaycastBudget: 1024 183 | asyncUploadTimeSlice: 2 184 | asyncUploadBufferSize: 16 185 | asyncUploadPersistentBuffer: 1 186 | resolutionScalingFixedDPIFactor: 1 187 | customRenderPipeline: {fileID: 0} 188 | excludedTargetPlatforms: [] 189 | - serializedVersion: 2 190 | name: Ultra 191 | pixelLightCount: 4 192 | shadows: 2 193 | shadowResolution: 2 194 | shadowProjection: 1 195 | shadowCascades: 4 196 | shadowDistance: 150 197 | shadowNearPlaneOffset: 3 198 | shadowCascade2Split: 0.33333334 199 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 200 | shadowmaskMode: 1 201 | skinWeights: 255 202 | textureQuality: 0 203 | anisotropicTextures: 2 204 | antiAliasing: 2 205 | softParticles: 1 206 | softVegetation: 1 207 | realtimeReflectionProbes: 1 208 | billboardsFaceCameraPosition: 1 209 | vSyncCount: 1 210 | lodBias: 2 211 | maximumLODLevel: 0 212 | streamingMipmapsActive: 0 213 | streamingMipmapsAddAllCameras: 1 214 | streamingMipmapsMemoryBudget: 512 215 | streamingMipmapsRenderersPerFrame: 512 216 | streamingMipmapsMaxLevelReduction: 2 217 | streamingMipmapsMaxFileIORequests: 1024 218 | particleRaycastBudget: 4096 219 | asyncUploadTimeSlice: 2 220 | asyncUploadBufferSize: 16 221 | asyncUploadPersistentBuffer: 1 222 | resolutionScalingFixedDPIFactor: 1 223 | customRenderPipeline: {fileID: 0} 224 | excludedTargetPlatforms: [] 225 | m_PerPlatformDefaultQuality: 226 | Android: 2 227 | Lumin: 5 228 | GameCoreScarlett: 5 229 | GameCoreXboxOne: 5 230 | Nintendo Switch: 5 231 | PS4: 5 232 | PS5: 5 233 | Stadia: 5 234 | Standalone: 5 235 | WebGL: 3 236 | Windows Store Apps: 5 237 | XboxOne: 5 238 | iPhone: 2 239 | tvOS: 2 240 | -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: [] 7 | layers: 8 | - Default 9 | - TransparentFX 10 | - Ignore Raycast 11 | - 12 | - Water 13 | - UI 14 | - 15 | - 16 | - 17 | - 18 | - 19 | - 20 | - 21 | - 22 | - 23 | - 24 | - 25 | - 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - 40 | m_SortingLayers: 41 | - name: Default 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.33333334 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 1 7 | m_Enabled: 0 8 | m_TestMode: 0 9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events 10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events 11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com 12 | m_DashboardUrl: https://dashboard.unity3d.com 13 | m_TestInitMode: 0 14 | CrashReportingSettings: 15 | m_EventUrl: https://perf-events.cloud.unity3d.com 16 | m_Enabled: 0 17 | m_LogBufferSize: 10 18 | m_CaptureEditorExceptions: 1 19 | UnityPurchasingSettings: 20 | m_Enabled: 0 21 | m_TestMode: 0 22 | UnityAnalyticsSettings: 23 | m_Enabled: 0 24 | m_TestMode: 0 25 | m_InitializeOnStartup: 1 26 | m_PackageRequiringCoreStatsPresent: 0 27 | UnityAdsSettings: 28 | m_Enabled: 0 29 | m_InitializeOnStartup: 1 30 | m_TestMode: 0 31 | m_IosGameId: 32 | m_AndroidGameId: 33 | m_GameIds: {} 34 | m_GameId: 35 | PerformanceReportingSettings: 36 | m_Enabled: 0 37 | -------------------------------------------------------------------------------- /ProjectSettings/VFXManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!937362698 &1 4 | VFXManager: 5 | m_ObjectHideFlags: 0 6 | m_IndirectShader: {fileID: 0} 7 | m_CopyBufferShader: {fileID: 0} 8 | m_SortShader: {fileID: 0} 9 | m_StripUpdateShader: {fileID: 0} 10 | m_RenderPipeSettingsPath: 11 | m_FixedTimeStep: 0.016666668 12 | m_MaxDeltaTime: 0.05 13 | m_CompiledVersion: 0 14 | m_RuntimeVersion: 0 15 | -------------------------------------------------------------------------------- /ProjectSettings/VersionControlSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!890905787 &1 4 | VersionControlSettings: 5 | m_ObjectHideFlags: 0 6 | m_Mode: Visible Meta Files 7 | m_CollabEditorSettings: 8 | inProgressEnabled: 1 9 | -------------------------------------------------------------------------------- /ProjectSettings/XRSettings.asset: -------------------------------------------------------------------------------- 1 | { 2 | "m_SettingKeys": [ 3 | "VR Device Disabled", 4 | "VR Device User Alert" 5 | ], 6 | "m_SettingValues": [ 7 | "False", 8 | "False" 9 | ] 10 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Unity Ripgrep Search Tool 2 | 3 | Helper class for making your own search tools along with a built-in transient Ripgrep search window. 4 | 5 | 6 | ### Features 7 | - uses the fantastic `ripgrep` to search your Unity code, assets, prefabs and scene files 8 | - handy search window with multithreaded dispatch and parsing of ripgrep search results 9 | - advanced Unity users (those who know scene/asset/prefab file internals and basic regex) can find pretty much anything _fast_ 10 | - find references to anything by just searching the GUID 11 | - save commonly used searches 12 | - optionally add any paths you want searched for code/files that live outside of the Unity world 13 | 14 | 15 | ### Requirements 16 | - install [ripgrep](https://github.com/BurntSushi/ripgrep) (make sure it's on your path for Windows and available from `/usr/local/bin/rg` for macOS) 17 | - Unity LTS release (not tested on anything that isn't an LTS because I'm not insane enough to use one) 18 | 19 | 20 | ### Usage 21 | - `cmd/ctrl + G` opens the search window 22 | - type at least 3 letters and press enter 23 | - escape stops the search if it is active or closes the search window if it is complete 24 | - results will ping on click and open to the search result line in TextMate on double-click (if on macOS with TextMate installed) 25 | 26 | 27 | ### Images 28 | 29 | ![](.git-images/1.png) 30 | ![](.git-images/2.png) 31 | ![](.git-images/3.png) 32 | ![](.git-images/4.png) 33 | --------------------------------------------------------------------------------