diff --git a/.claude/settings.local.json b/.claude/settings.local.json index b55a07ed..5aa75a2c 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -6,7 +6,38 @@ "Bash(mkdir:*)", "Bash(cat:*)", "Bash(move:*)", - "Bash(find:*)" + "Bash(find:*)", + "Bash(claude mcp add:*)", + "Bash(claude mcp list:*)", + "Bash(del \"d:\\\\works\\\\2025\\\\02.Studio\\\\dev\\\\base\\\\XRBase\\\\Assets\\\\Scripts\\\\UVC\\\\UIToolkit\\\\Input\\\\NumberStepper.cs\")", + "Bash(del \"d:\\\\works\\\\2025\\\\02.Studio\\\\dev\\\\base\\\\XRBase\\\\Assets\\\\Scripts\\\\UVC\\\\UIToolkit\\\\Modal\\\\UTKColorPickerHSV.cs\")", + "mcp__UnityMCP__read_console", + "Bash(git mv:*)", + "Bash(del \"d:\\\\works\\\\2025\\\\02.Studio\\\\dev\\\\base\\\\XRBase\\\\Assets\\\\Resources\\\\UIToolkit\\\\Tab\\\\UTKTab.uss\")", + "Bash(cmd //c \"del /f \"\"d:\\\\works\\\\2025\\\\02.Studio\\\\dev\\\\base\\\\XRBase\\\\Assets\\\\Resources\\\\UIToolkit\\\\Tab\\\\UTKTab.uss\"\"\")", + "mcp__UnityMCP__execute_menu_item", + "mcp__UnityMCP__manage_editor", + "Bash(timeout:*)", + "mcp__UnityMCP__manage_asset", + "mcp__UnityMCP__manage_scene", + "Bash(git checkout:*)", + "Bash(git -C \"d:/works/2025/02.Studio/dev/base/XRBase\" checkout HEAD -- \"Assets/Resources/UIToolkit/List/UTKMultiColumnTreeView.uss\" \"Assets/Resources/UIToolkit/List/UTKMultiColumnListView.uss\" \"Assets/Resources/UIToolkit/Style/UTKDefaultStyle.uss\" \"Assets/Resources/UIToolkit/Tab/UTKTabView.uss\" \"Assets/Resources/UIToolkit/List/UTKListView.uss\" \"Assets/Resources/UIToolkit/Style/UTKComponents.uss\")", + "Bash(cmd /c \"cd /d d:\\\\works\\\\2025\\\\02.Studio\\\\dev\\\\base\\\\XRBase && git log --oneline -10 -- Assets/Resources/UIToolkit/Style/UTKDefaultStyle.uss\")", + "Bash(New-Item -ItemType Directory -Path \"d:\\\\works\\\\2025\\\\02.Studio\\\\dev\\\\base\\\\XRBase\\\\Assets\\\\Resources\\\\UIToolkit\\\\Sample\\\\Window\" -Force)", + "Bash(cmd /c \"echo ^^^^^^\")", + "Bash(del \"d:\\\\works\\\\2025\\\\02.Studio\\\\dev\\\\base\\\\XRBase\\\\Assets\\\\Resources\\\\UIToolkit\\\\Property\\\\Views\\\\UTKBoolPropertyItemView.uxml\")", + "Bash(del:*)", + "Bash(cmd /c \"del /q \"\"d:\\\\works\\\\2025\\\\02.Studio\\\\dev\\\\base\\\\XRBase\\\\Assets\\\\Resources\\\\UIToolkit\\\\Property\\\\Views\\\\UTKIntPropertyItemViewSliderUss.uss\"\" \"\"d:\\\\works\\\\2025\\\\02.Studio\\\\dev\\\\base\\\\XRBase\\\\Assets\\\\Resources\\\\UIToolkit\\\\Property\\\\Views\\\\UTKFloatPropertyItemViewSliderUss.uss\"\"\")", + "mcp__UnityMCP__refresh_unity", + "Bash(powershell \"Get-Process Unity -ErrorAction SilentlyContinue | Select-Object -First 1 | Format-List\")", + "Bash(cmd /c \"mkdir \"\"d:\\\\works\\\\2025\\\\02.Studio\\\\dev\\\\base\\\\XRBase\\\\Assets\\\\Scripts\\\\UVC\\\\UIToolkit\\\\ToolBar\\\\Data\"\" && mkdir \"\"d:\\\\works\\\\2025\\\\02.Studio\\\\dev\\\\base\\\\XRBase\\\\Assets\\\\Scripts\\\\UVC\\\\UIToolkit\\\\ToolBar\\\\Items\"\" && mkdir \"\"d:\\\\works\\\\2025\\\\02.Studio\\\\dev\\\\base\\\\XRBase\\\\Assets\\\\Resources\\\\UIToolkit\\\\ToolBar\"\"\")", + "Bash(/bin/ls:*)", + "Bash(/bin/mkdir -p:*)", + "Bash(/bin/rm:*)", + "WebFetch(domain:docs.unity3d.com)", + "Bash(ls:*)", + "WebFetch(domain:discussions.unity.com)", + "mcp__ai-game-developer__screenshot-game-view" ], "deny": [], "ask": [] diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 00000000..bb7409a0 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,2 @@ +프로젝트 루트 폴더의 CLAUDE.md를 참조해 +답변은 항상 한국어로 작성해 \ No newline at end of file diff --git a/.gitignore b/.gitignore index c9c98177..5c83e899 100644 --- a/.gitignore +++ b/.gitignore @@ -86,4 +86,5 @@ crashlytics-build.properties .DS_Store -.idea/ \ No newline at end of file +.idea/ +.vscode/ \ No newline at end of file diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 00000000..1d44ea42 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "ai-game-developer": { + "type": "http", + "url": "http://localhost:55726" + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Editor.meta b/Assets/Editor.meta similarity index 77% rename from Assets/Scripts/Editor.meta rename to Assets/Editor.meta index f1f4ebe9..5b9df306 100644 --- a/Assets/Scripts/Editor.meta +++ b/Assets/Editor.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ebf477f3ba4991c439a8729dc21abac7 +guid: 025311df5d1d7e54aa8d7ccaf9367bf3 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Editor/FixMCPEditorPrefs.cs b/Assets/Editor/FixMCPEditorPrefs.cs new file mode 100644 index 00000000..5b588a9a --- /dev/null +++ b/Assets/Editor/FixMCPEditorPrefs.cs @@ -0,0 +1,148 @@ +#nullable enable +using UnityEditor; +using UnityEngine; + +/// +/// MCP for Unity EditorPrefs 설정 확인 및 수정 도구 +/// +public static class FixMCPEditorPrefs +{ + private const string GitUrlOverrideKey = "MCPForUnity.GitUrlOverride"; + + [MenuItem("Tools/MCP/Fix EditorPrefs Issue")] + public static void FixEditorPrefs() + { + Debug.Log("=== MCP EditorPrefs 확인 시작 ==="); + + // 현재 저장된 값 확인 + string currentValue = EditorPrefs.GetString(GitUrlOverrideKey, ""); + + Debug.Log($"현재 GitUrlOverride 값: '{currentValue}'"); + Debug.Log($"값 길이: {currentValue.Length}"); + + if (!string.IsNullOrEmpty(currentValue)) + { + // 잘못된 문자가 있는지 확인 + char[] invalidChars = System.IO.Path.GetInvalidPathChars(); + bool hasInvalidChars = currentValue.IndexOfAny(invalidChars) >= 0; + + if (hasInvalidChars) + { + Debug.LogWarning($"⚠️ 잘못된 경로 문자가 감지되었습니다!"); + Debug.LogWarning($"문제가 있는 값: '{currentValue}'"); + + // 잘못된 값 제거 + EditorPrefs.DeleteKey(GitUrlOverrideKey); + Debug.Log("✅ 잘못된 EditorPrefs 값을 제거했습니다."); + } + else + { + Debug.Log("경로 문자 검증: 정상"); + + // Path.IsPathRooted() 테스트 + try + { + bool isRooted = System.IO.Path.IsPathRooted(currentValue); + Debug.Log($"IsPathRooted 테스트: {isRooted} (정상)"); + } + catch (System.Exception ex) + { + Debug.LogError($"❌ IsPathRooted 호출 실패: {ex.Message}"); + Debug.LogWarning("잘못된 값을 제거합니다..."); + EditorPrefs.DeleteKey(GitUrlOverrideKey); + Debug.Log("✅ 잘못된 EditorPrefs 값을 제거했습니다."); + } + } + } + else + { + Debug.Log("GitUrlOverride 값이 비어있습니다. (정상)"); + } + + Debug.Log("=== MCP EditorPrefs 확인 완료 ==="); + Debug.Log("Unity 에디터를 재시작하거나 MCP 윈도우를 다시 열어주세요."); + } + + [MenuItem("Tools/MCP/Show All MCP EditorPrefs")] + public static void ShowAllMCPPrefs() + { + Debug.Log("=== 모든 MCP EditorPrefs 값 ==="); + + string[] keys = new[] + { + "MCPForUnity.GitUrlOverride", + "MCPForUnity.UseHttpTransport", + "MCPForUnity.HttpTransportScope", + "MCPForUnity.UvxPath", + "MCPForUnity.ClaudeCliPath", + "MCPForUnity.HttpUrl", + "MCPForUnity.HttpRemoteUrl", + }; + + foreach (string key in keys) + { + if (EditorPrefs.HasKey(key)) + { + string value = EditorPrefs.GetString(key, ""); + Debug.Log($"{key}: '{value}'"); + } + else + { + Debug.Log($"{key}: (설정되지 않음)"); + } + } + } + + [MenuItem("Tools/MCP/Clear All MCP EditorPrefs")] + public static void ClearAllMCPPrefs() + { + bool confirm = EditorUtility.DisplayDialog( + "MCP EditorPrefs 초기화", + "모든 MCP for Unity 설정을 초기화하시겠습니까?\n이 작업은 되돌릴 수 없습니다.", + "초기화", + "취소" + ); + + if (!confirm) + { + Debug.Log("취소되었습니다."); + return; + } + + Debug.Log("=== MCP EditorPrefs 초기화 시작 ==="); + + string[] keys = new[] + { + "MCPForUnity.GitUrlOverride", + "MCPForUnity.UseHttpTransport", + "MCPForUnity.HttpTransportScope", + "MCPForUnity.LastLocalHttpServerPid", + "MCPForUnity.LastLocalHttpServerPort", + "MCPForUnity.LastLocalHttpServerStartedUtc", + "MCPForUnity.LastLocalHttpServerPidArgsHash", + "MCPForUnity.LastLocalHttpServerPidFilePath", + "MCPForUnity.LastLocalHttpServerInstanceToken", + "MCPForUnity.UvxPath", + "MCPForUnity.ClaudeCliPath", + "MCPForUnity.HttpUrl", + "MCPForUnity.HttpRemoteUrl", + "MCPForUnity.DebugLogs", + "MCPForUnity.ValidationLevel", + "MCPForUnity.UnitySocketPort", + "MCPForUnity.ResumeHttpAfterReload", + "MCPForUnity.ResumeStdioAfterReload", + }; + + foreach (string key in keys) + { + if (EditorPrefs.HasKey(key)) + { + EditorPrefs.DeleteKey(key); + Debug.Log($"✅ 삭제: {key}"); + } + } + + Debug.Log("=== MCP EditorPrefs 초기화 완료 ==="); + Debug.Log("Unity 에디터를 재시작해주세요."); + } +} diff --git a/Assets/Editor/FixMCPEditorPrefs.cs.meta b/Assets/Editor/FixMCPEditorPrefs.cs.meta new file mode 100644 index 00000000..31053924 --- /dev/null +++ b/Assets/Editor/FixMCPEditorPrefs.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 955b75403593bb74fbf0ba110a3e1b83 \ No newline at end of file diff --git a/Assets/QuickOutline.meta b/Assets/Editor/UIToolkit.meta similarity index 77% rename from Assets/QuickOutline.meta rename to Assets/Editor/UIToolkit.meta index 6a13947d..ea68962a 100644 --- a/Assets/QuickOutline.meta +++ b/Assets/Editor/UIToolkit.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 65214e892d855cf4cb0219bebe3ecfbb +guid: d07e558de63aead44a5de53bc3a61d4d folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Editor/UIToolkit/UTKImageIconsGenerator.cs b/Assets/Editor/UIToolkit/UTKImageIconsGenerator.cs new file mode 100644 index 00000000..8908cfde --- /dev/null +++ b/Assets/Editor/UIToolkit/UTKImageIconsGenerator.cs @@ -0,0 +1,775 @@ +#nullable enable +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using UnityEditor; +using UnityEngine; + +namespace UVC.UIToolkit.Editor +{ + /// + /// 이미지 아이콘 폴더를 스캔하여 아이콘 경로 상수 클래스를 자동 생성하는 에디터 도구입니다. + /// + public class UTKImageIconsGenerator : EditorWindow + { + #region EditorPrefs Keys + + private const string PrefKeyIconsFolder = "UTK_ImageIcons_IconsFolder"; + private const string PrefKeyOutputPath = "UTK_ImageIcons_OutputPath"; + private const string PrefKeyClassName = "UTK_ImageIcons_ClassName"; + private const string PrefKeyNamespace = "UTK_ImageIcons_Namespace"; + private const string PrefKeyIncludeSubfolders = "UTK_ImageIcons_IncludeSubfolders"; + private const string PrefKeyGeneratePreview = "UTK_ImageIcons_GeneratePreview"; + + #endregion + + #region Default Values + + private const string DefaultIconsFolder = "Assets/Resources/Icons"; + private const string DefaultOutputPath = "Assets/Scripts/UVC/UIToolkit/Common/UTKImageIcons.cs"; + private const string DefaultClassName = "UTKImageIcons"; + private const string DefaultNamespace = "UVC.UIToolkit"; + + #endregion + + #region Supported Extensions + + private static readonly string[] SupportedExtensions = { ".png", ".jpg", ".jpeg", ".tga", ".psd", ".gif", ".bmp" }; + + #endregion + + #region Fields + + private string _iconsFolder = DefaultIconsFolder; + private string _outputPath = DefaultOutputPath; + private string _className = DefaultClassName; + private string _namespace = DefaultNamespace; + private bool _includeSubfolders = true; + private bool _generatePreview = true; + + private Vector2 _scrollPosition; + private List? _previewIcons; + + #endregion + + private class IconInfo + { + public string FilePath { get; set; } = ""; + public string FileName { get; set; } = ""; + public string FieldName { get; set; } = ""; + public string ResourcePath { get; set; } = ""; + public string RelativePath { get; set; } = ""; + public Texture2D? Preview { get; set; } + } + + [MenuItem("Tools/UTK/Image Icons Generator")] + public static void ShowWindow() + { + var window = GetWindow("Image Icons Generator"); + window.minSize = new Vector2(500, 400); + window.LoadSettings(); + } + + [MenuItem("Tools/UTK/Generate Image Icons Class (Quick)")] + public static void GenerateQuick() + { + var iconsFolder = EditorPrefs.GetString(PrefKeyIconsFolder, DefaultIconsFolder); + var outputPath = EditorPrefs.GetString(PrefKeyOutputPath, DefaultOutputPath); + var className = EditorPrefs.GetString(PrefKeyClassName, DefaultClassName); + var namespaceName = EditorPrefs.GetString(PrefKeyNamespace, DefaultNamespace); + var includeSubfolders = EditorPrefs.GetBool(PrefKeyIncludeSubfolders, true); + + Generate(iconsFolder, outputPath, className, namespaceName, includeSubfolders); + } + + private void OnEnable() + { + LoadSettings(); + } + + private void OnDisable() + { + ClearPreviewTextures(); + } + + private void LoadSettings() + { + _iconsFolder = EditorPrefs.GetString(PrefKeyIconsFolder, DefaultIconsFolder); + _outputPath = EditorPrefs.GetString(PrefKeyOutputPath, DefaultOutputPath); + _className = EditorPrefs.GetString(PrefKeyClassName, DefaultClassName); + _namespace = EditorPrefs.GetString(PrefKeyNamespace, DefaultNamespace); + _includeSubfolders = EditorPrefs.GetBool(PrefKeyIncludeSubfolders, true); + _generatePreview = EditorPrefs.GetBool(PrefKeyGeneratePreview, true); + } + + private void SaveSettings() + { + EditorPrefs.SetString(PrefKeyIconsFolder, _iconsFolder); + EditorPrefs.SetString(PrefKeyOutputPath, _outputPath); + EditorPrefs.SetString(PrefKeyClassName, _className); + EditorPrefs.SetString(PrefKeyNamespace, _namespace); + EditorPrefs.SetBool(PrefKeyIncludeSubfolders, _includeSubfolders); + EditorPrefs.SetBool(PrefKeyGeneratePreview, _generatePreview); + } + + private void ClearPreviewTextures() + { + _previewIcons = null; + } + + private void OnGUI() + { + EditorGUILayout.Space(10); + EditorGUILayout.LabelField("Image Icons Class Generator", EditorStyles.boldLabel); + EditorGUILayout.Space(5); + EditorGUILayout.HelpBox("이미지 아이콘 폴더를 스캔하여 Resources.Load로 사용할 수 있는 C# 정적 클래스를 생성합니다.", UnityEditor.MessageType.Info); + EditorGUILayout.Space(10); + + // 아이콘 폴더 경로 + EditorGUILayout.BeginHorizontal(); + _iconsFolder = EditorGUILayout.TextField("Icons Folder", _iconsFolder); + if (GUILayout.Button("...", GUILayout.Width(30))) + { + var path = EditorUtility.OpenFolderPanel("Select Icons Folder", "Assets", ""); + if (!string.IsNullOrEmpty(path)) + { + // 상대 경로로 변환 + if (path.StartsWith(Application.dataPath)) + { + path = "Assets" + path.Substring(Application.dataPath.Length); + } + _iconsFolder = path; + ClearPreviewTextures(); + } + } + EditorGUILayout.EndHorizontal(); + + // 출력 파일 경로 + EditorGUILayout.BeginHorizontal(); + _outputPath = EditorGUILayout.TextField("Output File", _outputPath); + if (GUILayout.Button("...", GUILayout.Width(30))) + { + var directory = Path.GetDirectoryName(_outputPath) ?? "Assets"; + var filename = Path.GetFileName(_outputPath); + var path = EditorUtility.SaveFilePanel("Save Generated Class", directory, filename, "cs"); + if (!string.IsNullOrEmpty(path)) + { + // 상대 경로로 변환 + if (path.StartsWith(Application.dataPath)) + { + path = "Assets" + path.Substring(Application.dataPath.Length); + } + _outputPath = path; + } + } + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.Space(5); + + // 클래스명 + _className = EditorGUILayout.TextField("Class Name", _className); + + // 네임스페이스 + _namespace = EditorGUILayout.TextField("Namespace", _namespace); + + EditorGUILayout.Space(5); + + // 옵션 + _includeSubfolders = EditorGUILayout.Toggle("Include Subfolders", _includeSubfolders); + _generatePreview = EditorGUILayout.Toggle("Show Preview", _generatePreview); + + EditorGUILayout.Space(10); + + // 폴더 존재 여부 및 아이콘 수 표시 + var folderExists = Directory.Exists(_iconsFolder); + var outputExists = File.Exists(_outputPath); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Icons Folder:", GUILayout.Width(100)); + EditorGUILayout.LabelField(folderExists ? "Found" : "Not Found", + folderExists ? EditorStyles.label : EditorStyles.boldLabel); + EditorGUILayout.EndHorizontal(); + + if (folderExists) + { + var iconCount = CountIcons(_iconsFolder, _includeSubfolders); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Icons Found:", GUILayout.Width(100)); + EditorGUILayout.LabelField($"{iconCount} images"); + EditorGUILayout.EndHorizontal(); + } + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Output File:", GUILayout.Width(100)); + EditorGUILayout.LabelField(outputExists ? "Exists (will overwrite)" : "New file"); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.Space(10); + + // 버튼들 + EditorGUILayout.BeginHorizontal(); + + GUI.enabled = folderExists; + if (GUILayout.Button("Scan & Preview", GUILayout.Height(25))) + { + SaveSettings(); + ScanIcons(); + } + + if (GUILayout.Button("Generate", GUILayout.Height(25))) + { + SaveSettings(); + Generate(_iconsFolder, _outputPath, _className, _namespace, _includeSubfolders); + } + GUI.enabled = true; + + if (GUILayout.Button("Reset", GUILayout.Height(25))) + { + _iconsFolder = DefaultIconsFolder; + _outputPath = DefaultOutputPath; + _className = DefaultClassName; + _namespace = DefaultNamespace; + _includeSubfolders = true; + _generatePreview = true; + SaveSettings(); + ClearPreviewTextures(); + } + + EditorGUILayout.EndHorizontal(); + + // 미리보기 영역 + if (_generatePreview && _previewIcons != null && _previewIcons.Count > 0) + { + EditorGUILayout.Space(10); + EditorGUILayout.LabelField($"Preview ({_previewIcons.Count} icons)", EditorStyles.boldLabel); + + _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition, GUILayout.ExpandHeight(true)); + + var iconSize = 48; + var padding = 4; + var labelHeight = 16; + var itemWidth = iconSize + padding * 2; + var itemHeight = iconSize + labelHeight + padding * 2; + + var windowWidth = position.width - 20; + var columns = Mathf.Max(1, (int)(windowWidth / itemWidth)); + + EditorGUILayout.BeginHorizontal(); + var currentColumn = 0; + + foreach (var icon in _previewIcons) + { + if (currentColumn >= columns) + { + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + currentColumn = 0; + } + + EditorGUILayout.BeginVertical(GUILayout.Width(itemWidth), GUILayout.Height(itemHeight)); + + // 아이콘 이미지 + var rect = GUILayoutUtility.GetRect(iconSize, iconSize); + if (icon.Preview != null) + { + GUI.DrawTexture(rect, icon.Preview, ScaleMode.ScaleToFit); + } + else + { + EditorGUI.DrawRect(rect, new Color(0.2f, 0.2f, 0.2f)); + } + + // 필드명 + var style = new GUIStyle(EditorStyles.miniLabel) + { + alignment = TextAnchor.MiddleCenter, + clipping = TextClipping.Clip + }; + EditorGUILayout.LabelField(icon.FieldName, style, GUILayout.Width(itemWidth), GUILayout.Height(labelHeight)); + + EditorGUILayout.EndVertical(); + currentColumn++; + } + + EditorGUILayout.EndHorizontal(); + EditorGUILayout.EndScrollView(); + } + } + + private void ScanIcons() + { + ClearPreviewTextures(); + _previewIcons = GetIconInfos(_iconsFolder, _includeSubfolders); + + // 프리뷰 텍스처 로드 + foreach (var icon in _previewIcons) + { + icon.Preview = AssetDatabase.LoadAssetAtPath(icon.FilePath); + } + } + + private static int CountIcons(string folder, bool includeSubfolders) + { + var searchOption = includeSubfolders ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly; + var count = 0; + + foreach (var ext in SupportedExtensions) + { + count += Directory.GetFiles(folder, $"*{ext}", searchOption).Length; + } + + return count; + } + + private static List GetIconInfos(string folder, bool includeSubfolders) + { + var result = new List(); + var searchOption = includeSubfolders ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly; + var usedNames = new HashSet(); + + // Resources 폴더 기준 경로 계산 + var resourcesIndex = folder.IndexOf("Resources/", StringComparison.OrdinalIgnoreCase); + var isInResources = resourcesIndex >= 0; + var resourcesBasePath = isInResources ? folder.Substring(resourcesIndex + "Resources/".Length) : ""; + + foreach (var ext in SupportedExtensions) + { + var files = Directory.GetFiles(folder, $"*{ext}", searchOption); + foreach (var file in files) + { + var normalizedPath = file.Replace("\\", "/"); + var fileName = Path.GetFileNameWithoutExtension(normalizedPath); + var relativePath = normalizedPath.Substring(folder.Length).TrimStart('/'); + var relativeDir = Path.GetDirectoryName(relativePath)?.Replace("\\", "/") ?? ""; + + // Resources.Load용 경로 (확장자 제외) + string resourcePath; + if (isInResources) + { + var fullRelative = string.IsNullOrEmpty(resourcesBasePath) + ? relativePath + : $"{resourcesBasePath}/{relativePath}"; + resourcePath = Path.ChangeExtension(fullRelative, null); + } + else + { + resourcePath = normalizedPath; // Resources 외부면 전체 경로 사용 + } + + var fieldName = ConvertToFieldName(fileName, relativeDir, usedNames); + + result.Add(new IconInfo + { + FilePath = normalizedPath, + FileName = fileName, + FieldName = fieldName, + ResourcePath = resourcePath, + RelativePath = relativePath + }); + } + } + + return result.OrderBy(i => i.FieldName).ToList(); + } + + public static void Generate(string iconsFolder, string outputPath, string className, string namespaceName, bool includeSubfolders) + { + if (!Directory.Exists(iconsFolder)) + { + Debug.LogError($"아이콘 폴더를 찾을 수 없습니다: {iconsFolder}"); + return; + } + + var icons = GetIconInfos(iconsFolder, includeSubfolders); + if (icons.Count == 0) + { + Debug.LogError("아이콘을 찾을 수 없습니다."); + return; + } + + var code = GenerateCode(icons, className, namespaceName, iconsFolder); + + // 디렉토리 생성 + var directory = Path.GetDirectoryName(outputPath); + if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + File.WriteAllText(outputPath, code, Encoding.UTF8); + AssetDatabase.Refresh(); + + Debug.Log($"{className}.cs 생성 완료: {icons.Count}개 아이콘 ({outputPath})"); + } + + private static string GenerateCode(List icons, string className, string namespaceName, string sourceFolder) + { + var sb = new StringBuilder(); + + // Resources 폴더 여부 확인 + var isInResources = sourceFolder.Contains("Resources"); + + sb.AppendLine("// "); + sb.AppendLine("// 이 파일은 UTKImageIconsGenerator에 의해 자동 생성되었습니다."); + sb.AppendLine("// 직접 수정하지 마세요. Tools > UTK > Image Icons Generator 메뉴로 재생성하세요."); + sb.AppendLine($"// Source: {sourceFolder}"); + sb.AppendLine("// "); + sb.AppendLine(); + sb.AppendLine("#nullable enable"); + sb.AppendLine("using System.Collections.Generic;"); + sb.AppendLine("using System.Threading;"); + sb.AppendLine("using Cysharp.Threading.Tasks;"); + sb.AppendLine("using UnityEngine;"); + sb.AppendLine(); + sb.AppendLine($"namespace {namespaceName}"); + sb.AppendLine("{"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 이미지 아이콘 리소스 경로 상수 클래스입니다."); + sb.AppendLine($" /// 총 {icons.Count}개의 아이콘을 포함합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 상수로 리소스 경로 사용"); + sb.AppendLine($" /// string path = {className}.Home;"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 동기 Sprite 로드 (캐싱됨)"); + sb.AppendLine($" /// Sprite sprite = {className}.LoadSprite({className}.Home);"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 비동기 Sprite 로드 (UniTask, 캐싱됨)"); + sb.AppendLine($" /// Sprite? sprite = await {className}.LoadSpriteAsync({className}.Home, cancellationToken);"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 동기 Texture2D 로드 (캐싱됨)"); + sb.AppendLine($" /// Texture2D texture = {className}.LoadTexture({className}.Settings);"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 비동기 Texture2D 로드 (UniTask, 캐싱됨)"); + sb.AppendLine($" /// Texture2D? texture = await {className}.LoadTextureAsync({className}.Settings, cancellationToken);"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 이름으로 Sprite 로드"); + sb.AppendLine($" /// Sprite icon = {className}.LoadSpriteByName(\"home\");"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 이름으로 비동기 Sprite 로드"); + sb.AppendLine($" /// Sprite? icon = await {className}.LoadSpriteByNameAsync(\"home\", cancellationToken);"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 이름으로 경로 조회"); + sb.AppendLine($" /// string iconPath = {className}.GetPath(\"settings\");"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 아이콘 존재 여부 확인"); + sb.AppendLine($" /// if ({className}.HasIcon(\"search\")) {{ }}"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 전체 아이콘 이름 순회"); + sb.AppendLine($" /// foreach (var name in {className}.GetAllIconNames()) {{ }}"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 캐시 클리어"); + sb.AppendLine($" /// {className}.ClearCache();"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine(" /// UXML에서 사용하기:"); + sb.AppendLine(" /// UXML에서 이미지 아이콘을 사용하려면 USS에서 background-image를 설정합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" /// /* USS 파일 */"); + sb.AppendLine(" /// .my-icon {"); + sb.AppendLine(" /// width: 24px;"); + sb.AppendLine(" /// height: 24px;"); + sb.AppendLine(" /// background-image: resource('UIToolkit/Images/icon_setting_22');"); + sb.AppendLine(" /// }"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine(" /// C# 코드에서 UXML 요소에 이미지 적용:"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// var iconElement = root.Q(\"my-icon\");"); + sb.AppendLine($" /// var texture = {className}.LoadTextureByName(\"icon_setting_22\");"); + sb.AppendLine(" /// iconElement.style.backgroundImage = new StyleBackground(texture);"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// Image 요소에서 사용:"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// var image = root.Q(\"my-image\");"); + sb.AppendLine($" /// image.sprite = {className}.LoadSpriteByName(\"btn_close_16\");"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine($" public static class {className}"); + sb.AppendLine(" {"); + + // 아이콘 경로 상수 생성 + foreach (var icon in icons) + { + sb.AppendLine($" /// {icon.RelativePath}"); + sb.AppendLine($" public const string {icon.FieldName} = \"{icon.ResourcePath}\";"); + } + + sb.AppendLine(); + sb.AppendLine(" #region Lookup & Load"); + sb.AppendLine(); + + // 이름으로 경로 조회 딕셔너리 + sb.AppendLine(" private static readonly Dictionary _pathsByName = new()"); + sb.AppendLine(" {"); + foreach (var icon in icons) + { + sb.AppendLine($" [\"{icon.FileName}\"] = \"{icon.ResourcePath}\","); + } + sb.AppendLine(" };"); + sb.AppendLine(); + + // 캐시 딕셔너리 + sb.AppendLine(" private static readonly Dictionary _spriteCache = new();"); + sb.AppendLine(" private static readonly Dictionary _textureCache = new();"); + sb.AppendLine(); + + // 조회 메서드 + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘 이름으로 리소스 경로를 조회합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘 파일명 (확장자 제외)"); + sb.AppendLine(" /// 리소스 경로, 없으면 빈 문자열"); + sb.AppendLine(" public static string GetPath(string iconName)"); + sb.AppendLine(" {"); + sb.AppendLine(" return _pathsByName.TryGetValue(iconName, out var path) ? path : string.Empty;"); + sb.AppendLine(" }"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘이 존재하는지 확인합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" public static bool HasIcon(string iconName) => _pathsByName.ContainsKey(iconName);"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 모든 아이콘 이름 목록을 반환합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" public static IEnumerable GetAllIconNames() => _pathsByName.Keys;"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 리소스 경로로 아이콘 이름을 조회합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 리소스 경로 (예: Icons/Home)"); + sb.AppendLine(" /// 아이콘 이름, 없으면 빈 문자열"); + sb.AppendLine(" public static string GetIconName(string resourcePath)"); + sb.AppendLine(" {"); + sb.AppendLine(" foreach (var kvp in _pathsByName)"); + sb.AppendLine(" {"); + sb.AppendLine(" if (kvp.Value == resourcePath) return kvp.Key;"); + sb.AppendLine(" }"); + sb.AppendLine(" return string.Empty;"); + sb.AppendLine(" }"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 전체 아이콘 수를 반환합니다."); + sb.AppendLine(" /// "); + sb.AppendLine($" public static int Count => {icons.Count};"); + sb.AppendLine(); + + // 동기 로드 메서드들 + sb.AppendLine(" /// "); + sb.AppendLine(" /// 리소스 경로로 Sprite를 동기로 로드합니다. (캐싱됨)"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 리소스 경로 (예: Icons/Home)"); + sb.AppendLine(" public static Sprite? LoadSprite(string resourcePath)"); + sb.AppendLine(" {"); + sb.AppendLine(" if (_spriteCache.TryGetValue(resourcePath, out var cached))"); + sb.AppendLine(" return cached;"); + sb.AppendLine(); + sb.AppendLine(" var sprite = Resources.Load(resourcePath);"); + sb.AppendLine(" _spriteCache[resourcePath] = sprite;"); + sb.AppendLine(" return sprite;"); + sb.AppendLine(" }"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 리소스 경로로 Sprite를 비동기로 로드합니다. (캐싱됨)"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 리소스 경로 (예: Icons/Home)"); + sb.AppendLine(" /// 취소 토큰"); + sb.AppendLine(" public static async UniTask LoadSpriteAsync(string resourcePath, CancellationToken ct = default)"); + sb.AppendLine(" {"); + sb.AppendLine(" if (_spriteCache.TryGetValue(resourcePath, out var cached))"); + sb.AppendLine(" return cached;"); + sb.AppendLine(); + sb.AppendLine(" var request = Resources.LoadAsync(resourcePath);"); + sb.AppendLine(" await request.ToUniTask(cancellationToken: ct);"); + sb.AppendLine(); + sb.AppendLine(" var sprite = request.asset as Sprite;"); + sb.AppendLine(" _spriteCache[resourcePath] = sprite;"); + sb.AppendLine(" return sprite;"); + sb.AppendLine(" }"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 리소스 경로로 Texture2D를 동기로 로드합니다. (캐싱됨)"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 리소스 경로 (예: Icons/Home)"); + sb.AppendLine(" public static Texture2D? LoadTexture(string resourcePath)"); + sb.AppendLine(" {"); + sb.AppendLine(" if (_textureCache.TryGetValue(resourcePath, out var cached))"); + sb.AppendLine(" return cached;"); + sb.AppendLine(); + sb.AppendLine(" var texture = Resources.Load(resourcePath);"); + sb.AppendLine(" _textureCache[resourcePath] = texture;"); + sb.AppendLine(" return texture;"); + sb.AppendLine(" }"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 리소스 경로로 Texture2D를 비동기로 로드합니다. (캐싱됨)"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 리소스 경로 (예: Icons/Home)"); + sb.AppendLine(" /// 취소 토큰"); + sb.AppendLine(" public static async UniTask LoadTextureAsync(string resourcePath, CancellationToken ct = default)"); + sb.AppendLine(" {"); + sb.AppendLine(" if (_textureCache.TryGetValue(resourcePath, out var cached))"); + sb.AppendLine(" return cached;"); + sb.AppendLine(); + sb.AppendLine(" var request = Resources.LoadAsync(resourcePath);"); + sb.AppendLine(" await request.ToUniTask(cancellationToken: ct);"); + sb.AppendLine(); + sb.AppendLine(" var texture = request.asset as Texture2D;"); + sb.AppendLine(" _textureCache[resourcePath] = texture;"); + sb.AppendLine(" return texture;"); + sb.AppendLine(" }"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘 이름으로 Sprite를 동기로 로드합니다. (캐싱됨)"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘 파일명 (확장자 제외)"); + sb.AppendLine(" public static Sprite? LoadSpriteByName(string iconName)"); + sb.AppendLine(" {"); + sb.AppendLine(" var path = GetPath(iconName);"); + sb.AppendLine(" return string.IsNullOrEmpty(path) ? null : LoadSprite(path);"); + sb.AppendLine(" }"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘 이름으로 Sprite를 비동기로 로드합니다. (캐싱됨)"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘 파일명 (확장자 제외)"); + sb.AppendLine(" /// 취소 토큰"); + sb.AppendLine(" public static async UniTask LoadSpriteByNameAsync(string iconName, CancellationToken ct = default)"); + sb.AppendLine(" {"); + sb.AppendLine(" var path = GetPath(iconName);"); + sb.AppendLine(" return string.IsNullOrEmpty(path) ? null : await LoadSpriteAsync(path, ct);"); + sb.AppendLine(" }"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘 이름으로 Texture2D를 동기로 로드합니다. (캐싱됨)"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘 파일명 (확장자 제외)"); + sb.AppendLine(" public static Texture2D? LoadTextureByName(string iconName)"); + sb.AppendLine(" {"); + sb.AppendLine(" var path = GetPath(iconName);"); + sb.AppendLine(" return string.IsNullOrEmpty(path) ? null : LoadTexture(path);"); + sb.AppendLine(" }"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘 이름으로 Texture2D를 비동기로 로드합니다. (캐싱됨)"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘 파일명 (확장자 제외)"); + sb.AppendLine(" /// 취소 토큰"); + sb.AppendLine(" public static async UniTask LoadTextureByNameAsync(string iconName, CancellationToken ct = default)"); + sb.AppendLine(" {"); + sb.AppendLine(" var path = GetPath(iconName);"); + sb.AppendLine(" return string.IsNullOrEmpty(path) ? null : await LoadTextureAsync(path, ct);"); + sb.AppendLine(" }"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 캐시를 클리어합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" public static void ClearCache()"); + sb.AppendLine(" {"); + sb.AppendLine(" _spriteCache.Clear();"); + sb.AppendLine(" _textureCache.Clear();"); + sb.AppendLine(" }"); + sb.AppendLine(); + sb.AppendLine(" #endregion"); + + sb.AppendLine(" }"); + sb.AppendLine("}"); + + return sb.ToString(); + } + + private static string ConvertToFieldName(string fileName, string relativeDir, HashSet usedNames) + { + var sb = new StringBuilder(); + + // 서브폴더가 있으면 접두사로 추가 + if (!string.IsNullOrEmpty(relativeDir)) + { + var dirParts = relativeDir.Split('/'); + foreach (var part in dirParts) + { + AppendPascalCase(sb, part); + } + sb.Append('_'); + } + + // 파일명 변환 + AppendPascalCase(sb, fileName); + + var result = sb.ToString(); + + // 숫자로 시작하면 앞에 _ 추가 + if (result.Length > 0 && char.IsDigit(result[0])) + { + result = "_" + result; + } + + // 빈 문자열이면 기본값 + if (string.IsNullOrEmpty(result)) + { + result = "_Icon"; + } + + // 중복 처리 + var originalResult = result; + var counter = 2; + while (usedNames.Contains(result)) + { + result = $"{originalResult}_{counter}"; + counter++; + } + + usedNames.Add(result); + return result; + } + + private static void AppendPascalCase(StringBuilder sb, string input) + { + // 특수문자를 구분자로 사용 + var words = input.Split(new[] { '_', '-', ' ', '.' }, StringSplitOptions.RemoveEmptyEntries); + + foreach (var word in words) + { + if (word.Length == 0) continue; + + // 첫 글자 대문자 + sb.Append(char.ToUpper(word[0])); + if (word.Length > 1) + { + // 나머지는 소문자로 (단, 연속 대문자면 유지) + for (int i = 1; i < word.Length; i++) + { + if (char.IsUpper(word[i]) && i + 1 < word.Length && char.IsUpper(word[i + 1])) + { + sb.Append(word[i]); + } + else + { + sb.Append(char.ToLower(word[i])); + } + } + } + } + } + } +} diff --git a/Assets/Editor/UIToolkit/UTKImageIconsGenerator.cs.meta b/Assets/Editor/UIToolkit/UTKImageIconsGenerator.cs.meta new file mode 100644 index 00000000..95c03c20 --- /dev/null +++ b/Assets/Editor/UIToolkit/UTKImageIconsGenerator.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3d7dbdad9e333f4478d838c2d78bb2be \ No newline at end of file diff --git a/Assets/Editor/UIToolkit/UTKMaterialIconsGenerator.cs b/Assets/Editor/UIToolkit/UTKMaterialIconsGenerator.cs new file mode 100644 index 00000000..5b67636f --- /dev/null +++ b/Assets/Editor/UIToolkit/UTKMaterialIconsGenerator.cs @@ -0,0 +1,615 @@ +#nullable enable +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; +using UnityEditor; +using UnityEngine; + +namespace UVC.UIToolkit.Editor +{ + /// + /// MaterialSymbolsOutlinedCodepoints.txt 파일을 파싱하여 + /// UTKMaterialIcons.cs 정적 클래스를 자동 생성하는 에디터 도구입니다. + /// + public class UTKMaterialIconsGenerator : EditorWindow + { + #region EditorPrefs Keys + + private const string PrefKeyCodepointsPath = "UTK_MaterialIcons_CodepointsPath"; + private const string PrefKeyOutputPath = "UTK_MaterialIcons_OutputPath"; + private const string PrefKeyClassName = "UTK_MaterialIcons_ClassName"; + private const string PrefKeyNamespace = "UTK_MaterialIcons_Namespace"; + private const string PrefKeyFontPath = "UTK_MaterialIcons_FontPath"; + + #endregion + + #region Default Values + + private const string DefaultCodepointsPath = "Assets/Resources/Fonts/Icons/MaterialSymbolsOutlinedCodepoints.txt"; + private const string DefaultOutputPath = "Assets/Scripts/UVC/UIToolkit/Common/UTKMaterialIcons.cs"; + private const string DefaultClassName = "UTKMaterialIcons"; + private const string DefaultNamespace = "UVC.UIToolkit"; + private const string DefaultFontPath = "Fonts/Icons/MaterialSymbolsOutlined"; + + #endregion + + #region Fields + + private string _codepointsPath = DefaultCodepointsPath; + private string _outputPath = DefaultOutputPath; + private string _className = DefaultClassName; + private string _namespace = DefaultNamespace; + private string _fontPath = DefaultFontPath; + + #endregion + + [MenuItem("Tools/UTK/Material Icons Generator")] + public static void ShowWindow() + { + var window = GetWindow("Material Icons Generator"); + window.minSize = new Vector2(450, 250); + window.LoadSettings(); + } + + [MenuItem("Tools/UTK/Generate Material Icons Class (Quick)")] + public static void GenerateQuick() + { + var codepointsPath = EditorPrefs.GetString(PrefKeyCodepointsPath, DefaultCodepointsPath); + var outputPath = EditorPrefs.GetString(PrefKeyOutputPath, DefaultOutputPath); + var className = EditorPrefs.GetString(PrefKeyClassName, DefaultClassName); + var namespaceName = EditorPrefs.GetString(PrefKeyNamespace, DefaultNamespace); + var fontPath = EditorPrefs.GetString(PrefKeyFontPath, DefaultFontPath); + + Generate(codepointsPath, outputPath, className, namespaceName, fontPath); + } + + private void OnEnable() + { + LoadSettings(); + } + + private void LoadSettings() + { + _codepointsPath = EditorPrefs.GetString(PrefKeyCodepointsPath, DefaultCodepointsPath); + _outputPath = EditorPrefs.GetString(PrefKeyOutputPath, DefaultOutputPath); + _className = EditorPrefs.GetString(PrefKeyClassName, DefaultClassName); + _namespace = EditorPrefs.GetString(PrefKeyNamespace, DefaultNamespace); + _fontPath = EditorPrefs.GetString(PrefKeyFontPath, DefaultFontPath); + } + + private void SaveSettings() + { + EditorPrefs.SetString(PrefKeyCodepointsPath, _codepointsPath); + EditorPrefs.SetString(PrefKeyOutputPath, _outputPath); + EditorPrefs.SetString(PrefKeyClassName, _className); + EditorPrefs.SetString(PrefKeyNamespace, _namespace); + EditorPrefs.SetString(PrefKeyFontPath, _fontPath); + } + + private void OnGUI() + { + EditorGUILayout.Space(10); + EditorGUILayout.LabelField("Material Icons Class Generator", EditorStyles.boldLabel); + EditorGUILayout.Space(5); + EditorGUILayout.HelpBox("Codepoints 파일을 파싱하여 C# 정적 클래스를 생성합니다.", UnityEditor.MessageType.Info); + EditorGUILayout.Space(10); + + // Codepoints 파일 경로 + EditorGUILayout.BeginHorizontal(); + _codepointsPath = EditorGUILayout.TextField("Codepoints File", _codepointsPath); + if (GUILayout.Button("...", GUILayout.Width(30))) + { + var path = EditorUtility.OpenFilePanel("Select Codepoints File", "Assets", "txt"); + if (!string.IsNullOrEmpty(path)) + { + // 상대 경로로 변환 + if (path.StartsWith(Application.dataPath)) + { + path = "Assets" + path.Substring(Application.dataPath.Length); + } + _codepointsPath = path; + } + } + EditorGUILayout.EndHorizontal(); + + // 출력 파일 경로 + EditorGUILayout.BeginHorizontal(); + _outputPath = EditorGUILayout.TextField("Output File", _outputPath); + if (GUILayout.Button("...", GUILayout.Width(30))) + { + var directory = Path.GetDirectoryName(_outputPath) ?? "Assets"; + var filename = Path.GetFileName(_outputPath); + var path = EditorUtility.SaveFilePanel("Save Generated Class", directory, filename, "cs"); + if (!string.IsNullOrEmpty(path)) + { + // 상대 경로로 변환 + if (path.StartsWith(Application.dataPath)) + { + path = "Assets" + path.Substring(Application.dataPath.Length); + } + _outputPath = path; + } + } + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.Space(5); + + // 클래스명 + _className = EditorGUILayout.TextField("Class Name", _className); + + // 네임스페이스 + _namespace = EditorGUILayout.TextField("Namespace", _namespace); + + // 폰트 경로 (Resources 기준) + _fontPath = EditorGUILayout.TextField("Font Path (Resources)", _fontPath); + EditorGUILayout.HelpBox("Resources.Load에 사용할 폰트 경로 (확장자 제외)", UnityEditor.MessageType.None); + + EditorGUILayout.Space(15); + + // 파일 존재 여부 표시 + var codepointsExists = File.Exists(_codepointsPath); + var outputExists = File.Exists(_outputPath); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Codepoints File:", GUILayout.Width(100)); + EditorGUILayout.LabelField(codepointsExists ? "Found" : "Not Found", + codepointsExists ? EditorStyles.label : EditorStyles.boldLabel); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Output File:", GUILayout.Width(100)); + EditorGUILayout.LabelField(outputExists ? "Exists (will overwrite)" : "New file", + EditorStyles.label); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.Space(15); + + // 버튼들 + EditorGUILayout.BeginHorizontal(); + + GUI.enabled = codepointsExists; + if (GUILayout.Button("Generate", GUILayout.Height(30))) + { + SaveSettings(); + Generate(_codepointsPath, _outputPath, _className, _namespace, _fontPath); + } + GUI.enabled = true; + + if (GUILayout.Button("Reset to Defaults", GUILayout.Height(30))) + { + _codepointsPath = DefaultCodepointsPath; + _outputPath = DefaultOutputPath; + _className = DefaultClassName; + _namespace = DefaultNamespace; + _fontPath = DefaultFontPath; + SaveSettings(); + } + + EditorGUILayout.EndHorizontal(); + } + + public static void Generate(string codepointsPath, string outputPath, string className, string namespaceName, string fontPath = DefaultFontPath) + { + if (!File.Exists(codepointsPath)) + { + Debug.LogError($"Codepoints 파일을 찾을 수 없습니다: {codepointsPath}"); + return; + } + + var icons = ParseCodepoints(codepointsPath); + if (icons.Count == 0) + { + Debug.LogError("파싱된 아이콘이 없습니다."); + return; + } + + var code = GenerateCode(icons, className, namespaceName, fontPath); + + // 디렉토리 생성 + var directory = Path.GetDirectoryName(outputPath); + if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + File.WriteAllText(outputPath, code, Encoding.UTF8); + AssetDatabase.Refresh(); + + Debug.Log($"{className}.cs 생성 완료: {icons.Count}개 아이콘 ({outputPath})"); + } + + private static List<(string name, string unicode)> ParseCodepoints(string path) + { + var result = new List<(string, string)>(); + var lines = File.ReadAllLines(path); + + foreach (var line in lines) + { + if (string.IsNullOrWhiteSpace(line)) continue; + + var parts = line.Split(' ', StringSplitOptions.RemoveEmptyEntries); + if (parts.Length >= 2) + { + result.Add((parts[0], parts[1])); + } + } + + return result; + } + + private static string GenerateCode(List<(string name, string unicode)> icons, string className, string namespaceName, string fontPath) + { + var sb = new StringBuilder(); + var usedNames = new HashSet(); + + sb.AppendLine("// "); + sb.AppendLine("// 이 파일은 UTKMaterialIconsGenerator에 의해 자동 생성되었습니다."); + sb.AppendLine("// 직접 수정하지 마세요. Tools > UTK > Material Icons Generator 메뉴로 재생성하세요."); + sb.AppendLine("// "); + sb.AppendLine(); + sb.AppendLine("#nullable enable"); + sb.AppendLine("using System;"); + sb.AppendLine("using System.Collections.Generic;"); + sb.AppendLine("using System.Threading;"); + sb.AppendLine("using Cysharp.Threading.Tasks;"); + sb.AppendLine("using UnityEngine;"); + sb.AppendLine("using UnityEngine.UIElements;"); + sb.AppendLine(); + sb.AppendLine($"namespace {namespaceName}"); + sb.AppendLine("{"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// Material Symbols Outlined 아이콘 유니코드 문자 상수 클래스입니다."); + sb.AppendLine($" /// 총 {icons.Count}개의 아이콘을 포함합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 동기 폰트 로드 (캐싱됨)"); + sb.AppendLine($" /// Font font = {className}.LoadFont();"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 비동기 폰트 로드 (UniTask)"); + sb.AppendLine($" /// Font? font = await {className}.LoadFontAsync(cancellationToken);"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // Label에 아이콘 적용"); + sb.AppendLine($" /// var label = new Label({className}.Home);"); + sb.AppendLine($" /// {className}.ApplyIconStyle(label);"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 비동기로 아이콘 스타일 적용"); + sb.AppendLine($" /// await {className}.ApplyIconStyleAsync(label, cancellationToken);"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 또는 StyleFontDefinition 직접 사용"); + sb.AppendLine($" /// label.style.unityFontDefinition = {className}.GetFontDefinition();"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 이름으로 아이콘 조회"); + sb.AppendLine($" /// string icon = {className}.GetIcon(\"settings\");"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 아이콘 존재 여부 확인"); + sb.AppendLine($" /// if ({className}.HasIcon(\"search\")) {{ }}"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 존재하는 유니코드 문자인지 확인"); + sb.AppendLine($" /// if ({className}.IsIconChar(\"□\")) {{ }}"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 전체 아이콘 이름 순회"); + sb.AppendLine($" /// foreach (var name in {className}.GetAllIconNames()) {{ }}"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// // 아이콘 총 개수"); + sb.AppendLine($" /// int count = {className}.Count;"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine(" /// UXML에서 사용하기:"); + sb.AppendLine(" /// UXML에서 Material Icons를 사용하려면 USS에서 폰트를 설정하고, Label의 text에 유니코드 문자를 직접 입력합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" /// /* USS 파일 */"); + sb.AppendLine(" /// .material-icon {"); + sb.AppendLine(" /// -unity-font: resource('Fonts/Icons/MaterialSymbolsOutlined');"); + sb.AppendLine(" /// font-size: 24px;"); + sb.AppendLine(" /// }"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine(" /// "); + sb.AppendLine(" /// C# 코드에서 UXML Label에 아이콘 적용:"); + sb.AppendLine(" /// "); + sb.AppendLine($" /// var iconLabel = root.Q"); + sb.AppendLine(" /// "); + sb.AppendLine($" public static class {className}"); + sb.AppendLine(" {"); + sb.AppendLine(); + sb.AppendLine(" #region Font"); + sb.AppendLine(); + sb.AppendLine($" private const string FontResourcePath = \"{fontPath}\";"); + sb.AppendLine(" private static Font? _cachedFont;"); + sb.AppendLine(" private static StyleFontDefinition? _cachedFontDefinition;"); + sb.AppendLine(); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘 폰트를 동기로 로드합니다. (캐싱됨)"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 로드된 Font, 실패 시 null"); + sb.AppendLine(" public static Font? LoadFont()"); + sb.AppendLine(" {"); + sb.AppendLine(" if (_cachedFont == null)"); + sb.AppendLine(" {"); + sb.AppendLine(" _cachedFont = Resources.Load(FontResourcePath);"); + sb.AppendLine(" }"); + sb.AppendLine(" return _cachedFont;"); + sb.AppendLine(" }"); + sb.AppendLine(); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘 폰트를 비동기로 로드합니다. (캐싱됨)"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 취소 토큰"); + sb.AppendLine(" /// 로드된 Font, 실패 시 null"); + sb.AppendLine(" public static async UniTask LoadFontAsync(CancellationToken ct = default)"); + sb.AppendLine(" {"); + sb.AppendLine(" if (_cachedFont != null)"); + sb.AppendLine(" {"); + sb.AppendLine(" return _cachedFont;"); + sb.AppendLine(" }"); + sb.AppendLine(); + sb.AppendLine(" var request = Resources.LoadAsync(FontResourcePath);"); + sb.AppendLine(" await request.ToUniTask(cancellationToken: ct);"); + sb.AppendLine(); + sb.AppendLine(" _cachedFont = request.asset as Font;"); + sb.AppendLine(" return _cachedFont;"); + sb.AppendLine(" }"); + sb.AppendLine(); + sb.AppendLine(" /// "); + sb.AppendLine(" /// UI Toolkit용 StyleFontDefinition을 동기로 반환합니다. (캐싱됨)"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// StyleFontDefinition, 폰트 로드 실패 시 기본값"); + sb.AppendLine(" public static StyleFontDefinition GetFontDefinition()"); + sb.AppendLine(" {"); + sb.AppendLine(" if (_cachedFontDefinition == null)"); + sb.AppendLine(" {"); + sb.AppendLine(" var font = LoadFont();"); + sb.AppendLine(" if (font != null)"); + sb.AppendLine(" {"); + sb.AppendLine(" _cachedFontDefinition = new StyleFontDefinition(font);"); + sb.AppendLine(" }"); + sb.AppendLine(" }"); + sb.AppendLine(" return _cachedFontDefinition ?? default;"); + sb.AppendLine(" }"); + sb.AppendLine(); + sb.AppendLine(" /// "); + sb.AppendLine(" /// UI Toolkit용 StyleFontDefinition을 비동기로 반환합니다. (캐싱됨)"); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 취소 토큰"); + sb.AppendLine(" /// StyleFontDefinition, 폰트 로드 실패 시 기본값"); + sb.AppendLine(" public static async UniTask GetFontDefinitionAsync(CancellationToken ct = default)"); + sb.AppendLine(" {"); + sb.AppendLine(" if (_cachedFontDefinition == null)"); + sb.AppendLine(" {"); + sb.AppendLine(" var font = await LoadFontAsync(ct);"); + sb.AppendLine(" if (font != null)"); + sb.AppendLine(" {"); + sb.AppendLine(" _cachedFontDefinition = new StyleFontDefinition(font);"); + sb.AppendLine(" }"); + sb.AppendLine(" }"); + sb.AppendLine(" return _cachedFontDefinition ?? default;"); + sb.AppendLine(" }"); + sb.AppendLine(); + sb.AppendLine(" /// "); + sb.AppendLine(" /// VisualElement에 아이콘 폰트 스타일을 동기로 적용합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 스타일을 적용할 요소"); + sb.AppendLine(" /// 폰트 크기 (기본값: 24)"); + sb.AppendLine(" public static void ApplyIconStyle(VisualElement element, int? fontSize = 24)"); + sb.AppendLine(" {"); + sb.AppendLine(" element.style.unityFontDefinition = GetFontDefinition();"); + sb.AppendLine(" if(fontSize != null) element.style.fontSize = fontSize.Value;"); + sb.AppendLine(" }"); + sb.AppendLine(); + sb.AppendLine(" /// "); + sb.AppendLine(" /// VisualElement에 아이콘 폰트 스타일을 비동기로 적용합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 스타일을 적용할 요소"); + sb.AppendLine(" /// 취소 토큰"); + sb.AppendLine(" /// 폰트 크기 (기본값: 24)"); + sb.AppendLine(" public static async UniTask ApplyIconStyleAsync(VisualElement element, CancellationToken ct = default, int fontSize = 24)"); + sb.AppendLine(" {"); + sb.AppendLine(" element.style.unityFontDefinition = await GetFontDefinitionAsync(ct);"); + sb.AppendLine(" element.style.fontSize = fontSize;"); + sb.AppendLine(" }"); + sb.AppendLine(); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 폰트 캐시를 클리어합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" public static void ClearFontCache()"); + sb.AppendLine(" {"); + sb.AppendLine(" _cachedFont = null;"); + sb.AppendLine(" _cachedFontDefinition = null;"); + sb.AppendLine(" }"); + sb.AppendLine(); + sb.AppendLine(" #endregion"); + sb.AppendLine(); + + // 아이콘 상수 생성 + foreach (var (name, unicode) in icons) + { + var fieldName = ConvertToFieldName(name, usedNames); + var character = GetCharacterFromUnicode(unicode); + var escapedChar = EscapeForCSharp(character); + + sb.AppendLine($" /// {name} (U+{unicode.ToUpper()})"); + sb.AppendLine($" public const string {fieldName} = \"{escapedChar}\";"); + } + + sb.AppendLine(); + sb.AppendLine(" #region Lookup"); + sb.AppendLine(); + + // 이름으로 아이콘 조회 딕셔너리 + sb.AppendLine(" private static readonly Dictionary _iconsByName = new()"); + sb.AppendLine(" {"); + foreach (var (name, unicode) in icons) + { + var character = GetCharacterFromUnicode(unicode); + var escapedChar = EscapeForCSharp(character); + sb.AppendLine($" [\"{name}\"] = \"{escapedChar}\","); + } + sb.AppendLine(" };"); + sb.AppendLine(); + + // 조회 메서드 + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘 이름으로 유니코드 문자를 조회합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘 이름 (예: \"home\", \"settings\")"); + sb.AppendLine(" /// 아이콘 문자, 없으면 빈 문자열"); + sb.AppendLine(" public static string GetIcon(string iconName)"); + sb.AppendLine(" {"); + sb.AppendLine(" // 실제 유니코드 문자가 아니라 이스케이프 문자열인 경우 변환"); + sb.AppendLine(" if (iconName.StartsWith(\"\\u\") && iconName.Length == 6)"); + sb.AppendLine(" {"); + sb.AppendLine(" try"); + sb.AppendLine(" {"); + sb.AppendLine(" var code = Convert.ToInt32(iconName.Substring(2), 16);"); + sb.AppendLine(" iconName = char.ConvertFromUtf32(code);"); + sb.AppendLine(" }"); + sb.AppendLine(" catch"); + sb.AppendLine(" {"); + sb.AppendLine(" Debug.LogWarning($\"Failed to convert escape sequence: {iconName}\");"); + sb.AppendLine(" }"); + sb.AppendLine(" }"); + sb.AppendLine(" "); + sb.AppendLine(" if(IsIconChar(iconName)) return iconName;"); + sb.AppendLine(" return _iconsByName.TryGetValue(iconName.ToLower(), out var icon) ? icon : string.Empty;"); + sb.AppendLine(" }"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 아이콘이 존재하는지 확인합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" public static bool HasIcon(string iconName) => _iconsByName.ContainsKey(iconName);"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 유니코드 문자로 아이콘이 존재하는지 확인합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" public static bool IsIconChar(string iconChar) => _iconsByName.Values.Contains(iconChar);"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 유니코드 문자로 아이콘 이름을 조회합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" public static string GetIconNameByChar(string iconChar)"); + sb.AppendLine(" {"); + sb.AppendLine(" foreach (var kvp in _iconsByName)"); + sb.AppendLine(" {"); + sb.AppendLine(" if (string.Equals(kvp.Value, iconChar, StringComparison.OrdinalIgnoreCase)) return kvp.Key;"); + sb.AppendLine(" }"); + sb.AppendLine(" return string.Empty;"); + sb.AppendLine(" }"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 모든 아이콘 이름 목록을 반환합니다."); + sb.AppendLine(" /// "); + sb.AppendLine(" public static IEnumerable GetAllIconNames() => _iconsByName.Keys;"); + sb.AppendLine(); + + sb.AppendLine(" /// "); + sb.AppendLine(" /// 전체 아이콘 수를 반환합니다."); + sb.AppendLine(" /// "); + sb.AppendLine($" public static int Count => {icons.Count};"); + sb.AppendLine(); + sb.AppendLine(" #endregion"); + + sb.AppendLine(" }"); + sb.AppendLine("}"); + + return sb.ToString(); + } + + private static string ConvertToFieldName(string iconName, HashSet usedNames) + { + var sb = new StringBuilder(); + var words = iconName.Split('_', StringSplitOptions.RemoveEmptyEntries); + + foreach (var word in words) + { + if (word.Length == 0) continue; + + // 첫 글자 대문자, 나머지 소문자 (PascalCase) + sb.Append(char.ToUpper(word[0])); + if (word.Length > 1) + { + sb.Append(word.Substring(1).ToLower()); + } + } + + var result = sb.ToString(); + + // 숫자로 시작하면 앞에 _ 추가 + if (result.Length > 0 && char.IsDigit(result[0])) + { + result = "_" + result; + } + + // 빈 문자열이면 기본값 + if (string.IsNullOrEmpty(result)) + { + result = "_Icon"; + } + + // 중복 처리 + var originalResult = result; + var counter = 2; + while (usedNames.Contains(result)) + { + result = $"{originalResult}_{counter}"; + counter++; + } + + usedNames.Add(result); + return result; + } + + private static string GetCharacterFromUnicode(string hexCode) + { + try + { + var codepoint = int.Parse(hexCode, NumberStyles.HexNumber); + return char.ConvertFromUtf32(codepoint); + } + catch + { + return "?"; + } + } + + private static string EscapeForCSharp(string str) + { + var sb = new StringBuilder(); + foreach (var c in str) + { + // 유니코드 이스케이프 시퀀스로 변환 + if (c > 127 || c < 32) + { + // Surrogate pair 처리 + sb.Append($"\\u{(int)c:X4}"); + } + else if (c == '"') + { + sb.Append("\\\""); + } + else if (c == '\\') + { + sb.Append("\\\\"); + } + else + { + sb.Append(c); + } + } + return sb.ToString(); + } + } +} diff --git a/Assets/Editor/UIToolkit/UTKMaterialIconsGenerator.cs.meta b/Assets/Editor/UIToolkit/UTKMaterialIconsGenerator.cs.meta new file mode 100644 index 00000000..b0053c79 --- /dev/null +++ b/Assets/Editor/UIToolkit/UTKMaterialIconsGenerator.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a4f9ee471e14d684aa1d05c88ee24116 \ No newline at end of file diff --git a/Assets/QuickOutline/Readme.txt b/Assets/QuickOutline/Readme.txt deleted file mode 100644 index 183ae241..00000000 --- a/Assets/QuickOutline/Readme.txt +++ /dev/null @@ -1,37 +0,0 @@ -Quick Outline -============= - -Developed by Chris Nolet (c) 2018 - - -Instructions ------------- - -To add an outline to an object, drag-and-drop the Outline.cs -script onto the object. The outline materials will be loaded -at runtime. - -You can also add outlines programmatically with: - - var outline = gameObject.AddComponent(); - - outline.OutlineMode = Outline.Mode.OutlineAll; - outline.OutlineColor = Color.yellow; - outline.OutlineWidth = 5f; - -The outline script does a small amount of work in Awake(). -For best results, use outline.enabled to toggle the outline. -Avoid removing and re-adding the component if possible. - -For large meshes, you may also like to enable 'Precompute -Outline' in the editor. This will reduce the amount of work -performed in Awake(). - - -Troubleshooting ---------------- - -If the outline appears off-center, please try the following: - -1. Set 'Read/Write Enabled' on each model's import settings. -2. Disable 'Optimize Mesh Data' in the player settings. diff --git a/Assets/QuickOutline/Readme.txt.meta b/Assets/QuickOutline/Readme.txt.meta deleted file mode 100644 index c3f61b93..00000000 --- a/Assets/QuickOutline/Readme.txt.meta +++ /dev/null @@ -1,16 +0,0 @@ -fileFormatVersion: 2 -guid: 5933bfd39d7a5b843a0ed821f85bca19 -timeCreated: 1522619008 -licenseType: Store -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: -AssetOrigin: - serializedVersion: 1 - productId: 115488 - packageName: Quick Outline - packageVersion: 1.1 - assetPath: Assets/QuickOutline/Readme.txt - uploadId: 485303 diff --git a/Assets/QuickOutline/Resources/Materials/OutlineFill.mat b/Assets/QuickOutline/Resources/Materials/OutlineFill.mat deleted file mode 100644 index cb021646..00000000 --- a/Assets/QuickOutline/Resources/Materials/OutlineFill.mat +++ /dev/null @@ -1,25 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_Name: OutlineFill - m_Shader: {fileID: 4800000, guid: 4e76d4023d7e0411297c670f878973e2, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: [] - m_Floats: - - _OutlineWidth: 2 - - _ZTest: 8 - m_Colors: - - _OutlineColor: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/QuickOutline/Resources/Materials/OutlineFill.mat.meta b/Assets/QuickOutline/Resources/Materials/OutlineFill.mat.meta deleted file mode 100644 index 5576b451..00000000 --- a/Assets/QuickOutline/Resources/Materials/OutlineFill.mat.meta +++ /dev/null @@ -1,17 +0,0 @@ -fileFormatVersion: 2 -guid: 311313efa011949e98b6761d652ad13c -timeCreated: 1520576285 -licenseType: Store -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: -AssetOrigin: - serializedVersion: 1 - productId: 115488 - packageName: Quick Outline - packageVersion: 1.1 - assetPath: Assets/QuickOutline/Resources/Materials/OutlineFill.mat - uploadId: 485303 diff --git a/Assets/QuickOutline/Resources/Materials/OutlineMask.mat b/Assets/QuickOutline/Resources/Materials/OutlineMask.mat deleted file mode 100644 index 80d49faa..00000000 --- a/Assets/QuickOutline/Resources/Materials/OutlineMask.mat +++ /dev/null @@ -1,23 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_Name: OutlineMask - m_Shader: {fileID: 4800000, guid: 341b058cd7dee4f5cba5cc59a513619e, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: [] - m_Floats: - - _ZTest: 8 - m_Colors: [] diff --git a/Assets/QuickOutline/Resources/Materials/OutlineMask.mat.meta b/Assets/QuickOutline/Resources/Materials/OutlineMask.mat.meta deleted file mode 100644 index 8ad0794d..00000000 --- a/Assets/QuickOutline/Resources/Materials/OutlineMask.mat.meta +++ /dev/null @@ -1,17 +0,0 @@ -fileFormatVersion: 2 -guid: 106f3ff43a17d4967a2b64c7a92e49ec -timeCreated: 1520576276 -licenseType: Store -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: -AssetOrigin: - serializedVersion: 1 - productId: 115488 - packageName: Quick Outline - packageVersion: 1.1 - assetPath: Assets/QuickOutline/Resources/Materials/OutlineMask.mat - uploadId: 485303 diff --git a/Assets/QuickOutline/Resources/Shaders/OutlineFill.shader b/Assets/QuickOutline/Resources/Shaders/OutlineFill.shader deleted file mode 100644 index f546473e..00000000 --- a/Assets/QuickOutline/Resources/Shaders/OutlineFill.shader +++ /dev/null @@ -1,81 +0,0 @@ -// -// OutlineFill.shader -// QuickOutline -// -// Created by Chris Nolet on 2/21/18. -// Copyright © 2018 Chris Nolet. All rights reserved. -// - -Shader "Custom/Outline Fill" { - Properties { - [Enum(UnityEngine.Rendering.CompareFunction)] _ZTest("ZTest", Float) = 0 - - _OutlineColor("Outline Color", Color) = (1, 1, 1, 1) - _OutlineWidth("Outline Width", Range(0, 10)) = 2 - } - - SubShader { - Tags { - "Queue" = "Transparent+110" - "RenderType" = "Transparent" - "DisableBatching" = "True" - } - - Pass { - Name "Fill" - Cull Off - ZTest [_ZTest] - ZWrite Off - Blend SrcAlpha OneMinusSrcAlpha - ColorMask RGB - - Stencil { - Ref 1 - Comp NotEqual - } - - CGPROGRAM - #include "UnityCG.cginc" - - #pragma vertex vert - #pragma fragment frag - - struct appdata { - float4 vertex : POSITION; - float3 normal : NORMAL; - float3 smoothNormal : TEXCOORD3; - UNITY_VERTEX_INPUT_INSTANCE_ID - }; - - struct v2f { - float4 position : SV_POSITION; - fixed4 color : COLOR; - UNITY_VERTEX_OUTPUT_STEREO - }; - - uniform fixed4 _OutlineColor; - uniform float _OutlineWidth; - - v2f vert(appdata input) { - v2f output; - - UNITY_SETUP_INSTANCE_ID(input); - UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output); - - float3 normal = any(input.smoothNormal) ? input.smoothNormal : input.normal; - float3 viewPosition = UnityObjectToViewPos(input.vertex); - float3 viewNormal = normalize(mul((float3x3)UNITY_MATRIX_IT_MV, normal)); - - output.position = UnityViewToClipPos(viewPosition + viewNormal * -viewPosition.z * _OutlineWidth / 1000.0); - output.color = _OutlineColor; - - return output; - } - - fixed4 frag(v2f input) : SV_Target { - return input.color; - } - ENDCG - } - } -} diff --git a/Assets/QuickOutline/Resources/Shaders/OutlineFill.shader.meta b/Assets/QuickOutline/Resources/Shaders/OutlineFill.shader.meta deleted file mode 100644 index b982c4e8..00000000 --- a/Assets/QuickOutline/Resources/Shaders/OutlineFill.shader.meta +++ /dev/null @@ -1,17 +0,0 @@ -fileFormatVersion: 2 -guid: 4e76d4023d7e0411297c670f878973e2 -timeCreated: 1520575782 -licenseType: Store -ShaderImporter: - externalObjects: {} - defaultTextures: [] - userData: - assetBundleName: - assetBundleVariant: -AssetOrigin: - serializedVersion: 1 - productId: 115488 - packageName: Quick Outline - packageVersion: 1.1 - assetPath: Assets/QuickOutline/Resources/Shaders/OutlineFill.shader - uploadId: 485303 diff --git a/Assets/QuickOutline/Resources/Shaders/OutlineMask.shader b/Assets/QuickOutline/Resources/Shaders/OutlineMask.shader deleted file mode 100644 index 530d8c05..00000000 --- a/Assets/QuickOutline/Resources/Shaders/OutlineMask.shader +++ /dev/null @@ -1,33 +0,0 @@ -// -// OutlineMask.shader -// QuickOutline -// -// Created by Chris Nolet on 2/21/18. -// Copyright © 2018 Chris Nolet. All rights reserved. -// - -Shader "Custom/Outline Mask" { - Properties { - [Enum(UnityEngine.Rendering.CompareFunction)] _ZTest("ZTest", Float) = 0 - } - - SubShader { - Tags { - "Queue" = "Transparent+100" - "RenderType" = "Transparent" - } - - Pass { - Name "Mask" - Cull Off - ZTest [_ZTest] - ZWrite Off - ColorMask 0 - - Stencil { - Ref 1 - Pass Replace - } - } - } -} diff --git a/Assets/QuickOutline/Resources/Shaders/OutlineMask.shader.meta b/Assets/QuickOutline/Resources/Shaders/OutlineMask.shader.meta deleted file mode 100644 index a20bfde5..00000000 --- a/Assets/QuickOutline/Resources/Shaders/OutlineMask.shader.meta +++ /dev/null @@ -1,17 +0,0 @@ -fileFormatVersion: 2 -guid: 341b058cd7dee4f5cba5cc59a513619e -timeCreated: 1520575773 -licenseType: Store -ShaderImporter: - externalObjects: {} - defaultTextures: [] - userData: - assetBundleName: - assetBundleVariant: -AssetOrigin: - serializedVersion: 1 - productId: 115488 - packageName: Quick Outline - packageVersion: 1.1 - assetPath: Assets/QuickOutline/Resources/Shaders/OutlineMask.shader - uploadId: 485303 diff --git a/Assets/QuickOutline/Samples.meta b/Assets/QuickOutline/Samples.meta deleted file mode 100644 index 7d6c23d0..00000000 --- a/Assets/QuickOutline/Samples.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: 932f8193e5396db4babac4756c406dee -folderAsset: yes -timeCreated: 1522559213 -licenseType: Store -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/QuickOutline/Samples/Materials.meta b/Assets/QuickOutline/Samples/Materials.meta deleted file mode 100644 index cb148197..00000000 --- a/Assets/QuickOutline/Samples/Materials.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: 2b0040b0ed7fbd64693e9195d13d25f9 -folderAsset: yes -timeCreated: 1522615600 -licenseType: Store -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/QuickOutline/Samples/Materials/Plane.mat b/Assets/QuickOutline/Samples/Materials/Plane.mat deleted file mode 100644 index 06fa1aa0..00000000 --- a/Assets/QuickOutline/Samples/Materials/Plane.mat +++ /dev/null @@ -1,76 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!21 &2100000 -Material: - serializedVersion: 6 - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_Name: Plane - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _BumpMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailAlbedoMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailMask: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _DetailNormalMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _EmissionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _MetallicGlossMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _OcclusionMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - - _ParallaxMap: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Floats: - - _BumpScale: 1 - - _Cutoff: 0.5 - - _DetailNormalMapScale: 1 - - _DstBlend: 0 - - _GlossMapScale: 1 - - _Glossiness: 0.5 - - _GlossyReflections: 1 - - _Metallic: 1 - - _Mode: 0 - - _OcclusionStrength: 1 - - _Parallax: 0.02 - - _SmoothnessTextureChannel: 0 - - _SpecularHighlights: 1 - - _SrcBlend: 1 - - _UVSec: 0 - - _ZWrite: 1 - m_Colors: - - _Color: {r: 0.2509804, g: 0.2509804, b: 0.5019608, a: 1} - - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/QuickOutline/Samples/Materials/Plane.mat.meta b/Assets/QuickOutline/Samples/Materials/Plane.mat.meta deleted file mode 100644 index 64e3c3ca..00000000 --- a/Assets/QuickOutline/Samples/Materials/Plane.mat.meta +++ /dev/null @@ -1,17 +0,0 @@ -fileFormatVersion: 2 -guid: f58cf65ea995c4b45be95713bdea8134 -timeCreated: 1522540975 -licenseType: Store -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 2100000 - userData: - assetBundleName: - assetBundleVariant: -AssetOrigin: - serializedVersion: 1 - productId: 115488 - packageName: Quick Outline - packageVersion: 1.1 - assetPath: Assets/QuickOutline/Samples/Materials/Plane.mat - uploadId: 485303 diff --git a/Assets/QuickOutline/Samples/Scenes.meta b/Assets/QuickOutline/Samples/Scenes.meta deleted file mode 100644 index 7f5c774b..00000000 --- a/Assets/QuickOutline/Samples/Scenes.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: 3916faa55c6a94248959031ee0ad499f -folderAsset: yes -timeCreated: 1522615614 -licenseType: Store -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/QuickOutline/Samples/Scenes/QuickOutline.unity b/Assets/QuickOutline/Samples/Scenes/QuickOutline.unity deleted file mode 100644 index 33911b7f..00000000 --- a/Assets/QuickOutline/Samples/Scenes/QuickOutline.unity +++ /dev/null @@ -1,778 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 8 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 820273532} - m_IndirectSpecularColor: {r: 0.18028383, g: 0.22571409, b: 0.30692282, a: 1} ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_GIWorkflowMode: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_TemporalCoherenceThreshold: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 1 - m_LightmapEditorSettings: - serializedVersion: 8 - m_Resolution: 2 - m_BakeResolution: 40 - m_TextureWidth: 1024 - m_TextureHeight: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 3 - m_BakeBackend: 0 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 500 - m_PVRBounces: 2 - m_PVRFiltering: 0 - m_PVRFilteringMode: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousColorSigma: 1 - m_PVRFilteringAtrousNormalSigma: 1 - m_PVRFilteringAtrousPositionSigma: 1 - m_LightingDataAsset: {fileID: 0} - m_ShadowMaskMode: 2 ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &122269556 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 122269561} - - component: {fileID: 122269560} - - component: {fileID: 122269558} - - component: {fileID: 122269557} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &122269557 -AudioListener: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 122269556} - m_Enabled: 1 ---- !u!124 &122269558 -Behaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 122269556} - m_Enabled: 1 ---- !u!20 &122269560 -Camera: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 122269556} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 - m_StereoMirrorMode: 0 ---- !u!4 &122269561 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 122269556} - m_LocalRotation: {x: 0.3420201, y: 0, z: 0, w: 0.9396927} - m_LocalPosition: {x: 0, y: 3, z: -4} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 40, y: 0, z: 0} ---- !u!1 &124162633 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 124162634} - - component: {fileID: 124162638} - - component: {fileID: 124162636} - - component: {fileID: 124162635} - m_Layer: 0 - m_Name: Outline Hidden - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &124162634 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 124162633} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -2, y: 0, z: 0} - m_LocalScale: {x: 1, y: 0.5, z: 1} - m_Children: [] - m_Father: {fileID: 935070115} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &124162635 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 124162633} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5fea29bb7c508c244a1f805a5fd3fc4d, type: 3} - m_Name: - m_EditorClassIdentifier: - outlineMode: 2 - outlineColor: {r: 1, g: 0.2509804, b: 0.2509804, a: 1} - outlineWidth: 6 ---- !u!23 &124162636 -MeshRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 124162633} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &124162638 -MeshFilter: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 124162633} - m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &796971894 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 796971895} - - component: {fileID: 796971899} - - component: {fileID: 796971897} - - component: {fileID: 796971896} - m_Layer: 0 - m_Name: Outline And Silhouette - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &796971895 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 796971894} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 2, y: 0, z: 0} - m_LocalScale: {x: 1, y: 0.5, z: 1} - m_Children: [] - m_Father: {fileID: 935070115} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &796971896 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 796971894} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5fea29bb7c508c244a1f805a5fd3fc4d, type: 3} - m_Name: - m_EditorClassIdentifier: - outlineMode: 3 - outlineColor: {r: 0.2509804, g: 1, b: 1, a: 1} - outlineWidth: 6 ---- !u!23 &796971897 -MeshRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 796971894} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &796971899 -MeshFilter: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 796971894} - m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &820273531 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 820273533} - - component: {fileID: 820273532} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &820273532 -Light: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 820273531} - m_Enabled: 1 - serializedVersion: 8 - m_Type: 1 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_Lightmapping: 4 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &820273533 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 820273531} - m_LocalRotation: {x: 0.40821788, y: 0.23456976, z: -0.10938167, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 50, y: 30, z: 0} ---- !u!1 &935070114 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 935070115} - m_Layer: 0 - m_Name: Outlined Objects - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &935070115 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 935070114} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 1781008194} - - {fileID: 124162634} - - {fileID: 1346396411} - - {fileID: 796971895} - - {fileID: 1083549395} - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1083549394 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 1083549395} - - component: {fileID: 1083549399} - - component: {fileID: 1083549397} - - component: {fileID: 1083549396} - m_Layer: 0 - m_Name: Outline Visible - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1083549395 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1083549394} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 4, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 935070115} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1083549396 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1083549394} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5fea29bb7c508c244a1f805a5fd3fc4d, type: 3} - m_Name: - m_EditorClassIdentifier: - outlineMode: 1 - outlineColor: {r: 0.2509804, g: 1, b: 0.2509804, a: 1} - outlineWidth: 6 ---- !u!23 &1083549397 -MeshRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1083549394} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1083549399 -MeshFilter: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1083549394} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1346396410 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 1346396411} - - component: {fileID: 1346396415} - - component: {fileID: 1346396413} - - component: {fileID: 1346396412} - m_Layer: 0 - m_Name: Outline All - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1346396411 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1346396410} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 935070115} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1346396412 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1346396410} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5fea29bb7c508c244a1f805a5fd3fc4d, type: 3} - m_Name: - m_EditorClassIdentifier: - outlineMode: 0 - outlineColor: {r: 1, g: 1, b: 0.2509804, a: 1} - outlineWidth: 6 ---- !u!23 &1346396413 -MeshRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1346396410} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1346396415 -MeshFilter: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1346396410} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!1 &1580478821 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 1580478825} - - component: {fileID: 1580478824} - - component: {fileID: 1580478822} - m_Layer: 0 - m_Name: Plane - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!23 &1580478822 -MeshRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1580478821} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_Materials: - - {fileID: 2100000, guid: f58cf65ea995c4b45be95713bdea8134, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1580478824 -MeshFilter: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1580478821} - m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1580478825 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1580478821} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 10, y: 1, z: 10} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1781008193 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 1781008194} - - component: {fileID: 1781008198} - - component: {fileID: 1781008196} - - component: {fileID: 1781008195} - m_Layer: 0 - m_Name: Silhouette Only - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1781008194 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1781008193} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -4, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 935070115} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1781008195 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1781008193} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5fea29bb7c508c244a1f805a5fd3fc4d, type: 3} - m_Name: - m_EditorClassIdentifier: - outlineMode: 4 - outlineColor: {r: 1, g: 1, b: 1, a: 1} - outlineWidth: 6 ---- !u!23 &1781008196 -MeshRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1781008193} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &1781008198 -MeshFilter: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1781008193} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/QuickOutline/Samples/Scenes/QuickOutline.unity.meta b/Assets/QuickOutline/Samples/Scenes/QuickOutline.unity.meta deleted file mode 100644 index f1107a5c..00000000 --- a/Assets/QuickOutline/Samples/Scenes/QuickOutline.unity.meta +++ /dev/null @@ -1,16 +0,0 @@ -fileFormatVersion: 2 -guid: f23712c79adc910408e872b127e825cf -timeCreated: 1522615825 -licenseType: Store -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: -AssetOrigin: - serializedVersion: 1 - productId: 115488 - packageName: Quick Outline - packageVersion: 1.1 - assetPath: Assets/QuickOutline/Samples/Scenes/QuickOutline.unity - uploadId: 485303 diff --git a/Assets/QuickOutline/Scripts.meta b/Assets/QuickOutline/Scripts.meta deleted file mode 100644 index 2f7793d8..00000000 --- a/Assets/QuickOutline/Scripts.meta +++ /dev/null @@ -1,10 +0,0 @@ -fileFormatVersion: 2 -guid: 3ddbd65d69a9f0b48bab4fe96a1fe099 -folderAsset: yes -timeCreated: 1522559122 -licenseType: Store -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/QuickOutline/Scripts/Outline.cs b/Assets/QuickOutline/Scripts/Outline.cs deleted file mode 100644 index 26d87882..00000000 --- a/Assets/QuickOutline/Scripts/Outline.cs +++ /dev/null @@ -1,309 +0,0 @@ -// -// Outline.cs -// QuickOutline -// -// Created by Chris Nolet on 3/30/18. -// Copyright © 2018 Chris Nolet. All rights reserved. -// - -using System; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; - -[DisallowMultipleComponent] - -public class Outline : MonoBehaviour { - private static HashSet registeredMeshes = new HashSet(); - - public enum Mode { - OutlineAll, - OutlineVisible, - OutlineHidden, - OutlineAndSilhouette, - SilhouetteOnly - } - - public Mode OutlineMode { - get { return outlineMode; } - set { - outlineMode = value; - needsUpdate = true; - } - } - - public Color OutlineColor { - get { return outlineColor; } - set { - outlineColor = value; - needsUpdate = true; - } - } - - public float OutlineWidth { - get { return outlineWidth; } - set { - outlineWidth = value; - needsUpdate = true; - } - } - - [Serializable] - private class ListVector3 { - public List data; - } - - [SerializeField] - private Mode outlineMode; - - [SerializeField] - private Color outlineColor = Color.white; - - [SerializeField, Range(0f, 10f)] - private float outlineWidth = 2f; - - [Header("Optional")] - - [SerializeField, Tooltip("Precompute enabled: Per-vertex calculations are performed in the editor and serialized with the object. " - + "Precompute disabled: Per-vertex calculations are performed at runtime in Awake(). This may cause a pause for large meshes.")] - private bool precomputeOutline; - - [SerializeField, HideInInspector] - private List bakeKeys = new List(); - - [SerializeField, HideInInspector] - private List bakeValues = new List(); - - private Renderer[] renderers; - private Material outlineMaskMaterial; - private Material outlineFillMaterial; - - private bool needsUpdate; - - void Awake() { - - // Cache renderers - renderers = GetComponentsInChildren(); - - // Instantiate outline materials - outlineMaskMaterial = Instantiate(Resources.Load(@"Materials/OutlineMask")); - outlineFillMaterial = Instantiate(Resources.Load(@"Materials/OutlineFill")); - - outlineMaskMaterial.name = "OutlineMask (Instance)"; - outlineFillMaterial.name = "OutlineFill (Instance)"; - - // Retrieve or generate smooth normals - LoadSmoothNormals(); - - // Apply material properties immediately - needsUpdate = true; - } - - void OnEnable() { - foreach (var renderer in renderers) { - - // Append outline shaders - var materials = renderer.sharedMaterials.ToList(); - - materials.Add(outlineMaskMaterial); - materials.Add(outlineFillMaterial); - - renderer.materials = materials.ToArray(); - } - } - - void OnValidate() { - - // Update material properties - needsUpdate = true; - - // Clear cache when baking is disabled or corrupted - if (!precomputeOutline && bakeKeys.Count != 0 || bakeKeys.Count != bakeValues.Count) { - bakeKeys.Clear(); - bakeValues.Clear(); - } - - // Generate smooth normals when baking is enabled - if (precomputeOutline && bakeKeys.Count == 0) { - Bake(); - } - } - - void Update() { - if (needsUpdate) { - needsUpdate = false; - - UpdateMaterialProperties(); - } - } - - void OnDisable() { - foreach (var renderer in renderers) { - - // Remove outline shaders - var materials = renderer.sharedMaterials.ToList(); - - materials.Remove(outlineMaskMaterial); - materials.Remove(outlineFillMaterial); - - renderer.materials = materials.ToArray(); - } - } - - void OnDestroy() { - - // Destroy material instances - Destroy(outlineMaskMaterial); - Destroy(outlineFillMaterial); - } - - void Bake() { - - // Generate smooth normals for each mesh - var bakedMeshes = new HashSet(); - - foreach (var meshFilter in GetComponentsInChildren()) { - - // Skip duplicates - if (!bakedMeshes.Add(meshFilter.sharedMesh)) { - continue; - } - - // Serialize smooth normals - var smoothNormals = SmoothNormals(meshFilter.sharedMesh); - - bakeKeys.Add(meshFilter.sharedMesh); - bakeValues.Add(new ListVector3() { data = smoothNormals }); - } - } - - void LoadSmoothNormals() { - - // Retrieve or generate smooth normals - foreach (var meshFilter in GetComponentsInChildren()) { - - // Skip if smooth normals have already been adopted - if (!registeredMeshes.Add(meshFilter.sharedMesh)) { - continue; - } - - // Retrieve or generate smooth normals - var index = bakeKeys.IndexOf(meshFilter.sharedMesh); - var smoothNormals = (index >= 0) ? bakeValues[index].data : SmoothNormals(meshFilter.sharedMesh); - - // Store smooth normals in UV3 - meshFilter.sharedMesh.SetUVs(3, smoothNormals); - - // Combine submeshes - var renderer = meshFilter.GetComponent(); - - if (renderer != null) { - CombineSubmeshes(meshFilter.sharedMesh, renderer.sharedMaterials); - } - } - - // Clear UV3 on skinned mesh renderers - foreach (var skinnedMeshRenderer in GetComponentsInChildren()) { - - // Skip if UV3 has already been reset - if (!registeredMeshes.Add(skinnedMeshRenderer.sharedMesh)) { - continue; - } - - // Clear UV3 - skinnedMeshRenderer.sharedMesh.uv4 = new Vector2[skinnedMeshRenderer.sharedMesh.vertexCount]; - - // Combine submeshes - CombineSubmeshes(skinnedMeshRenderer.sharedMesh, skinnedMeshRenderer.sharedMaterials); - } - } - - List SmoothNormals(Mesh mesh) { - - // Group vertices by location - var groups = mesh.vertices.Select((vertex, index) => new KeyValuePair(vertex, index)).GroupBy(pair => pair.Key); - - // Copy normals to a new list - var smoothNormals = new List(mesh.normals); - - // Average normals for grouped vertices - foreach (var group in groups) { - - // Skip single vertices - if (group.Count() == 1) { - continue; - } - - // Calculate the average normal - var smoothNormal = Vector3.zero; - - foreach (var pair in group) { - smoothNormal += smoothNormals[pair.Value]; - } - - smoothNormal.Normalize(); - - // Assign smooth normal to each vertex - foreach (var pair in group) { - smoothNormals[pair.Value] = smoothNormal; - } - } - - return smoothNormals; - } - - void CombineSubmeshes(Mesh mesh, Material[] materials) { - - // Skip meshes with a single submesh - if (mesh.subMeshCount == 1) { - return; - } - - // Skip if submesh count exceeds material count - if (mesh.subMeshCount > materials.Length) { - return; - } - - // Append combined submesh - mesh.subMeshCount++; - mesh.SetTriangles(mesh.triangles, mesh.subMeshCount - 1); - } - - void UpdateMaterialProperties() { - - // Apply properties according to mode - outlineFillMaterial.SetColor("_OutlineColor", outlineColor); - - switch (outlineMode) { - case Mode.OutlineAll: - outlineMaskMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Always); - outlineFillMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Always); - outlineFillMaterial.SetFloat("_OutlineWidth", outlineWidth); - break; - - case Mode.OutlineVisible: - outlineMaskMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Always); - outlineFillMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.LessEqual); - outlineFillMaterial.SetFloat("_OutlineWidth", outlineWidth); - break; - - case Mode.OutlineHidden: - outlineMaskMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Always); - outlineFillMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Greater); - outlineFillMaterial.SetFloat("_OutlineWidth", outlineWidth); - break; - - case Mode.OutlineAndSilhouette: - outlineMaskMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.LessEqual); - outlineFillMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Always); - outlineFillMaterial.SetFloat("_OutlineWidth", outlineWidth); - break; - - case Mode.SilhouetteOnly: - outlineMaskMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.LessEqual); - outlineFillMaterial.SetFloat("_ZTest", (float)UnityEngine.Rendering.CompareFunction.Greater); - outlineFillMaterial.SetFloat("_OutlineWidth", 0f); - break; - } - } -} diff --git a/Assets/QuickOutline/Scripts/Outline.cs.meta b/Assets/QuickOutline/Scripts/Outline.cs.meta deleted file mode 100644 index 3c3932c8..00000000 --- a/Assets/QuickOutline/Scripts/Outline.cs.meta +++ /dev/null @@ -1,20 +0,0 @@ -fileFormatVersion: 2 -guid: 5fea29bb7c508c244a1f805a5fd3fc4d -timeCreated: 1522369084 -licenseType: Store -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: -AssetOrigin: - serializedVersion: 1 - productId: 115488 - packageName: Quick Outline - packageVersion: 1.1 - assetPath: Assets/QuickOutline/Scripts/Outline.cs - uploadId: 485303 diff --git a/Assets/Resources/AI-Game-Developer-Config.json b/Assets/Resources/AI-Game-Developer-Config.json new file mode 100644 index 00000000..2b3cf054 --- /dev/null +++ b/Assets/Resources/AI-Game-Developer-Config.json @@ -0,0 +1,423 @@ +{ + "logLevel": 3, + "keepServerRunning": true, + "transportMethod": 2, + "tools": [ + { + "name": "assets-copy", + "enabled": true + }, + { + "name": "assets-create-folder", + "enabled": true + }, + { + "name": "assets-delete", + "enabled": true + }, + { + "name": "assets-find", + "enabled": true + }, + { + "name": "assets-find-built-in", + "enabled": true + }, + { + "name": "assets-get-data", + "enabled": true + }, + { + "name": "assets-material-create", + "enabled": true + }, + { + "name": "assets-modify", + "enabled": true + }, + { + "name": "assets-move", + "enabled": true + }, + { + "name": "assets-refresh", + "enabled": true + }, + { + "name": "assets-prefab-close", + "enabled": true + }, + { + "name": "assets-prefab-create", + "enabled": true + }, + { + "name": "assets-prefab-instantiate", + "enabled": true + }, + { + "name": "assets-prefab-open", + "enabled": true + }, + { + "name": "assets-prefab-save", + "enabled": true + }, + { + "name": "assets-shader-list-all", + "enabled": true + }, + { + "name": "console-get-logs", + "enabled": true + }, + { + "name": "editor-application-get-state", + "enabled": true + }, + { + "name": "editor-application-set-state", + "enabled": true + }, + { + "name": "editor-selection-get", + "enabled": true + }, + { + "name": "editor-selection-set", + "enabled": true + }, + { + "name": "gameobject-component-add", + "enabled": true + }, + { + "name": "gameobject-component-destroy", + "enabled": true + }, + { + "name": "gameobject-component-get", + "enabled": true + }, + { + "name": "gameobject-component-list-all", + "enabled": true + }, + { + "name": "gameobject-component-modify", + "enabled": true + }, + { + "name": "gameobject-create", + "enabled": true + }, + { + "name": "gameobject-destroy", + "enabled": true + }, + { + "name": "gameobject-duplicate", + "enabled": true + }, + { + "name": "gameobject-find", + "enabled": true + }, + { + "name": "gameobject-modify", + "enabled": true + }, + { + "name": "gameobject-set-parent", + "enabled": true + }, + { + "name": "object-get-data", + "enabled": true + }, + { + "name": "object-modify", + "enabled": true + }, + { + "name": "package-add", + "enabled": true + }, + { + "name": "package-list", + "enabled": true + }, + { + "name": "package-remove", + "enabled": true + }, + { + "name": "package-search", + "enabled": true + }, + { + "name": "reflection-method-call", + "enabled": true + }, + { + "name": "reflection-method-find", + "enabled": true + }, + { + "name": "scene-create", + "enabled": true + }, + { + "name": "scene-get-data", + "enabled": true + }, + { + "name": "scene-list-opened", + "enabled": true + }, + { + "name": "scene-open", + "enabled": true + }, + { + "name": "scene-save", + "enabled": true + }, + { + "name": "scene-set-active", + "enabled": true + }, + { + "name": "scene-unload", + "enabled": true + }, + { + "name": "screenshot-camera", + "enabled": true + }, + { + "name": "screenshot-game-view", + "enabled": true + }, + { + "name": "screenshot-scene-view", + "enabled": true + }, + { + "name": "script-delete", + "enabled": true + }, + { + "name": "script-execute", + "enabled": true + }, + { + "name": "script-read", + "enabled": true + }, + { + "name": "script-update-or-create", + "enabled": true + }, + { + "name": "tests-run", + "enabled": true + } + ], + "prompts": [ + { + "name": "setup-animator-controller", + "enabled": true + }, + { + "name": "create-simple-tweening", + "enabled": true + }, + { + "name": "setup-timeline-sequence", + "enabled": true + }, + { + "name": "add-animation-events", + "enabled": true + }, + { + "name": "create-procedural-animation", + "enabled": true + }, + { + "name": "setup-sprite-animation", + "enabled": true + }, + { + "name": "add-ik-system", + "enabled": true + }, + { + "name": "create-animation-blending", + "enabled": true + }, + { + "name": "organize-project-structure", + "enabled": true + }, + { + "name": "import-setup-sprites", + "enabled": true + }, + { + "name": "setup-audio-manager", + "enabled": true + }, + { + "name": "configure-build-settings", + "enabled": true + }, + { + "name": "create-material-library", + "enabled": true + }, + { + "name": "setup-asset-bundles", + "enabled": true + }, + { + "name": "optimize-texture-settings", + "enabled": true + }, + { + "name": "setup-addressables", + "enabled": true + }, + { + "name": "add-debug-visualization", + "enabled": true + }, + { + "name": "setup-performance-profiling", + "enabled": true + }, + { + "name": "create-test-scene", + "enabled": true + }, + { + "name": "add-logging-system", + "enabled": true + }, + { + "name": "create-unit-tests", + "enabled": true + }, + { + "name": "setup-debug-ui", + "enabled": true + }, + { + "name": "add-assertion-checks", + "enabled": true + }, + { + "name": "create-automated-tests", + "enabled": true + }, + { + "name": "add-standard-components", + "enabled": true + }, + { + "name": "setup-player-controller", + "enabled": true + }, + { + "name": "create-ui-canvas", + "enabled": true + }, + { + "name": "add-physics-interactions", + "enabled": true + }, + { + "name": "create-interactive-object", + "enabled": true + }, + { + "name": "setup-audio-source", + "enabled": true + }, + { + "name": "create-particle-effects", + "enabled": true + }, + { + "name": "setup-animator-component", + "enabled": true + }, + { + "name": "setup-basic-scene", + "enabled": true + }, + { + "name": "organize-scene-hierarchy", + "enabled": true + }, + { + "name": "add-lighting-setup", + "enabled": true + }, + { + "name": "create-prefab-from-selection", + "enabled": true + }, + { + "name": "setup-scene-camera", + "enabled": true + }, + { + "name": "create-environment-template", + "enabled": true + }, + { + "name": "generate-monobehaviour-template", + "enabled": true + }, + { + "name": "add-event-system", + "enabled": true + }, + { + "name": "create-singleton-manager", + "enabled": true + }, + { + "name": "setup-coroutine-framework", + "enabled": true + }, + { + "name": "create-scriptableobject-data", + "enabled": true + }, + { + "name": "implement-object-pooling", + "enabled": true + }, + { + "name": "add-state-machine", + "enabled": true + }, + { + "name": "setup-dependency-injection", + "enabled": true + } + ], + "resources": [ + { + "name": "GameObject from Current Scene by Path", + "enabled": true + } + ], + "host": "http://localhost:55726", + "timeoutMs": 10000, + "keepConnected": true, + "token": null +} \ No newline at end of file diff --git a/Assets/Resources/PerformanceTestRunInfo.json.meta b/Assets/Resources/AI-Game-Developer-Config.json.meta similarity index 75% rename from Assets/Resources/PerformanceTestRunInfo.json.meta rename to Assets/Resources/AI-Game-Developer-Config.json.meta index 15e99379..ad966754 100644 --- a/Assets/Resources/PerformanceTestRunInfo.json.meta +++ b/Assets/Resources/AI-Game-Developer-Config.json.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a8692d97c02ffec48bc8f9f568e868a5 +guid: 5ecf6949f73508f49ba3a0633329a219 TextScriptImporter: externalObjects: {} userData: diff --git a/Assets/Resources/Factory/Prefabs/Tab/TabContentComponentList.prefab b/Assets/Resources/Factory/Prefabs/Tab/TabContentComponentList.prefab index d39d7b5c..e411e08a 100644 --- a/Assets/Resources/Factory/Prefabs/Tab/TabContentComponentList.prefab +++ b/Assets/Resources/Factory/Prefabs/Tab/TabContentComponentList.prefab @@ -139,7 +139,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -12, y: -1} + m_AnchoredPosition: {x: -20, y: -1} m_SizeDelta: {x: 22, y: 22} m_Pivot: {x: 1, y: 1} --- !u!222 &5485997075992529675 @@ -246,7 +246,7 @@ PrefabInstance: m_Modifications: - target: {fileID: 1375483911066562825, guid: 963f47de712c3844183989c7fc7fbd8a, type: 3} propertyPath: m_SizeDelta.x - value: 238 + value: -65 objectReference: {fileID: 0} - target: {fileID: 5097404189591199700, guid: 963f47de712c3844183989c7fc7fbd8a, type: 3} propertyPath: m_AnchorMax.x diff --git a/Assets/QuickOutline/Resources/Materials.meta b/Assets/Resources/Factory/UIToolkit.meta similarity index 61% rename from Assets/QuickOutline/Resources/Materials.meta rename to Assets/Resources/Factory/UIToolkit.meta index 2508b0f5..dd3dc108 100644 --- a/Assets/QuickOutline/Resources/Materials.meta +++ b/Assets/Resources/Factory/UIToolkit.meta @@ -1,8 +1,6 @@ fileFormatVersion: 2 -guid: 80ac8e52d3c31a94babd161e86bc6b97 +guid: 35623d99e7e18de4c9218b9878efaac6 folderAsset: yes -timeCreated: 1522559139 -licenseType: Store DefaultImporter: externalObjects: {} userData: diff --git a/Assets/QuickOutline/Resources/Shaders.meta b/Assets/Resources/Factory/UIToolkit/Modal.meta similarity index 61% rename from Assets/QuickOutline/Resources/Shaders.meta rename to Assets/Resources/Factory/UIToolkit/Modal.meta index 91118d56..634e2b5a 100644 --- a/Assets/QuickOutline/Resources/Shaders.meta +++ b/Assets/Resources/Factory/UIToolkit/Modal.meta @@ -1,8 +1,6 @@ fileFormatVersion: 2 -guid: 6a63caa2b0e993043a42c11f35ff2d1a +guid: 9ffd6459fed612148ac685b6329657a1 folderAsset: yes -timeCreated: 1522559134 -licenseType: Store DefaultImporter: externalObjects: {} userData: diff --git a/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentAlarmUXML.uxml b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentAlarmUXML.uxml new file mode 100644 index 00000000..b4408e3d --- /dev/null +++ b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentAlarmUXML.uxml @@ -0,0 +1,5 @@ + + + + + diff --git a/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentAlarmUXML.uxml.meta b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentAlarmUXML.uxml.meta new file mode 100644 index 00000000..5cffaf0d --- /dev/null +++ b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentAlarmUXML.uxml.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 92f820b7de9d43c428503b7c574c9e69 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentDisplayUXML.uxml b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentDisplayUXML.uxml new file mode 100644 index 00000000..110b5ce5 --- /dev/null +++ b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentDisplayUXML.uxml @@ -0,0 +1,5 @@ + + + + + diff --git a/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentDisplayUXML.uxml.meta b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentDisplayUXML.uxml.meta new file mode 100644 index 00000000..da394c8a --- /dev/null +++ b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentDisplayUXML.uxml.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: db6157353e844a84fabf731aed504f56 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentGeneralUXML.uxml b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentGeneralUXML.uxml new file mode 100644 index 00000000..64bd8d64 --- /dev/null +++ b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentGeneralUXML.uxml @@ -0,0 +1,5 @@ + + + + + diff --git a/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentGeneralUXML.uxml.meta b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentGeneralUXML.uxml.meta new file mode 100644 index 00000000..037ca074 --- /dev/null +++ b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentGeneralUXML.uxml.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 7b805d40178aceb48b21275834afbb24 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentInputUXML.uxml b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentInputUXML.uxml new file mode 100644 index 00000000..075dbfb3 --- /dev/null +++ b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentInputUXML.uxml @@ -0,0 +1,5 @@ + + + + + diff --git a/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentInputUXML.uxml.meta b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentInputUXML.uxml.meta new file mode 100644 index 00000000..f4f82a65 --- /dev/null +++ b/Assets/Resources/Factory/UIToolkit/Modal/UTKFactorySettingModalContentInputUXML.uxml.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 5224fd32ba226a340aaac4e6dc070861 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/QuickOutline/Resources.meta b/Assets/Resources/Fonts/Icons.meta similarity index 61% rename from Assets/QuickOutline/Resources.meta rename to Assets/Resources/Fonts/Icons.meta index 6135a952..f04f140e 100644 --- a/Assets/QuickOutline/Resources.meta +++ b/Assets/Resources/Fonts/Icons.meta @@ -1,8 +1,6 @@ fileFormatVersion: 2 -guid: 70fd40674751a8042a8b9b2e8d9f915f +guid: 1f3edc5b32ba94941ac6f2897a9cbf45 folderAsset: yes -timeCreated: 1522559128 -licenseType: Store DefaultImporter: externalObjects: {} userData: diff --git a/Assets/Resources/Fonts/Icons/MaterialSymbolsOutlined.ttf b/Assets/Resources/Fonts/Icons/MaterialSymbolsOutlined.ttf new file mode 100644 index 00000000..9006c26f Binary files /dev/null and b/Assets/Resources/Fonts/Icons/MaterialSymbolsOutlined.ttf differ diff --git a/Assets/Resources/Fonts/Icons/MaterialSymbolsOutlined.ttf.meta b/Assets/Resources/Fonts/Icons/MaterialSymbolsOutlined.ttf.meta new file mode 100644 index 00000000..e43902de --- /dev/null +++ b/Assets/Resources/Fonts/Icons/MaterialSymbolsOutlined.ttf.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: fa552b28df3e88d44b6fa1a31d87dbf0 +TrueTypeFontImporter: + externalObjects: {} + serializedVersion: 4 + fontSize: 16 + forceTextureCase: -2 + characterSpacing: 0 + characterPadding: 1 + includeFontData: 1 + fontNames: + - Material Symbols Outlined + fallbackFontReferences: [] + customCharacters: + fontRenderingMode: 0 + ascentCalculationMode: 1 + useLegacyBoundsCalculation: 0 + shouldRoundAdvanceValue: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Fonts/Icons/MaterialSymbolsOutlinedCodepoints.txt b/Assets/Resources/Fonts/Icons/MaterialSymbolsOutlinedCodepoints.txt new file mode 100644 index 00000000..ec2d8547 --- /dev/null +++ b/Assets/Resources/Fonts/Icons/MaterialSymbolsOutlinedCodepoints.txt @@ -0,0 +1,4102 @@ +10k e951 +10mp e952 +11mp e953 +123 eb8d +12mp e954 +13mp e955 +14mp e956 +15mp e957 +16mp e958 +17mp e959 +18_up_rating f8fd +18mp e95a +19mp e95b +1k e95c +1k_plus e95d +1x_mobiledata efcd +1x_mobiledata_badge f7f1 +20mp e95e +21mp e95f +22mp e960 +23mp e961 +24fps_select f3f2 +24mp e962 +2d ef37 +2k e963 +2k_plus e964 +2mp e965 +30fps efce +30fps_select efcf +360 e577 +3d ed38 +3d_rotation e84d +3g_mobiledata efd0 +3g_mobiledata_badge f7f0 +3k e966 +3k_plus e967 +3mp e968 +3p efd1 +4g_mobiledata efd2 +4g_mobiledata_badge f7ef +4g_plus_mobiledata efd3 +4k e072 +4k_plus e969 +4mp e96a +50mp f6f3 +5g ef38 +5g_mobiledata_badge f7ee +5k e96b +5k_plus e96c +5mp e96d +60fps efd4 +60fps_select efd5 +6_ft_apart f21e +6k e96e +6k_plus e96f +6mp e970 +7k e971 +7k_plus e972 +7mp e973 +8k e974 +8k_plus e975 +8mp e976 +9k e977 +9k_plus e978 +9mp e979 +abc eb94 +ac_unit eb3b +access_alarm e855 +access_alarms e855 +access_time efd6 +access_time_filled efd6 +accessibility e84e +accessibility_new e92c +accessible e914 +accessible_forward e934 +accessible_menu f34e +account_balance e84f +account_balance_wallet e850 +account_box e851 +account_child e852 +account_child_invert e659 +account_circle f20b +account_circle_filled f20b +account_circle_off f7b3 +account_tree e97a +action_key f502 +activity_zone e1e6 +acupuncture f2c4 +acute e4cb +ad e65a +ad_group e65b +ad_group_off eae5 +ad_off f7b2 +ad_units f2eb +adaptive_audio_mic f4cc +adaptive_audio_mic_off f4cb +adb e60e +add e145 +add_2 f3dd +add_a_photo e439 +add_ad e72a +add_alarm e856 +add_alert e003 +add_box e146 +add_business e729 +add_call f0b7 +add_card eb86 +add_chart ef3c +add_circle e3ba +add_circle_outline e3ba +add_column_left f425 +add_column_right f424 +add_comment e266 +add_diamond f49c +add_home f8eb +add_home_work f8ed +add_ic_call f0b7 +add_link e178 +add_location e567 +add_location_alt ef3a +add_moderator e97d +add_notes e091 +add_photo_alternate e43e +add_reaction e1d3 +add_road ef3b +add_row_above f423 +add_row_below f422 +add_shopping_cart e854 +add_task f23a +add_to_drive e65c +add_to_home_screen f2b9 +add_to_photos e39d +add_to_queue e05c +add_triangle f48e +addchart ef3c +adf_scanner eada +adjust e39e +admin_meds e48d +admin_panel_settings ef3d +ads_click e762 +agender f888 +agriculture ea79 +air efd8 +air_freshener e2ca +air_purifier e97e +air_purifier_gen e829 +airline_seat_flat e630 +airline_seat_flat_angled e631 +airline_seat_individual_suite e632 +airline_seat_legroom_extra e633 +airline_seat_legroom_normal e634 +airline_seat_legroom_reduced e635 +airline_seat_recline_extra e636 +airline_seat_recline_normal e637 +airline_stops e7d0 +airlines e7ca +airplane_ticket efd9 +airplanemode_active e53d +airplanemode_inactive e194 +airplay e055 +airport_shuttle eb3c +airware f154 +airwave f154 +alarm e855 +alarm_add e856 +alarm_off e857 +alarm_on e858 +alarm_pause f35b +alarm_smart_wake f6b0 +album e019 +align_center e356 +align_end f797 +align_flex_center f796 +align_flex_end f795 +align_flex_start f794 +align_horizontal_center e00f +align_horizontal_left e00d +align_horizontal_right e010 +align_items_stretch f793 +align_justify_center f792 +align_justify_flex_end f791 +align_justify_flex_start f790 +align_justify_space_around f78f +align_justify_space_between f78e +align_justify_space_even f78d +align_justify_stretch f78c +align_self_stretch f78b +align_space_around f78a +align_space_between f789 +align_space_even f788 +align_start f787 +align_stretch f786 +align_vertical_bottom e015 +align_vertical_center e011 +align_vertical_top e00c +all_inbox e97f +all_inclusive eb3d +all_match e093 +all_out e90b +allergies e094 +allergy e64e +alt_route f184 +alternate_email e0e6 +altitude f873 +ambient_screen f6c4 +ambulance f803 +amend f802 +amp_stories ea13 +analytics ef3e +anchor f1cd +android e859 +android_cell_4_bar ef06 +android_cell_4_bar_alert ef09 +android_cell_4_bar_off ef08 +android_cell_4_bar_plus ef07 +android_cell_5_bar ef02 +android_cell_5_bar_alert ef05 +android_cell_5_bar_off ef04 +android_cell_5_bar_plus ef03 +android_cell_dual_4_bar ef0d +android_cell_dual_4_bar_alert ef0f +android_cell_dual_4_bar_plus ef0e +android_cell_dual_5_bar ef0a +android_cell_dual_5_bar_alert ef0c +android_cell_dual_5_bar_plus ef0b +android_wifi_3_bar ef16 +android_wifi_3_bar_alert ef1b +android_wifi_3_bar_lock ef1a +android_wifi_3_bar_off ef19 +android_wifi_3_bar_plus ef18 +android_wifi_3_bar_question ef17 +android_wifi_4_bar ef10 +android_wifi_4_bar_alert ef15 +android_wifi_4_bar_lock ef14 +android_wifi_4_bar_off ef13 +android_wifi_4_bar_plus ef12 +android_wifi_4_bar_question ef11 +animated_images f49a +animation e71c +announcement e87f +aod f2e6 +aod_tablet f89f +aod_watch f6ac +apartment ea40 +api f1b7 +apk_document f88e +apk_install f88f +app_badging f72f +app_blocking f2e5 +app_promo f2cd +app_registration ef40 +app_settings_alt f2d9 +app_shortcut f2df +apparel ef7b +approval e982 +approval_delegation f84a +approval_delegation_off f2c5 +apps e5c3 +apps_outage e7cc +aq f55a +aq_indoor f55b +ar_on_you ef7c +ar_stickers e983 +architecture ea3b +archive e149 +area_chart e770 +arming_countdown e78a +arrow_and_edge f5d7 +arrow_back e5c4 +arrow_back_2 f43a +arrow_back_ios e5e0 +arrow_back_ios_new e2ea +arrow_circle_down f181 +arrow_circle_left eaa7 +arrow_circle_right eaaa +arrow_circle_up f182 +arrow_cool_down f4b6 +arrow_downward e5db +arrow_downward_alt e984 +arrow_drop_down e5c5 +arrow_drop_down_circle e5c6 +arrow_drop_up e5c7 +arrow_forward e5c8 +arrow_forward_ios e5e1 +arrow_insert f837 +arrow_left e5de +arrow_left_alt ef7d +arrow_menu_close f3d3 +arrow_menu_open f3d2 +arrow_or_edge f5d6 +arrow_outward f8ce +arrow_range f69b +arrow_right e5df +arrow_right_alt e941 +arrow_selector_tool f82f +arrow_shape_up eef6 +arrow_shape_up_stack eef7 +arrow_shape_up_stack_2 eef8 +arrow_split ea04 +arrow_top_left f72e +arrow_top_right f72d +arrow_upload_progress f3f4 +arrow_upload_ready f3f5 +arrow_upward e5d8 +arrow_upward_alt e986 +arrow_warm_up f4b5 +arrows_input f394 +arrows_more_down f8ab +arrows_more_up f8ac +arrows_output f393 +arrows_outward f72c +art_track e060 +article ef42 +article_person f368 +article_shortcut f587 +artist e01a +aspect_ratio e85b +assessment f0cc +assignment e85d +assignment_add f848 +assignment_globe eeec +assignment_ind e85e +assignment_late e85f +assignment_return e860 +assignment_returned e861 +assignment_turned_in e862 +assist_walker f8d5 +assistant e39f +assistant_device e987 +assistant_direction e988 +assistant_navigation e989 +assistant_on_hub f6c1 +assistant_photo f0c6 +assured_workload eb6f +asterisk f525 +astrophotography_auto f1d9 +astrophotography_off f1da +atm e573 +atr ebc7 +attach_email ea5e +attach_file e226 +attach_file_add f841 +attach_file_off f4d9 +attach_money e227 +attachment e2bc +attractions ea52 +attribution efdb +audio_description f58c +audio_file eb82 +audio_video_receiver f5d3 +audiotrack e405 +auto_activity_zone f8ad +auto_awesome e65f +auto_awesome_mosaic e660 +auto_awesome_motion e661 +auto_delete ea4c +auto_detect_voice f83e +auto_draw_solid e98a +auto_fix e663 +auto_fix_high e663 +auto_fix_normal e664 +auto_fix_off e665 +auto_graph e4fb +auto_label f6be +auto_meeting_room f6bf +auto_mode ec20 +auto_read_pause f219 +auto_read_play f216 +auto_schedule e214 +auto_stories e666 +auto_stories_off f267 +auto_timer ef7f +auto_towing e71e +auto_transmission f53f +auto_videocam f6c0 +autofps_select efdc +automation f421 +autopause f6b6 +autopay f84b +autoplay f6b5 +autorenew e863 +autostop f682 +av1 f4b0 +av_timer e01b +avc f4af +avg_pace f6bb +avg_time f813 +award_meal f241 +award_star f612 +azm f6ec +baby_changing_station f19b +back_hand e764 +back_to_tab f72b +background_dot_large f79e +background_dot_small f514 +background_grid_small f79d +background_replace f20a +backlight_high f7ed +backlight_high_off f4ef +backlight_low f7ec +backpack f19c +backspace e14a +backup e864 +backup_table ef43 +badge ea67 +badge_critical_battery f156 +badminton f2a8 +bakery_dining ea53 +balance eaf6 +balcony e58f +ballot e172 +bar_chart e26b +bar_chart_4_bars f681 +bar_chart_off f411 +barcode e70b +barcode_reader f85c +barcode_scanner e70c +barefoot f871 +batch_prediction f0f5 +bath_bedrock f286 +bath_outdoor f6fb +bath_private f6fa +bath_public_large f6f9 +bath_soak f2a0 +bathroom efdd +bathtub ea41 +battery_0_bar ebdc +battery_1_bar f09c +battery_20 f09c +battery_2_bar f09d +battery_30 f09d +battery_3_bar f09e +battery_4_bar f09f +battery_50 f09e +battery_5_bar f0a0 +battery_60 f09f +battery_6_bar f0a1 +battery_80 f0a0 +battery_90 f0a1 +battery_alert e19c +battery_android_0 f30d +battery_android_1 f30c +battery_android_2 f30b +battery_android_3 f30a +battery_android_4 f309 +battery_android_5 f308 +battery_android_6 f307 +battery_android_alert f306 +battery_android_bolt f305 +battery_android_frame_1 f257 +battery_android_frame_2 f256 +battery_android_frame_3 f255 +battery_android_frame_4 f254 +battery_android_frame_5 f253 +battery_android_frame_6 f252 +battery_android_frame_alert f251 +battery_android_frame_bolt f250 +battery_android_frame_full f24f +battery_android_frame_plus f24e +battery_android_frame_question f24d +battery_android_frame_share f24c +battery_android_frame_shield f24b +battery_android_full f304 +battery_android_plus f303 +battery_android_question f302 +battery_android_share f301 +battery_android_shield f300 +battery_change f7eb +battery_charging_20 f0a2 +battery_charging_30 f0a3 +battery_charging_50 f0a4 +battery_charging_60 f0a5 +battery_charging_80 f0a6 +battery_charging_90 f0a7 +battery_charging_full e1a3 +battery_error f7ea +battery_full e1a5 +battery_full_alt f13b +battery_horiz_000 f8ae +battery_horiz_050 f8af +battery_horiz_075 f8b0 +battery_low f155 +battery_plus f7e9 +battery_profile e206 +battery_saver efde +battery_share f67e +battery_status_good f67d +battery_std e1a5 +battery_unknown e1a6 +battery_vert_005 f8b1 +battery_vert_020 f8b2 +battery_vert_050 f8b3 +battery_very_low f156 +beach_access eb3e +bed efdf +bedroom_baby efe0 +bedroom_child efe1 +bedroom_parent efe2 +bedtime f159 +bedtime_off eb76 +beenhere e52d +beer_meal f285 +bento f1f4 +bia f6eb +bid_landscape e678 +bid_landscape_disabled ef81 +bigtop_updates e669 +bike_dock f47b +bike_lane f47a +bike_scooter ef45 +biotech ea3a +blanket e828 +blender efe3 +blind f8d6 +blinds e286 +blinds_closed ec1f +block f08c +blood_pressure e097 +bloodtype efe4 +bluetooth e1a7 +bluetooth_audio e60f +bluetooth_connected e1a8 +bluetooth_disabled e1a9 +bluetooth_drive efe5 +bluetooth_searching e60f +blur_circular e3a2 +blur_linear e3a3 +blur_medium e84c +blur_off e3a4 +blur_on e3a5 +blur_short e8cf +boat_bus f36d +boat_railway f36c +body_fat e098 +body_system e099 +bolt ea0b +bomb f568 +book e86e +book_2 f53e +book_3 f53d +book_4 f53c +book_5 f53b +book_6 f3df +book_online f2e4 +book_ribbon f3e7 +bookmark e8e7 +bookmark_add e598 +bookmark_added e599 +bookmark_bag f410 +bookmark_border e8e7 +bookmark_check f457 +bookmark_flag f456 +bookmark_heart f455 +bookmark_manager f7b1 +bookmark_remove e59a +bookmark_star f454 +bookmarks e98b +books_movies_and_music ef82 +border_all e228 +border_bottom e229 +border_clear e22a +border_color e22b +border_horizontal e22c +border_inner e22d +border_left e22e +border_outer e22f +border_right e230 +border_style e231 +border_top e232 +border_vertical e233 +borg f40d +bottom_app_bar e730 +bottom_drawer e72d +bottom_navigation e98c +bottom_panel_close f72a +bottom_panel_open f729 +bottom_right_click f684 +bottom_sheets e98d +box f5a4 +box_add f5a5 +box_edit f5a6 +boy eb67 +brand_awareness e98e +brand_family f4f1 +branding_watermark e06b +breakfast_dining ea54 +breaking_news ea08 +breaking_news_alt_1 f0ba +breastfeeding f856 +brick f388 +briefcase_meal f246 +brightness_1 e3fa +brightness_2 f036 +brightness_3 e3a8 +brightness_4 e3a9 +brightness_5 e3aa +brightness_6 e3ab +brightness_7 e3ac +brightness_alert f5cf +brightness_auto e1ab +brightness_empty f7e8 +brightness_high e1ac +brightness_low e1ad +brightness_medium e1ae +bring_your_own_ip e016 +broadcast_on_home f8f8 +broadcast_on_personal f8f9 +broken_image e3ad +browse eb13 +browse_activity f8a5 +browse_gallery ebd1 +browser_not_supported ef47 +browser_updated e7cf +brunch_dining ea73 +brush e3ae +bubble ef83 +bubble_chart e6dd +bubbles f64e +bucket_check ef2a +bug_report e868 +build f8cd +build_circle ef48 +bungalow e591 +burst_mode e43c +bus_alert e98f +bus_railway f36b +business e7ee +business_center eb3f +business_chip f84c +business_messages ef84 +buttons_alt e72f +cabin e589 +cable efe6 +cable_car f479 +cached e86a +cadence f4b4 +cake e7e9 +cake_add f85b +calculate ea5f +calendar_add_on ef85 +calendar_apps_script f0bb +calendar_check f243 +calendar_clock f540 +calendar_lock f242 +calendar_meal f296 +calendar_meal_2 f240 +calendar_month ebcc +calendar_today e935 +calendar_view_day e936 +calendar_view_month efe7 +calendar_view_week efe8 +call f0d4 +call_end f0bc +call_end_alt f0bc +call_log e08e +call_made e0b2 +call_merge e0b3 +call_missed e0b4 +call_missed_outgoing e0e4 +call_quality f652 +call_received e0b5 +call_split e0b6 +call_to_action e06c +camera e3af +camera_alt e412 +camera_enhance e8fc +camera_front f2c9 +camera_indoor efe9 +camera_outdoor efea +camera_rear f2c8 +camera_roll e3b3 +camera_video f7a6 +cameraswitch efeb +campaign ef49 +camping f8a2 +cancel e888 +cancel_presentation e0e9 +cancel_schedule_send ea39 +candle f588 +candlestick_chart ead4 +cannabis f2f3 +captive_portal f728 +capture f727 +car_crash ebf2 +car_defrost_left f344 +car_defrost_low_left f343 +car_defrost_low_right f342 +car_defrost_mid_left f278 +car_defrost_mid_low_left f341 +car_defrost_mid_low_right f277 +car_defrost_mid_right f340 +car_defrost_right f33f +car_fan_low_left f33e +car_fan_low_mid_left f33d +car_fan_low_right f33c +car_fan_mid_left f33b +car_fan_mid_low_right f33a +car_fan_mid_right f339 +car_fan_recirculate f338 +car_gear f337 +car_lock f336 +car_mirror_heat f335 +car_rental ea55 +car_repair ea56 +car_tag f4e3 +card_giftcard e8f6 +card_membership e8f7 +card_travel e8f8 +cardio_load f4b9 +cardiology e09c +cards e991 +cards_star f375 +carpenter f1f8 +carry_on_bag eb08 +carry_on_bag_checked eb0b +carry_on_bag_inactive eb0a +carry_on_bag_question eb09 +cases e992 +casino eb40 +cast e307 +cast_connected e308 +cast_for_education efec +cast_pause f5f0 +cast_warning f5ef +castle eab1 +category e574 +category_search f437 +celebration ea65 +cell_merge f82e +cell_tower ebba +cell_wifi e0ec +center_focus_strong e3b4 +center_focus_weak e3b5 +chair efed +chair_alt efee +chair_counter f29f +chair_fireplace f29e +chair_umbrella f29d +chalet e585 +change_circle e2e7 +change_history e86b +charger e2ae +charging_station f2e3 +chart_data e473 +chat e0c9 +chat_add_on f0f3 +chat_apps_script f0bd +chat_bubble e0cb +chat_bubble_outline e0cb +chat_dashed eeed +chat_error f7ac +chat_info f52b +chat_paste_go f6bd +chat_paste_go_2 f3cb +check e5ca +check_box e834 +check_box_outline_blank e835 +check_circle f0be +check_circle_filled f0be +check_circle_outline f0be +check_circle_unread f27e +check_in_out f6f6 +check_indeterminate_small f88a +check_small f88b +checkbook e70d +checked_bag eb0c +checked_bag_question eb0d +checklist e6b1 +checklist_rtl e6b3 +checkroom f19e +cheer f6a8 +chef_hat f357 +chess f5e7 +chess_bishop f261 +chess_bishop_2 f262 +chess_king f25f +chess_king_2 f260 +chess_knight f25e +chess_pawn f3b6 +chess_pawn_2 f25d +chess_queen f25c +chess_rook f25b +chevron_backward f46b +chevron_forward f46a +chevron_left e5cb +chevron_right e5cc +child_care eb41 +child_friendly eb42 +child_hat ef30 +chip_extraction f821 +chips e993 +chrome_reader_mode e86d +chromecast_2 f17b +chromecast_device e83c +chronic ebb2 +church eaae +cinematic_blur f853 +circle ef4a +circle_notifications e994 +circles e7ea +circles_ext e7ec +clarify f0bf +class e86e +clean_hands f21f +cleaning e995 +cleaning_bucket f8b4 +cleaning_services f0ff +clear e5cd +clear_all e0b8 +clear_day f157 +clear_night f159 +climate_mini_split f8b5 +clinical_notes e09e +clock_arrow_down f382 +clock_arrow_up f381 +clock_loader_10 f726 +clock_loader_20 f725 +clock_loader_40 f724 +clock_loader_60 f723 +clock_loader_80 f722 +clock_loader_90 f721 +close e5cd +close_fullscreen f1cf +close_small f508 +closed_caption e996 +closed_caption_add f4ae +closed_caption_disabled f1dc +closed_caption_off e996 +cloud f15c +cloud_alert f3cc +cloud_circle e2be +cloud_done e2bf +cloud_download e2c0 +cloud_lock f386 +cloud_off e2c1 +cloud_queue f15c +cloud_sync eb5a +cloud_upload e2c3 +cloudy f15c +cloudy_filled f15c +cloudy_snowing e810 +co2 e7b0 +co_present eaf0 +code e86f +code_blocks f84d +code_off e4f3 +coffee efef +coffee_maker eff0 +cognition e09f +cognition_2 f3b5 +collapse_all e944 +collapse_content f507 +collections e3d3 +collections_bookmark e431 +color_lens e40a +colorize e3b8 +colors e997 +combine_columns f420 +comedy_mask f4d6 +comic_bubble f5dd +comment e24c +comment_bank ea4e +comments_disabled e7a2 +commit eaf5 +communication e27c +communities eb16 +communities_filled eb16 +commute e940 +compare e3b9 +compare_arrows e915 +compass_calibration e57c +component_exchange f1e7 +compost e761 +compress e94d +computer e31e +computer_arrow_up f2f7 +computer_cancel f2f6 +concierge f561 +conditions e0a0 +confirmation_number e638 +congenital e0a1 +connect_without_contact f223 +connected_tv e998 +connecting_airports e7c9 +construction ea3c +contact_emergency f8d1 +contact_mail e0d0 +contact_page f22e +contact_phone f0c0 +contact_phone_filled f0c0 +contact_support e94c +contactless ea71 +contactless_off f858 +contacts e0ba +contacts_product e999 +content_copy e14d +content_cut e14e +content_paste e14f +content_paste_go ea8e +content_paste_off e4f8 +content_paste_search ea9b +contextual_token f486 +contextual_token_add f485 +contract f5a0 +contract_delete f5a2 +contract_edit f5a1 +contrast eb37 +contrast_circle f49f +contrast_rtl_off ec72 +contrast_square f4a0 +control_camera e074 +control_point e3ba +control_point_duplicate e3bb +controller_gen e83d +conversation ef2f +conversion_path f0c1 +conversion_path_off f7b4 +convert_to_text f41f +conveyor_belt f867 +cookie eaac +cookie_off f79a +cooking e2b6 +cool_to_dry e276 +copy_all e2ec +copyright e90c +coronavirus f221 +corporate_fare f1d0 +cottage e587 +counter_0 f785 +counter_1 f784 +counter_2 f783 +counter_3 f782 +counter_4 f781 +counter_5 f780 +counter_6 f77f +counter_7 f77e +counter_8 f77d +counter_9 f77c +countertops f1f7 +create f097 +create_new_folder e2cc +credit_card e8a1 +credit_card_clock f438 +credit_card_gear f52d +credit_card_heart f52c +credit_card_off e4f4 +credit_score eff1 +crib e588 +crisis_alert ebe9 +crop e3be +crop_16_9 e3bc +crop_3_2 e3bd +crop_5_4 e3bf +crop_7_5 e3c0 +crop_9_16 f549 +crop_din e3c6 +crop_free e3c2 +crop_landscape e3c3 +crop_original e3f4 +crop_portrait e3c5 +crop_rotate e437 +crop_square e3c6 +crossword f5e5 +crowdsource eb18 +crown ecb3 +cruelty_free e799 +css eb93 +csv e6cf +currency_bitcoin ebc5 +currency_exchange eb70 +currency_franc eafa +currency_lira eaef +currency_pound eaf1 +currency_ruble eaec +currency_rupee eaf7 +currency_rupee_circle f460 +currency_yen eafb +currency_yuan eaf9 +curtains ec1e +curtains_closed ec1d +custom_typography e732 +cut f08b +cycle f854 +cyclone ebd5 +dangerous e99a +dark_mode e51c +dashboard e871 +dashboard_2 f3ea +dashboard_customize e99b +data_alert f7f6 +data_array ead1 +data_check f7f2 +data_exploration e76f +data_info_alert f7f5 +data_loss_prevention e2dc +data_object ead3 +data_saver_off eff2 +data_saver_on eff3 +data_table e99c +data_thresholding eb9f +data_usage eff2 +database f20e +database_off f414 +database_search f38e +database_upload f3dc +dataset f8ee +dataset_linked f8ef +date_range e916 +deblur eb77 +deceased e0a5 +decimal_decrease f82d +decimal_increase f82c +deck ea42 +dehaze e3c7 +delete e92e +delete_forever e92b +delete_history f518 +delete_outline e92e +delete_sweep e16c +delivery_dining eb28 +delivery_truck_bolt f3a2 +delivery_truck_speed f3a1 +demography e489 +density_large eba9 +density_medium eb9e +density_small eba8 +dentistry e0a6 +departure_board e576 +deployed_code f720 +deployed_code_account f51b +deployed_code_alert f5f2 +deployed_code_history f5f3 +deployed_code_update f5f4 +dermatology e0a7 +description e873 +deselect ebb6 +design_services f10a +desk f8f4 +deskphone f7fa +desktop_access_disabled e99d +desktop_cloud f3db +desktop_cloud_stack f3be +desktop_landscape f45e +desktop_landscape_add f439 +desktop_mac e30b +desktop_portrait f45d +desktop_windows e30c +destruction f585 +details e3c8 +detection_and_zone e29f +detector e282 +detector_alarm e1f7 +detector_battery e204 +detector_co e2af +detector_offline e223 +detector_smoke e285 +detector_status e1e8 +developer_board e30d +developer_board_off e4ff +developer_guide e99e +developer_mode f2e2 +developer_mode_tv e874 +device_band f2f5 +device_hub e335 +device_reset e8b3 +device_thermostat e1ff +device_unknown f2e1 +devices e326 +devices_fold ebde +devices_fold_2 f406 +devices_off f7a5 +devices_other e337 +devices_wearables f6ab +dew_point f879 +diagnosis e0a8 +diagonal_line f41e +dialer_sip e0bb +dialogs e99f +dialpad e0bc +diamond ead5 +diamond_shine f2b2 +dictionary f539 +difference eb7d +digital_out_of_home f1de +digital_wellbeing ef86 +dine_heart f29c +dine_in f295 +dine_lamp f29b +dining eff4 +dinner_dining ea57 +directions e52e +directions_alt f880 +directions_alt_off f881 +directions_bike e52f +directions_boat eff5 +directions_boat_filled eff5 +directions_bus eff6 +directions_bus_filled eff6 +directions_car eff7 +directions_car_filled eff7 +directions_off f10f +directions_railway eff8 +directions_railway_2 f462 +directions_railway_filled eff8 +directions_run e566 +directions_subway effa +directions_subway_filled effa +directions_transit effa +directions_transit_filled effa +directions_walk e536 +directory_sync e394 +dirty_lens ef4b +disabled_by_default f230 +disabled_visible e76e +disc_full e610 +discover_tune e018 +dishwasher e9a0 +dishwasher_gen e832 +display_external_input f7e7 +display_settings eb97 +distance f6ea +diversity_1 f8d7 +diversity_2 f8d8 +diversity_3 f8d9 +diversity_4 f857 +dns e875 +do_disturb f08c +do_disturb_alt f08d +do_disturb_off f08e +do_disturb_on f08f +do_not_disturb f08d +do_not_disturb_alt f08c +do_not_disturb_off f08e +do_not_disturb_on f08f +do_not_disturb_on_total_silence effb +do_not_step f19f +do_not_touch f1b0 +dock f2e0 +dock_to_bottom f7e6 +dock_to_left f7e5 +dock_to_right f7e4 +docs ea7d +docs_add_on f0c2 +docs_apps_script f0c3 +document_scanner e5fa +document_search f385 +domain e7ee +domain_add eb62 +domain_disabled e0ef +domain_verification ef4c +domain_verification_off f7b0 +domino_mask f5e4 +done e876 +done_all e877 +done_outline e92f +donut_large e917 +donut_small e918 +door_back effc +door_front effd +door_open e77c +door_sensor e28a +door_sliding effe +doorbell efff +doorbell_3p e1e7 +doorbell_chime e1f3 +double_arrow ea50 +downhill_skiing e509 +download f090 +download_2 f523 +download_done f091 +download_for_offline f000 +downloading f001 +draft e66d +draft_orders e7b3 +drafts e151 +drag_click f71f +drag_handle e25d +drag_indicator e945 +drag_pan f71e +draw e746 +draw_abstract f7f8 +draw_collage f7f7 +drawing_recognition eb00 +dresser e210 +drive_eta eff7 +drive_export f41d +drive_file_move e9a1 +drive_file_move_outline e9a1 +drive_file_move_rtl e9a1 +drive_file_rename_outline e9a2 +drive_folder_upload e9a3 +drive_fusiontable e678 +drone f25a +drone_2 f259 +dropdown e9a4 +dropper_eye f351 +dry f1b3 +dry_cleaning ea58 +dual_screen f6cf +duo e9a5 +dvr e1b2 +dynamic_feed ea14 +dynamic_form f1bf +e911_avatar f11a +e911_emergency f119 +e_mobiledata f002 +e_mobiledata_badge f7e3 +ear_sound f356 +earbud_case f327 +earbud_left f326 +earbud_right f325 +earbuds f003 +earbuds_2 f324 +earbuds_battery f004 +early_on e2ba +earthquake f64f +east f1df +ecg f80f +ecg_heart f6e9 +eco ea35 +eda f6e8 +edgesensor_high f2ef +edgesensor_low f2ee +edit f097 +edit_arrow_down f380 +edit_arrow_up f37f +edit_attributes e578 +edit_audio f42d +edit_calendar e742 +edit_document f88c +edit_location e568 +edit_location_alt e1c5 +edit_note e745 +edit_notifications e525 +edit_off e950 +edit_road ef4d +edit_square f88d +editor_choice f528 +egg eacc +egg_alt eac8 +eject e8fb +elderly f21a +elderly_woman eb69 +electric_bike eb1b +electric_bolt ec1c +electric_car eb1c +electric_meter ec1b +electric_moped eb1d +electric_rickshaw eb1e +electric_scooter eb1f +electrical_services f102 +elevation f6e7 +elevator f1a0 +email e159 +emergency e1eb +emergency_heat f15d +emergency_heat_2 f4e5 +emergency_home e82a +emergency_recording ebf4 +emergency_share ebf6 +emergency_share_off f59e +emoji_emotions ea22 +emoji_events ea23 +emoji_flags f0c6 +emoji_food_beverage ea1b +emoji_language f4cd +emoji_nature ea1c +emoji_objects ea24 +emoji_people ea1d +emoji_symbols ea1e +emoji_transportation ea1f +emoticon e5f3 +empty_dashboard f844 +enable f188 +encrypted e593 +encrypted_add f429 +encrypted_add_circle f42a +encrypted_minus_circle f428 +encrypted_off f427 +endocrinology e0a9 +energy e9a6 +energy_program_saving f15f +energy_program_time_used f161 +energy_savings_leaf ec1a +engineering ea3d +enhanced_encryption e63f +ent e0aa +enterprise e70e +enterprise_off eb4d +equal f77b +equalizer e01d +eraser_size_1 f3fc +eraser_size_2 f3fb +eraser_size_3 f3fa +eraser_size_4 f3f9 +eraser_size_5 f3f8 +error f8b6 +error_circle_rounded f8b6 +error_med e49b +error_outline f8b6 +escalator f1a1 +escalator_warning f1ac +euro ea15 +euro_symbol e926 +ev_charger e56d +ev_mobiledata_badge f7e2 +ev_shadow ef8f +ev_shadow_add f580 +ev_shadow_minus f57f +ev_station e56d +event e878 +event_available e614 +event_busy e615 +event_list f683 +event_note e616 +event_repeat eb7b +event_seat e903 +event_upcoming f238 +exclamation f22f +exercise f6e6 +exit_to_app e879 +expand e94f +expand_all e946 +expand_circle_down e7cd +expand_circle_right f591 +expand_circle_up f5d2 +expand_content f830 +expand_less e5ce +expand_more e5cf +expansion_panels ef90 +expension_panels ef90 +experiment e686 +explicit e01e +explore e87a +explore_nearby e538 +explore_off e9a8 +explosion f685 +export_notes e0ac +exposure e3f6 +exposure_neg_1 e3cb +exposure_neg_2 e3cc +exposure_plus_1 e800 +exposure_plus_2 e3ce +exposure_zero e3cf +extension e87b +extension_off e4f5 +eye_tracking f4c9 +eyeglasses f6ee +eyeglasses_2 f2c7 +eyeglasses_2_sound f265 +face f008 +face_2 f8da +face_3 f8db +face_4 f8dc +face_5 f8dd +face_6 f8de +face_down f402 +face_left f401 +face_nod f400 +face_retouching_natural ef4e +face_retouching_off f007 +face_right f3ff +face_shake f3fe +face_unlock f008 +face_up f3fd +fact_check f0c5 +factory ebbc +falling f60d +familiar_face_and_zone e21c +family_group eef2 +family_history e0ad +family_home eb26 +family_link eb19 +family_restroom f1a2 +family_star f527 +fan_focus f334 +fan_indirect f333 +farsight_digital f559 +fast_forward e01f +fast_rewind e020 +fastfood e57a +faucet e278 +favorite e87e +favorite_border e87e +fax ead8 +feature_search e9a9 +featured_play_list e06d +featured_seasonal_and_gifts ef91 +featured_video e06e +feed f009 +feedback e87f +female e590 +femur f891 +femur_alt f892 +fence f1f6 +fertile f6e5 +festival ea68 +fiber_dvr e05d +fiber_manual_record e061 +fiber_new e05e +fiber_pin e06a +fiber_smart_record e062 +file_copy e173 +file_copy_off f4d8 +file_download f090 +file_download_done f091 +file_download_off e4fe +file_export f3b2 +file_json f3bb +file_map e2c5 +file_map_stack f3e2 +file_open eaf3 +file_png f3bc +file_present ea0e +file_save f17f +file_save_off e505 +file_upload f09b +file_upload_off f886 +files ea85 +filter e3d3 +filter_1 e3d0 +filter_2 e3d1 +filter_3 e3d2 +filter_4 e3d4 +filter_5 e3d5 +filter_6 e3d6 +filter_7 e3d7 +filter_8 e3d8 +filter_9 e3d9 +filter_9_plus e3da +filter_alt ef4f +filter_alt_off eb32 +filter_arrow_right f3d1 +filter_b_and_w e3db +filter_center_focus e3dc +filter_drama e3dd +filter_frames e3de +filter_hdr e3df +filter_list e152 +filter_list_alt e94e +filter_list_off eb57 +filter_none e3e0 +filter_retrolux e3e1 +filter_tilt_shift e3e2 +filter_vintage e3e3 +finance e6bf +finance_chip f84e +finance_mode ef92 +find_in_page e880 +find_replace e881 +fingerprint e90d +fingerprint_off f49d +fire_extinguisher f1d8 +fire_hydrant f1a3 +fire_truck f8f2 +fireplace ea43 +first_page e5dc +fit_page f77a +fit_page_height f397 +fit_page_width f396 +fit_screen ea10 +fit_width f779 +fitness_center eb43 +fitness_tracker f463 +fitness_trackers eef1 +flag f0c6 +flag_2 f40f +flag_check f3d8 +flag_circle eaf8 +flag_filled f0c6 +flaky ef50 +flare e3e4 +flash_auto e3e5 +flash_off e3e6 +flash_on e3e7 +flashlight_off f00a +flashlight_on f00b +flatware f00c +flex_direction f778 +flex_no_wrap f777 +flex_wrap f776 +flight e539 +flight_class e7cb +flight_land e904 +flight_takeoff e905 +flights_and_hotels e9ab +flightsmode ef93 +flip e3e8 +flip_camera_android ea37 +flip_camera_ios ea38 +flip_to_back e882 +flip_to_front e883 +float_landscape_2 f45c +float_portrait_2 f45b +flood ebe6 +floor f6e4 +floor_lamp e21e +flourescent f07d +flowchart f38d +flowsheet e0ae +fluid e483 +fluid_balance f80d +fluid_med f80c +fluorescent f07d +flutter f1dd +flutter_dash e00b +flyover f478 +fmd_bad f00e +fmd_good f1db +foggy e818 +folded_hands f5ed +folder e2c7 +folder_check f3d7 +folder_check_2 f3d6 +folder_code f3c8 +folder_copy ebbd +folder_data f586 +folder_delete eb34 +folder_eye f3d5 +folder_info f395 +folder_limited f4e4 +folder_managed f775 +folder_match f3d4 +folder_off eb83 +folder_open e2c8 +folder_shared e2c9 +folder_special e617 +folder_supervised f774 +folder_zip eb2c +follow_the_signs f222 +font_download e167 +font_download_off e4f9 +food_bank f1f2 +foot_bones f893 +footprint f87d +for_you e9ac +forest ea99 +fork_left eba0 +fork_right ebac +fork_spoon f3e4 +forklift f868 +format_align_center e234 +format_align_justify e235 +format_align_left e236 +format_align_right e237 +format_bold e238 +format_clear e239 +format_color_fill e23a +format_color_reset e23b +format_color_text e23c +format_h1 f85d +format_h2 f85e +format_h3 f85f +format_h4 f860 +format_h5 f861 +format_h6 f862 +format_image_left f863 +format_image_right f864 +format_indent_decrease e23d +format_indent_increase e23e +format_ink_highlighter f82b +format_italic e23f +format_letter_spacing f773 +format_letter_spacing_2 f618 +format_letter_spacing_standard f617 +format_letter_spacing_wide f616 +format_letter_spacing_wider f615 +format_line_spacing e240 +format_list_bulleted e241 +format_list_bulleted_add f849 +format_list_numbered e242 +format_list_numbered_rtl e267 +format_overline eb65 +format_paint e243 +format_paragraph f865 +format_quote e244 +format_quote_off f413 +format_shapes e25e +format_size e245 +format_strikethrough e246 +format_text_clip f82a +format_text_overflow f829 +format_text_wrap f828 +format_textdirection_l_to_r e247 +format_textdirection_r_to_l e248 +format_textdirection_vertical f4b8 +format_underlined e249 +format_underlined_squiggle f885 +forms_add_on f0c7 +forms_apps_script f0c8 +fort eaad +forum e8af +forward f57a +forward_10 e056 +forward_30 e057 +forward_5 e058 +forward_circle f6f5 +forward_media f6f4 +forward_to_inbox f187 +foundation f200 +fragrance f345 +frame_bug eeef +frame_exclamation eeee +frame_inspect f772 +frame_person f8a6 +frame_person_mic f4d5 +frame_person_off f7d1 +frame_reload f771 +frame_source f770 +free_breakfast eb44 +free_cancellation e748 +front_hand e769 +front_loader f869 +full_coverage eb12 +full_hd f58b +full_stacked_bar_chart f212 +fullscreen e5d0 +fullscreen_exit e5d1 +fullscreen_portrait f45a +function f866 +functions e24a +funicular f477 +g_mobiledata f010 +g_mobiledata_badge f7e1 +g_translate e927 +gallery_thumbnail f86f +gamepad e30f +games e30f +garage f011 +garage_check f28d +garage_door e714 +garage_home e82d +garage_money f28c +garden_cart f8a9 +gas_meter ec19 +gastroenterology e0f1 +gate e277 +gavel e90e +general_device e6de +generating_tokens e749 +genetics e0f3 +genres e6ee +gesture e155 +gesture_select f657 +get_app f090 +gif e908 +gif_2 f40e +gif_box e7a3 +girl eb68 +gite e58b +glass_cup f6e3 +globe e64c +globe_asia f799 +globe_book f3c9 +globe_location_pin f35d +globe_uk f798 +glucose e4a0 +glyphs f8a3 +go_to_line f71d +golf_course eb45 +gondola_lift f476 +google_home_devices e715 +google_plus_reshare f57a +google_tv_remote f5db +google_wifi f579 +gpp_bad f012 +gpp_good f013 +gpp_maybe f014 +gps_fixed e55c +gps_not_fixed e1b7 +gps_off e1b6 +grade f09a +gradient e3e9 +grading ea4f +grain e3ea +graph_1 f3a0 +graph_2 f39f +graph_3 f39e +graph_4 f39d +graph_5 f39c +graph_6 f39b +graph_7 f346 +graphic_eq e1b8 +grass f205 +grid_3x3 f015 +grid_3x3_off f67c +grid_4x4 f016 +grid_goldenratio f017 +grid_guides f76f +grid_off e3eb +grid_on e3ec +grid_view e9b0 +grocery ef97 +group ea21 +group_add e7f0 +group_off e747 +group_remove e7ad +group_search f3ce +group_work e886 +grouped_bar_chart f211 +groups f233 +groups_2 f8df +groups_3 f8e0 +guardian f4c1 +gynecology e0f4 +h_mobiledata f018 +h_mobiledata_badge f7e0 +h_plus_mobiledata f019 +h_plus_mobiledata_badge f7df +hail e9b1 +hallway e6f8 +hanami_dango f23f +hand_bones f894 +hand_gesture ef9c +hand_gesture_off f3f3 +hand_meal f294 +hand_package f293 +handheld_controller f4c6 +handshake ebcb +handwriting_recognition eb02 +handyman f10b +hangout_video e0c1 +hangout_video_off e0c2 +hard_disk f3da +hard_drive f80e +hard_drive_2 f7a4 +hardware ea59 +hd e052 +hdr_auto f01a +hdr_auto_select f01b +hdr_enhanced_select ef51 +hdr_off e3ed +hdr_off_select f01c +hdr_on e3ee +hdr_on_select f01d +hdr_plus f01e +hdr_plus_off e3ef +hdr_strong e3f1 +hdr_weak e3f2 +head_mounted_device f4c5 +headphones f01f +headphones_battery f020 +headset f01f +headset_mic e311 +headset_off e33a +healing e3f3 +health_and_beauty ef9d +health_and_safety e1d5 +health_cross f2c3 +health_metrics f6e2 +heap_snapshot_large f76e +heap_snapshot_multiple f76d +heap_snapshot_thumbnail f76c +hearing e023 +hearing_aid f464 +hearing_aid_disabled f3b0 +hearing_aid_disabled_left f2ec +hearing_aid_left f2ed +hearing_disabled f104 +heart_broken eac2 +heart_check f60a +heart_minus f883 +heart_plus f884 +heart_smile f292 +heat f537 +heat_pump ec18 +heat_pump_balance e27e +height ea16 +helicopter f60c +help e8fd +help_center f1c0 +help_clinic f810 +help_outline e8fd +hematology e0f6 +hevc f021 +hexagon eb39 +hide ef9e +hide_image f022 +hide_source f023 +high_chair f29a +high_density f79c +high_quality e024 +high_res f54b +highlight e25f +highlight_alt ef52 +highlight_keyboard_focus f510 +highlight_mouse_cursor f511 +highlight_off e888 +highlight_text_cursor f512 +highlighter_size_1 f76b +highlighter_size_2 f76a +highlighter_size_3 f769 +highlighter_size_4 f768 +highlighter_size_5 f767 +hiking e50a +history e8b3 +history_2 f3e6 +history_edu ea3e +history_off f4da +history_toggle_off f17d +hive eaa6 +hls eb8a +hls_off eb8c +holiday_village e58a +home e9b2 +home_and_garden ef9f +home_app_logo e295 +home_filled e9b2 +home_health e4b9 +home_improvement_and_tools efa0 +home_iot_device e283 +home_max f024 +home_max_dots e849 +home_mini f025 +home_pin f14d +home_repair_service f100 +home_speaker f11c +home_storage f86c +home_work f030 +horizontal_distribute e014 +horizontal_rule f108 +horizontal_split e947 +host f3d9 +hot_tub eb46 +hotel e549 +hotel_class e743 +hourglass ebff +hourglass_arrow_down f37e +hourglass_arrow_up f37d +hourglass_bottom ea5c +hourglass_disabled ef53 +hourglass_empty e88b +hourglass_full e88c +hourglass_pause f38c +hourglass_top ea5b +house ea44 +house_siding f202 +house_with_shield e786 +houseboat e584 +household_supplies efa1 +hov f475 +how_to_reg e174 +how_to_vote e175 +hr_resting f6ba +html eb7e +http e902 +https e899 +hub e9f4 +humerus f895 +humerus_alt f896 +humidity_high f163 +humidity_indoor f558 +humidity_low f164 +humidity_mid f165 +humidity_percentage f87e +hvac f10e +hvac_max_defrost f332 +ice_skating e50b +icecream ea69 +id_card f4ca +identity_aware_proxy e2dd +identity_platform ebb7 +ifl e025 +iframe f71b +iframe_off f71c +image e3f4 +image_arrow_up f317 +image_aspect_ratio e3f5 +image_inset f247 +image_not_supported f116 +image_search e43f +imagesearch_roller e9b4 +imagesmode efa2 +immunology e0fb +import_contacts e0e0 +import_export e8d5 +important_devices e912 +in_home_mode e833 +inactive_order e0fc +inbox e156 +inbox_customize f859 +inbox_text f399 +inbox_text_asterisk f360 +inbox_text_person f35e +inbox_text_share f35c +incomplete_circle e79b +indeterminate_check_box e909 +indeterminate_question_box f56d +info e88e +info_i f59b +infrared f87c +ink_eraser e6d0 +ink_eraser_off e7e3 +ink_highlighter e6d1 +ink_highlighter_move f524 +ink_marker e6d2 +ink_pen e6d3 +ink_selection ef52 +inpatient e0fe +input e890 +input_circle f71a +insert_chart f0cc +insert_chart_filled f0cc +insert_chart_outlined f0cc +insert_comment e24c +insert_drive_file e66d +insert_emoticon ea22 +insert_invitation e878 +insert_link e250 +insert_page_break eaca +insert_photo e3f4 +insert_text f827 +insights f092 +install_desktop eb71 +install_mobile f2cd +instant_mix e026 +integration_instructions ef54 +interactive_space f7ff +interests e7c8 +interpreter_mode e83b +inventory e179 +inventory_2 e1a1 +invert_colors e891 +invert_colors_off e0c4 +ios e027 +ios_share e6b8 +iron e583 +iso e3f6 +jamboard_kiosk e9b5 +japanese_curry f284 +japanese_flag f283 +javascript eb7c +join f84f +join_full f84f +join_inner eaf4 +join_left eaf2 +join_right eaea +joystick f5ee +jump_to_element f719 +kanji_alcohol f23e +kayaking e50c +kebab_dining e842 +keep f026 +keep_off e6f9 +keep_pin f026 +keep_public f56f +kettle e2b9 +key e73c +key_off eb84 +key_vertical f51a +key_visualizer f199 +keyboard e312 +keyboard_alt f028 +keyboard_arrow_down e313 +keyboard_arrow_left e314 +keyboard_arrow_right e315 +keyboard_arrow_up e316 +keyboard_backspace e317 +keyboard_capslock e318 +keyboard_capslock_badge f7de +keyboard_command_key eae7 +keyboard_control_key eae6 +keyboard_double_arrow_down ead0 +keyboard_double_arrow_left eac3 +keyboard_double_arrow_right eac9 +keyboard_double_arrow_up eacf +keyboard_external_input f7dd +keyboard_full f7dc +keyboard_hide e31a +keyboard_keys f67b +keyboard_lock f492 +keyboard_lock_off f491 +keyboard_off f67a +keyboard_onscreen f7db +keyboard_option_key eae8 +keyboard_previous_language f7da +keyboard_return e31b +keyboard_tab e31c +keyboard_tab_rtl ec73 +keyboard_voice e31d +kid_star f526 +king_bed ea45 +kitchen eb47 +kitesurfing e50d +lab_panel e103 +lab_profile e104 +lab_research f80b +label e893 +label_important e948 +label_important_outline e948 +label_off e9b6 +label_outline e893 +labs e105 +lan eb2f +landscape e564 +landscape_2 f4c4 +landscape_2_edit f310 +landscape_2_off f4c3 +landslide ebd7 +language e894 +language_chinese_array f766 +language_chinese_cangjie f765 +language_chinese_dayi f764 +language_chinese_pinyin f763 +language_chinese_quick f762 +language_chinese_wubi f761 +language_french f760 +language_gb_english f75f +language_international f75e +language_japanese_kana f513 +language_korean_latin f75d +language_pinyin f75c +language_spanish f5e9 +language_us f759 +language_us_colemak f75b +language_us_dvorak f75a +laps f6b9 +laptop e31e +laptop_car f3cd +laptop_chromebook e31f +laptop_mac e320 +laptop_windows e321 +lasso_select eb03 +last_page e5dd +launch e89e +laundry e2a8 +layers e53b +layers_clear e53c +lda e106 +leaderboard f20c +leak_add e3f8 +leak_remove e3f9 +left_click f718 +left_panel_close f717 +left_panel_open f716 +legend_toggle f11b +lens e3fa +lens_blur f029 +letter_switch f758 +library_add e03c +library_add_check e9b7 +library_books e02f +library_music e030 +license eb04 +lift_to_talk efa3 +light f02a +light_group e28b +light_mode e518 +light_off e9b8 +lightbulb e90f +lightbulb_2 f3e3 +lightbulb_circle ebfe +lightbulb_outline e90f +lightning_stand efa4 +line_axis ea9a +line_curve f757 +line_end f826 +line_end_arrow f81d +line_end_arrow_notch f81c +line_end_circle f81b +line_end_diamond f81a +line_end_square f819 +line_start f825 +line_start_arrow f818 +line_start_arrow_notch f817 +line_start_circle f816 +line_start_diamond f815 +line_start_square f814 +line_style e919 +line_weight e91a +linear_scale e260 +link e250 +link_off e16f +linked_camera e438 +linked_services f535 +liquor ea60 +list e896 +list_alt e0ee +list_alt_add f756 +list_alt_check f3de +lists e9b9 +live_help e0c6 +live_tv e63a +living f02b +local_activity e553 +local_airport e53d +local_atm e53e +local_bar e540 +local_cafe eb44 +local_car_wash e542 +local_convenience_store e543 +local_dining e561 +local_drink e544 +local_fire_department ef55 +local_florist e545 +local_gas_station e546 +local_grocery_store e8cc +local_hospital e548 +local_hotel e549 +local_laundry_service e54a +local_library e54b +local_mall e54c +local_movies e8da +local_offer f05b +local_parking e54f +local_pharmacy e550 +local_phone f0d4 +local_pizza e552 +local_play e553 +local_police ef56 +local_post_office e554 +local_printshop e8ad +local_see e557 +local_shipping e558 +local_taxi e559 +location_automation f14f +location_away f150 +location_chip f850 +location_city e7f1 +location_disabled e1b6 +location_home f152 +location_off e0c7 +location_on f1db +location_pin f1db +location_searching e1b7 +locator_tag f8c1 +lock e899 +lock_clock ef57 +lock_open e898 +lock_open_circle f361 +lock_open_right f656 +lock_outline e899 +lock_person f8f3 +lock_reset eade +login ea77 +logo_dev ead6 +logout e9ba +looks e3fc +looks_3 e3fb +looks_4 e3fd +looks_5 e3fe +looks_6 e3ff +looks_one e400 +looks_two e401 +loop e863 +loupe e402 +low_density f79b +low_priority e16d +lowercase f48a +loyalty e89a +lte_mobiledata f02c +lte_mobiledata_badge f7d9 +lte_plus_mobiledata f02d +lte_plus_mobiledata_badge f7d8 +luggage f235 +lunch_dining ea61 +lyrics ec0b +macro_auto f6f2 +macro_off f8d2 +magic_button f136 +magic_exchange f7f4 +magic_tether f7d7 +magnification_large f83d +magnification_small f83c +magnify_docked f7d6 +magnify_fullscreen f7d5 +mail e159 +mail_asterisk eef4 +mail_lock ec0a +mail_off f48b +mail_outline e159 +mail_shield f249 +male e58e +man e4eb +man_2 f8e1 +man_3 f8e2 +man_4 f8e3 +manage_accounts f02e +manage_history ebe7 +manage_search f02f +manga f5e3 +manufacturing e726 +map e55b +map_pin_heart f298 +map_pin_review f297 +map_search f3ca +maps_home_work f030 +maps_ugc ef58 +margin e9bb +mark_as_unread e9bc +mark_chat_read f18b +mark_chat_unread f189 +mark_email_read f18c +mark_email_unread f18a +mark_unread_chat_alt eb9d +markdown f552 +markdown_copy f553 +markdown_paste f554 +markunread e159 +markunread_mailbox e89b +masked_transitions e72e +masked_transitions_add f42b +masks f218 +massage f2c2 +match_case f6f1 +match_case_off f36f +match_word f6f0 +matter e907 +maximize e930 +meal_dinner f23d +meal_lunch f23c +measuring_tape f6af +media_bluetooth_off f031 +media_bluetooth_on f032 +media_link f83f +media_output f4f2 +media_output_off f4f3 +mediation efa7 +medical_information ebed +medical_mask f80a +medical_services f109 +medication f033 +medication_liquid ea87 +meeting_room eb4f +memory e322 +memory_alt f7a3 +menstrual_health f6e1 +menu e5d2 +menu_book ea19 +menu_book_2 f291 +menu_open e9bd +merge eb98 +merge_type e252 +message e0c9 +metabolism e10b +metro f474 +mfg_nest_yale_lock f11d +mic e31d +mic_alert f392 +mic_double f5d1 +mic_external_off ef59 +mic_external_on ef5a +mic_none e31d +mic_off e02b +microbiology e10c +microwave f204 +microwave_gen e847 +military_tech ea3f +mimo e9be +mimo_disconnect e9bf +mindfulness f6e0 +minimize e931 +minor_crash ebf1 +mintmark efa9 +missed_video_call f0ce +missed_video_call_filled f0ce +missing_controller e701 +mist e188 +mitre f547 +mixture_med e4c8 +mms e618 +mobile e7ba +mobile_2 f2db +mobile_3 f2da +mobile_alert f2d3 +mobile_arrow_down f2cd +mobile_arrow_right f2d2 +mobile_arrow_up_right f2b9 +mobile_block f2e5 +mobile_camera f44e +mobile_camera_front f2c9 +mobile_camera_rear f2c8 +mobile_cancel f2ea +mobile_cast f2cc +mobile_charge f2e3 +mobile_chat f79f +mobile_check f073 +mobile_code f2e2 +mobile_dots f2d0 +mobile_friendly f073 +mobile_gear f2d9 +mobile_hand f323 +mobile_hand_left f313 +mobile_hand_left_off f312 +mobile_hand_off f314 +mobile_info f2dc +mobile_landscape ed3e +mobile_layout f2bf +mobile_lock_landscape f2d8 +mobile_lock_portrait f2be +mobile_loupe f322 +mobile_menu f2d1 +mobile_off e201 +mobile_question f2e1 +mobile_rotate f2d5 +mobile_rotate_lock f2d6 +mobile_screen_share f2df +mobile_screensaver f321 +mobile_sensor_hi f2ef +mobile_sensor_lo f2ee +mobile_share f2df +mobile_share_stack f2de +mobile_sound f2e8 +mobile_sound_2 f318 +mobile_sound_off f7aa +mobile_speaker f320 +mobile_text f2eb +mobile_text_2 f2e6 +mobile_theft f2a9 +mobile_ticket f2e4 +mobile_vibrate f2cb +mobile_wrench f2b0 +mobiledata_off f034 +mode f097 +mode_comment e253 +mode_cool f166 +mode_cool_off f167 +mode_dual f557 +mode_edit f097 +mode_edit_outline f097 +mode_fan f168 +mode_fan_off ec17 +mode_heat f16a +mode_heat_cool f16b +mode_heat_off f16d +mode_night f036 +mode_of_travel e7ce +mode_off_on f16f +mode_standby f037 +model_training f0cf +modeling f3aa +monetization_on e263 +money e57d +money_bag f3ee +money_off f038 +money_off_csred f038 +money_range f245 +monitor ef5b +monitor_heart eaa2 +monitor_weight f039 +monitor_weight_gain f6df +monitor_weight_loss f6de +monitoring f190 +monochrome_photos e403 +monorail f473 +mood ea22 +mood_bad e7f3 +moon_stars f34f +mop e28d +moped eb28 +moped_package f28b +more e619 +more_down f196 +more_horiz e5d3 +more_time ea5d +more_up f197 +more_vert e5d4 +mosque eab2 +motion_blur f0d0 +motion_mode f842 +motion_photos_auto f03a +motion_photos_off e9c0 +motion_photos_on e9c1 +motion_photos_pause f227 +motion_photos_paused f227 +motion_play f40b +motion_sensor_active e792 +motion_sensor_alert e784 +motion_sensor_idle e783 +motion_sensor_urgent e78e +motorcycle e91b +mountain_flag f5e2 +mountain_steam f282 +mouse e323 +mouse_lock f490 +mouse_lock_off f48f +move e740 +move_down eb61 +move_group f715 +move_item f1ff +move_location e741 +move_selection_down f714 +move_selection_left f713 +move_selection_right f712 +move_selection_up f711 +move_to_inbox e168 +move_up eb64 +moved_location e594 +movie e404 +movie_creation e404 +movie_edit f840 +movie_filter e43a +movie_info e02d +movie_off f499 +movie_speaker f2a3 +moving e501 +moving_beds e73d +moving_ministry e73e +mp e9c3 +multicooker e293 +multiline_chart e6df +multimodal_hand_eye f41b +multiple_airports efab +multiple_stop f1b9 +museum ea36 +music_cast eb1a +music_history f2c1 +music_note e405 +music_note_add f391 +music_off e440 +music_video e063 +my_location e55c +mystery f5e1 +nat ef5c +nature e406 +nature_people e407 +navigate_before e5cb +navigate_next e5cc +navigation e55d +near_me e569 +near_me_disabled f1ef +nearby e6b7 +nearby_error f03b +nearby_off f03c +nephrology e10d +nest_audio ebbf +nest_cam_floodlight f8b7 +nest_cam_indoor f11e +nest_cam_iq f11f +nest_cam_iq_outdoor f120 +nest_cam_magnet_mount f8b8 +nest_cam_outdoor f121 +nest_cam_stand f8b9 +nest_cam_wall_mount f8ba +nest_cam_wired_stand ec16 +nest_clock_farsight_analog f8bb +nest_clock_farsight_digital f8bc +nest_connect f122 +nest_detect f123 +nest_display f124 +nest_display_max f125 +nest_doorbell_visitor f8bd +nest_eco_leaf f8be +nest_farsight_cool f27d +nest_farsight_dual f27c +nest_farsight_eco f27b +nest_farsight_heat f27a +nest_farsight_seasonal f279 +nest_farsight_weather f8bf +nest_found_savings f8c0 +nest_gale_wifi f579 +nest_heat_link_e f126 +nest_heat_link_gen_3 f127 +nest_hello_doorbell e82c +nest_locator_tag f8c1 +nest_mini e789 +nest_multi_room f8c2 +nest_protect e68e +nest_remote f5db +nest_remote_comfort_sensor f12a +nest_secure_alarm f12b +nest_sunblock f8c3 +nest_tag f8c1 +nest_thermostat e68f +nest_thermostat_e_eu f12d +nest_thermostat_gen_3 f12e +nest_thermostat_sensor f12f +nest_thermostat_sensor_eu f130 +nest_thermostat_zirconium_eu f131 +nest_true_radiant f8c4 +nest_wake_on_approach f8c5 +nest_wake_on_press f8c6 +nest_wifi_gale f132 +nest_wifi_mistral f133 +nest_wifi_point f134 +nest_wifi_point_vento f134 +nest_wifi_pro f56b +nest_wifi_pro_2 f56a +nest_wifi_router f133 +network_cell e1b9 +network_check e640 +network_intel_node f371 +network_intelligence efac +network_intelligence_history f5f6 +network_intelligence_update f5f5 +network_locked e61a +network_manage f7ab +network_node f56e +network_ping ebca +network_wifi e1ba +network_wifi_1_bar ebe4 +network_wifi_1_bar_locked f58f +network_wifi_2_bar ebd6 +network_wifi_2_bar_locked f58e +network_wifi_3_bar ebe1 +network_wifi_3_bar_locked f58d +network_wifi_locked f532 +neurology e10e +new_label e609 +new_releases ef76 +new_window f710 +news e032 +newsmode efad +newspaper eb81 +newsstand e9c4 +next_plan ef5d +next_week e16a +nfc e1bb +nfc_off f369 +night_shelter f1f1 +night_sight_auto f1d7 +night_sight_auto_off f1f9 +night_sight_max f6c3 +nightlife ea62 +nightlight f03d +nightlight_round f03d +nights_stay f174 +no_accounts f03e +no_adult_content f8fe +no_backpack f237 +no_crash ebf0 +no_drinks f1a5 +no_encryption f03f +no_encryption_gmailerrorred f03f +no_flash f1a6 +no_food f1a7 +no_luggage f23b +no_meals f1d6 +no_meeting_room eb4e +no_photography f1a8 +no_sim e1ce +no_sound e710 +no_stroller f1af +no_transfer f1d5 +noise_aware ebec +noise_control_off ebf3 +noise_control_on f8a8 +nordic_walking e50e +north f1e0 +north_east f1e1 +north_west f1e2 +not_accessible f0fe +not_accessible_forward f54a +not_interested f08c +not_listed_location e575 +not_started f0d1 +note e66d +note_add e89c +note_alt f040 +note_stack f562 +note_stack_add f563 +notes e26c +notification_add e399 +notification_important e004 +notification_multiple e6c2 +notification_settings f367 +notification_sound f353 +notifications e7f5 +notifications_active e7f7 +notifications_none e7f5 +notifications_off e7f6 +notifications_paused e7f8 +notifications_unread f4fe +numbers eac7 +nutrition e110 +ods e6e8 +odt e6e9 +offline_bolt e932 +offline_pin e90a +offline_pin_off f4d0 +offline_share f2de +oil_barrel ec15 +okonomiyaki f281 +on_device_training ebfd +on_hub_device e6c3 +oncology e114 +ondemand_video e63a +online_prediction f0eb +onsen f6f8 +opacity e91c +open_in_browser e89d +open_in_full f1ce +open_in_new e89e +open_in_new_down f70f +open_in_new_off e4f6 +open_in_phone f2d2 +open_jam efae +open_run f4b7 +open_with e89f +ophthalmology e115 +oral_disease e116 +orbit f426 +order_approve f812 +order_play f811 +orders eb14 +orthopedics f897 +other_admission e47b +other_houses e58c +outbound e1ca +outbox ef5f +outbox_alt eb17 +outdoor_garden e205 +outdoor_grill ea47 +outgoing_mail f0d2 +outlet f1d4 +outlined_flag f0c6 +outpatient e118 +outpatient_med e119 +output ebbe +output_circle f70e +oven e9c7 +oven_gen e843 +overview e4a7 +overview_key f7d4 +owl f3b4 +oxygen_saturation e4de +p2p f52a +pace f6b8 +pacemaker e656 +package e48f +package_2 f569 +padding e9c8 +padel f2a7 +page_control e731 +page_footer f383 +page_header f384 +page_info f614 +page_menu_ios eefb +pageless f509 +pages e7f9 +pageview e8a0 +paid f041 +palette e40a +pallet f86a +pan_tool e925 +pan_tool_alt ebb9 +pan_zoom f655 +panorama e40b +panorama_fish_eye e40c +panorama_horizontal e40d +panorama_photosphere e9c9 +panorama_vertical e40e +panorama_wide_angle e40f +paragliding e50f +parent_child_dining f22d +park ea63 +parking_meter f28a +parking_sign f289 +parking_valet f288 +partly_cloudy_day f172 +partly_cloudy_night f174 +partner_exchange f7f9 +partner_heart ef2e +partner_reports efaf +party_mode e7fa +passkey f87f +password f042 +password_2 f4a9 +password_2_off f4a8 +patient_list e653 +pattern f043 +pause e034 +pause_circle e1a2 +pause_circle_filled e1a2 +pause_circle_outline e1a2 +pause_presentation e0ea +payment e8a1 +payment_arrow_down f2c0 +payment_card f2a1 +payments ef63 +pedal_bike eb29 +pediatrics e11d +pen_size_1 f755 +pen_size_2 f754 +pen_size_3 f753 +pen_size_4 f752 +pen_size_5 f751 +pending ef64 +pending_actions f1bb +pentagon eb50 +people ea21 +people_alt ea21 +people_outline ea21 +percent eb58 +percent_discount f244 +performance_max e51a +pergola e203 +perm_camera_mic e8a2 +perm_contact_calendar e8a3 +perm_data_setting e8a4 +perm_device_information f2dc +perm_identity f0d3 +perm_media e8a7 +perm_phone_msg e8a8 +perm_scan_wifi e8a9 +person f0d3 +person_2 f8e4 +person_3 f8e5 +person_4 f8e6 +person_add ea4d +person_add_alt ea4d +person_add_disabled e9cb +person_alert f567 +person_apron f5a3 +person_book f5e8 +person_cancel f566 +person_celebrate f7fe +person_check f565 +person_edit f4fa +person_filled f0d3 +person_heart f290 +person_off e510 +person_outline f0d3 +person_pin e55a +person_pin_circle e56a +person_play f7fd +person_raised_hand f59a +person_remove ef66 +person_search f106 +person_shield e384 +personal_bag eb0e +personal_bag_off eb0f +personal_bag_question eb10 +personal_injury e6da +personal_places e703 +personal_video e63b +pest_control f0fa +pest_control_rodent f0fd +pet_supplies efb1 +pets e91d +phishing ead7 +phone f0d4 +phone_alt f0d4 +phone_android f2db +phone_bluetooth_speaker e61b +phone_callback e649 +phone_disabled e9cc +phone_enabled e9cd +phone_forwarded e61c +phone_in_talk e61d +phone_iphone f2da +phone_locked e61e +phone_missed e61f +phone_paused e620 +phonelink e326 +phonelink_erase f2ea +phonelink_lock f2be +phonelink_off f7a5 +phonelink_ring f2e8 +phonelink_ring_off f7aa +phonelink_setup f2d9 +photo e432 +photo_album e411 +photo_auto_merge f530 +photo_camera e412 +photo_camera_back ef68 +photo_camera_front ef69 +photo_filter e43b +photo_frame f0d9 +photo_library e413 +photo_prints efb2 +photo_size_select_actual e432 +photo_size_select_large e433 +photo_size_select_small e434 +php eb8f +physical_therapy e11e +piano e521 +piano_off e520 +pickleball f2a6 +picture_as_pdf e415 +picture_in_picture e8aa +picture_in_picture_alt e911 +picture_in_picture_center f550 +picture_in_picture_large f54f +picture_in_picture_medium f54e +picture_in_picture_mobile f517 +picture_in_picture_off f52f +picture_in_picture_small f54d +pie_chart f0da +pie_chart_filled f0da +pie_chart_outline f0da +pie_chart_outlined f0da +pill e11f +pill_off f809 +pin f045 +pin_drop e55e +pin_end e767 +pin_invoke e763 +pinboard f3ab +pinboard_unread f3ac +pinch eb38 +pinch_zoom_in f1fa +pinch_zoom_out f1fb +pip f64d +pip_exit f70d +pivot_table_chart e9ce +place f1db +place_item f1f0 +plagiarism ea5a +plane_contrails f2ac +planet f387 +planner_banner_ad_pt e692 +planner_review e694 +play_arrow e037 +play_circle e1c4 +play_disabled ef6a +play_for_work e906 +play_lesson f047 +play_music e6ee +play_pause f137 +play_shapes f7fc +playground f28e +playground_2 f28f +playing_cards f5dc +playlist_add e03b +playlist_add_check e065 +playlist_add_check_circle e7e6 +playlist_add_circle e7e5 +playlist_play e05f +playlist_remove eb80 +plug_connect f35a +plumbing f107 +plus_one e800 +podcasts f048 +podiatry e120 +podium f7fb +point_of_sale f17e +point_scan f70c +poker_chip f49b +policy ea17 +policy_alert f407 +poll f0cc +polyline ebbb +polymer e8ab +pool eb48 +portable_wifi_off f087 +portrait e851 +position_bottom_left f70b +position_bottom_right f70a +position_top_right f709 +post e705 +post_add ea20 +potted_plant f8aa +power e63c +power_input e336 +power_off e646 +power_rounded f8c7 +power_settings_circle f418 +power_settings_new f8c7 +prayer_times f838 +precision_manufacturing f049 +pregnancy f5f1 +pregnant_woman f5f1 +preliminary e7d8 +prescriptions e121 +present_to_all e0df +preview f1c5 +preview_off f7af +price_change f04a +price_check f04b +print e8ad +print_add f7a2 +print_connect f7a1 +print_disabled e9cf +print_error f7a0 +print_lock f651 +priority e19f +priority_high e645 +privacy f148 +privacy_tip f0dc +private_connectivity e744 +problem e122 +procedure e651 +process_chart f855 +production_quantity_limits e1d1 +productivity e296 +progress_activity e9d0 +prompt_suggestion f4f6 +propane ec14 +propane_tank ec13 +psychiatry e123 +psychology ea4a +psychology_alt f8ea +public e80b +public_off f1ca +publish e255 +published_with_changes f232 +pulmonology e124 +pulse_alert f501 +punch_clock eaa8 +push_pin f10d +qr_code ef6b +qr_code_2 e00a +qr_code_2_add f658 +qr_code_scanner f206 +query_builder efd6 +query_stats e4fc +question_answer e8af +question_exchange f7f3 +question_mark eb8b +queue e03c +queue_music e03d +queue_play_next e066 +quick_phrases e7d1 +quick_reference e46e +quick_reference_all f801 +quick_reorder eb15 +quickreply ef6c +quiet_time f159 +quiet_time_active eb76 +quiz f04c +r_mobiledata f04d +radar f04e +radio e03e +radio_button_checked e837 +radio_button_partial f560 +radio_button_unchecked e836 +radiology e125 +railway_alert e9d1 +railway_alert_2 f461 +rainy f176 +rainy_heavy f61f +rainy_light f61e +rainy_snow f61d +ramen_dining ea64 +ramp_left eb9c +ramp_right eb96 +range_hood e1ea +rate_review e560 +rate_review_rtl e706 +raven f555 +raw_off f04f +raw_on f050 +read_more ef6d +readiness_score f6dd +real_estate_agent e73a +rear_camera f6c2 +rebase f845 +rebase_edit f846 +receipt e8b0 +receipt_long ef6e +receipt_long_off f40a +recent_actors e03f +recent_patient f808 +recenter f4c0 +recommend e9d2 +record_voice_over e91f +rectangle eb54 +recycling e760 +redeem e8f6 +redo e15a +reduce_capacity f21c +refresh e5d5 +regular_expression f750 +relax f6dc +release_alert f654 +remember_me f051 +reminder e6c6 +reminders_alt e6c6 +remote_gen e83e +remove e15b +remove_circle f08f +remove_circle_outline f08f +remove_done e9d3 +remove_from_queue e067 +remove_moderator e9d4 +remove_red_eye e8f4 +remove_road ebfc +remove_selection e9d5 +remove_shopping_cart e928 +reopen_window f708 +reorder e8fe +repartition f8e8 +repeat e040 +repeat_on e9d6 +repeat_one e041 +repeat_one_on e9d7 +replace_audio f451 +replace_image f450 +replace_video f44f +replay e042 +replay_10 e059 +replay_30 e05a +replay_5 e05b +replay_circle_filled e9d8 +reply e15e +reply_all e15f +report f052 +report_gmailerrorred f052 +report_off e170 +report_problem f083 +request_page f22c +request_quote f1b6 +reset_brightness f482 +reset_exposure f266 +reset_focus f481 +reset_image f824 +reset_iso f480 +reset_settings f47f +reset_shadow f47e +reset_shutter_speed f47d +reset_tv e9d9 +reset_white_balance f47c +reset_wrench f56c +resize f707 +respiratory_rate e127 +responsive_layout e9da +rest_area f22a +restart_alt f053 +restaurant e56c +restaurant_menu e561 +restore e8b3 +restore_from_trash e938 +restore_page e929 +resume f7d0 +reviews f07c +rewarded_ads efb6 +rheumatology e128 +rib_cage f898 +rice_bowl f1f5 +right_click f706 +right_panel_close f705 +right_panel_open f704 +ring_volume f0dd +ring_volume_filled f0dd +ripples e9db +road f472 +robot f882 +robot_2 f5d0 +rocket eba5 +rocket_launch eb9b +roller_shades ec12 +roller_shades_closed ec11 +roller_skating ebcd +roofing f201 +room f1db +room_preferences f1b8 +room_service eb49 +rotate_90_degrees_ccw e418 +rotate_90_degrees_cw eaab +rotate_auto f417 +rotate_left e419 +rotate_right e41a +roundabout_left eb99 +roundabout_right eba3 +rounded_corner e920 +route eacd +router e328 +router_off f2f4 +routine e20c +rowing e921 +rss_feed e0e5 +rsvp f055 +rtt e9ad +rubric eb27 +rule f1c2 +rule_folder f1c9 +rule_settings f64c +run_circle ef6f +running_with_errors e51d +rv_hookup e642 +safety_check ebef +safety_check_off f59d +safety_divider e1cc +sailing e502 +salinity f876 +sanitizer f21d +satellite e562 +satellite_alt eb3a +sauna f6f7 +save e161 +save_alt f090 +save_as eb60 +save_clock f398 +saved_search ea11 +savings e2eb +scale eb5f +scan f74e +scan_delete f74f +scanner e329 +scatter_plot e268 +scene e2a7 +schedule efd6 +schedule_send ea0a +schema e4fd +school e80c +science ea4b +science_off f542 +scooter f471 +score e269 +scoreboard ebd0 +screen_lock_landscape f2d8 +screen_lock_portrait f2be +screen_lock_rotation f2d6 +screen_record f679 +screen_rotation f2d5 +screen_rotation_alt ebee +screen_rotation_up f678 +screen_search_desktop ef70 +screen_share e0e2 +screenshot f056 +screenshot_frame f677 +screenshot_frame_2 f374 +screenshot_keyboard f7d3 +screenshot_monitor ec08 +screenshot_region f7d2 +screenshot_tablet f697 +script f45f +scrollable_header e9dc +scuba_diving ebce +sd e9dd +sd_card e623 +sd_card_alert f057 +sd_storage e623 +sdk e720 +search e8b6 +search_activity f3e5 +search_check f800 +search_check_2 f469 +search_gear eefa +search_hands_free e696 +search_insights f4bc +search_off ea76 +seat_cool_left f331 +seat_cool_right f330 +seat_heat_left f32f +seat_heat_right f32e +seat_vent_left f32d +seat_vent_right f32c +security e32a +security_key f503 +security_update f2cd +security_update_good f073 +security_update_warning f2d3 +segment e94b +select f74d +select_all e162 +select_check_box f1fe +select_to_speak f7cf +select_window e6fa +select_window_2 f4c8 +select_window_off e506 +self_care f86d +self_improvement ea78 +sell f05b +send e163 +send_and_archive ea0c +send_money e8b7 +send_time_extension eadb +send_to_mobile f2d2 +sensor_door f1b5 +sensor_occupied ec10 +sensor_window f1b4 +sensors e51e +sensors_krx f556 +sensors_krx_off f515 +sensors_off e51f +sentiment_calm f6a7 +sentiment_content f6a6 +sentiment_dissatisfied e811 +sentiment_excited f6a5 +sentiment_extremely_dissatisfied f194 +sentiment_frustrated f6a4 +sentiment_neutral e812 +sentiment_sad f6a3 +sentiment_satisfied e813 +sentiment_satisfied_alt e813 +sentiment_stressed f6a2 +sentiment_very_dissatisfied e814 +sentiment_very_satisfied e815 +sentiment_worried f6a1 +serif f4ac +server_person f3bd +service_toolbox e717 +set_meal f1ea +settings e8b8 +settings_accessibility f05d +settings_account_box f835 +settings_alert f143 +settings_applications e8b9 +settings_b_roll f625 +settings_backup_restore e8ba +settings_bluetooth e8bb +settings_brightness e8bd +settings_cell f2d1 +settings_cinematic_blur f624 +settings_ethernet e8be +settings_heart f522 +settings_input_antenna e8bf +settings_input_component e8c1 +settings_input_composite e8c1 +settings_input_hdmi e8c2 +settings_input_svideo e8c3 +settings_motion_mode f833 +settings_night_sight f832 +settings_overscan e8c4 +settings_panorama f831 +settings_phone e8c5 +settings_photo_camera f834 +settings_power e8c6 +settings_remote e8c7 +settings_seating ef2d +settings_slow_motion f623 +settings_suggest f05e +settings_system_daydream e1c3 +settings_timelapse f622 +settings_video_camera f621 +settings_voice e8c8 +settop_component e2ac +severe_cold ebd3 +shadow e9df +shadow_add f584 +shadow_minus f583 +shape_line f8d3 +shape_recognition eb01 +shapes e602 +share e80d +share_eta e5f7 +share_location f05f +share_off f6cb +share_reviews f8a4 +share_windows f613 +shaved_ice f225 +sheets_rtl f823 +shelf_auto_hide f703 +shelf_position f702 +shelves f86e +shield e9e0 +shield_lock f686 +shield_locked f592 +shield_moon eaa9 +shield_person f650 +shield_question f529 +shield_toggle f2ad +shield_watch f30f +shield_with_heart e78f +shield_with_house e78d +shift e5f2 +shift_lock f7ae +shift_lock_off f483 +shop e8c9 +shop_2 e8ca +shop_two e8ca +shopping_bag f1cc +shopping_bag_speed f39a +shopping_basket e8cb +shopping_cart e8cc +shopping_cart_checkout eb88 +shopping_cart_off f4f7 +shoppingmode efb7 +short_stay e4d0 +short_text e261 +shortcut f57a +show_chart e6e1 +shower f061 +shuffle e043 +shuffle_on e9e1 +shutter_speed e43d +shutter_speed_add f57e +shutter_speed_minus f57d +sick f220 +side_navigation e9e2 +sign_language ebe5 +sign_language_2 f258 +signal_cellular_0_bar f0a8 +signal_cellular_1_bar f0a9 +signal_cellular_2_bar f0aa +signal_cellular_3_bar f0ab +signal_cellular_4_bar e1c8 +signal_cellular_add f7a9 +signal_cellular_alt e202 +signal_cellular_alt_1_bar ebdf +signal_cellular_alt_2_bar ebe3 +signal_cellular_connected_no_internet_0_bar f0ac +signal_cellular_connected_no_internet_4_bar e1cd +signal_cellular_no_sim e1ce +signal_cellular_nodata f062 +signal_cellular_null e1cf +signal_cellular_off e1d0 +signal_cellular_pause f5a7 +signal_disconnected f239 +signal_wifi_0_bar f0b0 +signal_wifi_4_bar f065 +signal_wifi_4_bar_lock e1e1 +signal_wifi_bad f064 +signal_wifi_connected_no_internet_4 f064 +signal_wifi_off e1da +signal_wifi_statusbar_4_bar f065 +signal_wifi_statusbar_not_connected f0ef +signal_wifi_statusbar_null f067 +signature f74c +signpost eb91 +sim_card e32b +sim_card_alert f057 +sim_card_download f068 +simulation f3e1 +single_bed ea48 +sip f069 +siren f3a7 +siren_check f3a6 +siren_open f3a5 +siren_question f3a4 +skateboarding e511 +skeleton f899 +skillet f543 +skillet_cooktop f544 +skip_next e044 +skip_previous e045 +skull f89a +skull_list f370 +slab_serif f4ab +sledding e512 +sleep e213 +sleep_score f6b7 +slide_library f822 +sliders e9e3 +slideshow e41b +slow_motion_video e068 +smart_button f1c1 +smart_card_reader f4a5 +smart_card_reader_off f4a6 +smart_display f06a +smart_outlet e844 +smart_screen f2d0 +smart_toy f06c +smartphone e7ba +smartphone_camera f44e +smb_share f74b +smoke_free eb4a +smoking_rooms eb4b +sms e625 +sms_failed e87f +snippet_folder f1c7 +snooze e046 +snowboarding e513 +snowing e80f +snowing_heavy f61c +snowmobile e503 +snowshoeing e514 +soap f1b2 +soba ef36 +social_distance e1cb +social_leaderboard f6a0 +solar_power ec0f +solo_dining ef35 +sort e164 +sort_by_alpha e053 +sos ebf7 +sound_detection_dog_barking f149 +sound_detection_glass_break f14a +sound_detection_loud_sound f14b +sound_sampler f6b4 +soup_kitchen e7d3 +source f1c8 +source_environment e527 +source_notes e12d +south f1e3 +south_america e7e4 +south_east f1e4 +south_west f1e5 +spa eb4c +space_bar e256 +space_dashboard e66b +spatial_audio ebeb +spatial_audio_off ebe8 +spatial_speaker f4cf +spatial_tracking ebea +speaker e32d +speaker_group e32e +speaker_notes e8cd +speaker_notes_off e92a +speaker_phone e0d2 +special_character f74a +specific_gravity f872 +speech_to_text f8a7 +speed e9e4 +speed_0_25 f4d4 +speed_0_2x f498 +speed_0_5 f4e2 +speed_0_5x f497 +speed_0_75 f4d3 +speed_0_7x f496 +speed_1_2 f4e1 +speed_1_25 f4d2 +speed_1_2x f495 +speed_1_5 f4e0 +speed_1_5x f494 +speed_1_75 f4d1 +speed_1_7x f493 +speed_2x f4eb +speed_camera f470 +spellcheck e8ce +split_scene f3bf +split_scene_down f2ff +split_scene_left f2fe +split_scene_right f2fd +split_scene_up f2fc +splitscreen f06d +splitscreen_add f4fd +splitscreen_bottom f676 +splitscreen_landscape f459 +splitscreen_left f675 +splitscreen_portrait f458 +splitscreen_right f674 +splitscreen_top f673 +splitscreen_vertical_add f4fc +spo2 f6db +spoke e9a7 +sports ea30 +sports_and_outdoors efb8 +sports_bar f1f3 +sports_baseball ea51 +sports_basketball ea26 +sports_cricket ea27 +sports_esports ea28 +sports_football ea29 +sports_golf ea2a +sports_gymnastics ebc4 +sports_handball ea33 +sports_hockey ea2b +sports_kabaddi ea34 +sports_martial_arts eae9 +sports_mma ea2c +sports_motorsports ea2d +sports_rugby ea2e +sports_score f06e +sports_soccer ea2f +sports_tennis ea32 +sports_volleyball ea31 +sprinkler e29a +sprint f81f +square eb36 +square_dot f3b3 +square_foot ea49 +ssid_chart eb66 +stack f609 +stack_group f359 +stack_hexagon f41c +stack_off f608 +stack_star f607 +stacked_bar_chart e9e6 +stacked_email e6c7 +stacked_inbox e6c9 +stacked_line_chart f22b +stacks f500 +stadia_controller f135 +stadium eb90 +stairs f1a9 +stairs_2 f46c +star f09a +star_border f09a +star_border_purple500 f09a +star_half e839 +star_outline f09a +star_purple500 f09a +star_rate f0ec +star_rate_half ec45 +star_shine f31d +stars e8d0 +stars_2 f31c +start e089 +stat_0 e697 +stat_1 e698 +stat_2 e699 +stat_3 e69a +stat_minus_1 e69b +stat_minus_2 e69c +stat_minus_3 e69d +stay_current_landscape ed3e +stay_current_portrait e7ba +stay_primary_landscape ed3e +stay_primary_portrait f2d3 +steering_wheel_heat f32b +step f6fe +step_into f701 +step_out f700 +step_over f6ff +steppers e9e7 +steps f6da +stethoscope f805 +stethoscope_arrow f807 +stethoscope_check f806 +sticky_note e9e8 +sticky_note_2 f1fc +stock_media f570 +stockpot f545 +stop e047 +stop_circle ef71 +stop_screen_share e0e3 +storage e1db +store e8d1 +store_mall_directory e8d1 +storefront ea12 +storm f070 +straight eb95 +straighten e41c +strategy f5df +stream e9e9 +stream_apps f79f +streetview e56e +stress_management f6d9 +strikethrough_s e257 +stroke_full f749 +stroke_partial f748 +stroller f1ae +style e41d +styler e273 +stylus f604 +stylus_brush f366 +stylus_fountain_pen f365 +stylus_highlighter f364 +stylus_laser_pointer f747 +stylus_note f603 +stylus_pen f363 +stylus_pencil f362 +subdirectory_arrow_left e5d9 +subdirectory_arrow_right e5da +subheader e9ea +subject e8d2 +subscript f111 +subscriptions e064 +subtitles e048 +subtitles_gear f355 +subtitles_off ef72 +subway e56f +subway_walk f287 +summarize f071 +sunny e81a +sunny_snowing e819 +superscript f112 +supervised_user_circle e939 +supervised_user_circle_off f60e +supervisor_account e8d3 +support ef73 +support_agent f0e2 +surfing e515 +surgical e131 +surround_sound e049 +swap_calls e0d7 +swap_driving_apps e69e +swap_driving_apps_wheel e69f +swap_horiz e8d4 +swap_horizontal_circle e933 +swap_vert e8d5 +swap_vertical_circle e8d6 +sweep e6ac +swipe e9ec +swipe_down eb53 +swipe_down_alt eb30 +swipe_left eb59 +swipe_left_alt eb33 +swipe_right eb52 +swipe_right_alt eb56 +swipe_up eb2e +swipe_up_alt eb35 +swipe_vertical eb51 +switch e1f4 +switch_access f6fd +switch_access_2 f506 +switch_access_3 f34d +switch_access_shortcut e7e1 +switch_access_shortcut_add e7e2 +switch_account e9ed +switch_camera e41e +switch_left f1d1 +switch_right f1d2 +switch_video e41f +switches e733 +sword_rose f5de +swords f889 +symptoms e132 +synagogue eab0 +sync e627 +sync_alt ea18 +sync_arrow_down f37c +sync_arrow_up f37b +sync_desktop f41a +sync_disabled e628 +sync_lock eaee +sync_problem e629 +sync_saved_locally f820 +sync_saved_locally_off f264 +syringe e133 +system_security_update f2cd +system_security_update_good f073 +system_security_update_warning f2d3 +system_update f2cd +system_update_alt e8d7 +tab e8d8 +tab_close f745 +tab_close_inactive f3d0 +tab_close_right f746 +tab_duplicate f744 +tab_group f743 +tab_inactive f43b +tab_move f742 +tab_new_right f741 +tab_recent f740 +tab_search f2f2 +tab_unselected e8d9 +table f191 +table_bar ead2 +table_chart e265 +table_chart_view f6ef +table_convert f3c7 +table_edit f3c6 +table_eye f466 +table_lamp e1f2 +table_large f299 +table_restaurant eac6 +table_rows f101 +table_rows_narrow f73f +table_sign ef2c +table_view f1be +tablet e32f +tablet_android e330 +tablet_camera f44d +tablet_mac e331 +tabs e9ee +tactic f564 +tag e9ef +tag_faces ea22 +takeout_dining ea74 +takeout_dining_2 ef34 +tamper_detection_off e82e +tamper_detection_on f8c8 +tap_and_play f2cc +tapas f1e9 +target e719 +task f075 +task_alt e2e6 +tatami_seat ef33 +taunt f69f +taxi_alert ef74 +team_dashboard e013 +temp_preferences_custom f8c9 +temp_preferences_eco f8ca +temple_buddhist eab3 +temple_hindu eaaf +tenancy f0e3 +terminal eb8e +terrain e564 +text_ad e728 +text_compare f3c5 +text_decrease eadd +text_fields e262 +text_fields_alt e9f1 +text_format e165 +text_increase eae2 +text_rotate_up e93a +text_rotate_vertical e93b +text_rotation_angledown e93c +text_rotation_angleup e93d +text_rotation_down e93e +text_rotation_none e93f +text_select_end f73e +text_select_jump_to_beginning f73d +text_select_jump_to_end f73c +text_select_move_back_character f73b +text_select_move_back_word f73a +text_select_move_down f739 +text_select_move_forward_character f738 +text_select_move_forward_word f737 +text_select_move_up f736 +text_select_start f735 +text_snippet f1c6 +text_to_speech f1bc +text_up f49e +textsms e625 +texture e421 +texture_add f57c +texture_minus f57b +theater_comedy ea66 +theaters e8da +thermometer e846 +thermometer_add f582 +thermometer_gain f6d8 +thermometer_loss f6d7 +thermometer_minus f581 +thermostat f076 +thermostat_arrow_down f37a +thermostat_arrow_up f379 +thermostat_auto f077 +thermostat_carbon f178 +things_to_do eb2a +thread_unread f4f9 +threat_intelligence eaed +thumb_down f578 +thumb_down_alt f578 +thumb_down_filled f578 +thumb_down_off f578 +thumb_down_off_alt f578 +thumb_up f577 +thumb_up_alt f577 +thumb_up_filled f577 +thumb_up_off f577 +thumb_up_off_alt f577 +thumbnail_bar f734 +thumbs_up_double eefc +thumbs_up_down e8dd +thunderstorm ebdb +tibia f89b +tibia_alt f89c +tile_large f3c3 +tile_medium f3c2 +tile_small f3c1 +time_auto f0e4 +time_to_leave eff7 +timelapse e422 +timeline e922 +timer e425 +timer_1 f2af +timer_10 e423 +timer_10_alt_1 efbf +timer_10_select f07a +timer_2 f2ae +timer_3 e424 +timer_3_alt_1 efc0 +timer_3_select f07b +timer_5 f4b1 +timer_5_shutter f4b2 +timer_arrow_down f378 +timer_arrow_up f377 +timer_off e426 +timer_pause f4bb +timer_play f4ba +tips_and_updates e79a +tire_repair ebc8 +title e264 +titlecase f489 +toast efc1 +toc e8de +today e8df +toggle_off e9f5 +toggle_on e9f6 +token ea25 +toll e8e0 +tonality e427 +tonality_2 f2b4 +toolbar e9f7 +tools_flat_head f8cb +tools_installation_kit e2ab +tools_ladder e2cb +tools_level e77b +tools_phillips f8cc +tools_pliers_wire_stripper e2aa +tools_power_drill e1e9 +tools_wrench f8cd +tooltip e9f8 +tooltip_2 f3ed +top_panel_close f733 +top_panel_open f732 +topic f1c8 +tornado e199 +total_dissolved_solids f877 +touch_app e913 +touch_double f38b +touch_long f38a +touch_triple f389 +touchpad_mouse f687 +touchpad_mouse_off f4e6 +tour ef75 +toys e332 +toys_and_games efc2 +toys_fan f887 +track_changes e8e1 +trackpad_input f4c7 +trackpad_input_2 f409 +trackpad_input_3 f408 +traffic e565 +traffic_jam f46f +trail_length eb5e +trail_length_medium eb63 +trail_length_short eb6d +train e570 +tram e571 +transcribe f8ec +transfer_within_a_station e572 +transform e428 +transgender e58d +transit_enterexit e579 +transit_ticket f3f1 +transition_chop f50e +transition_dissolve f50d +transition_fade f50c +transition_push f50b +transition_slide f50a +translate e8e2 +translate_indic f263 +transportation e21d +travel ef93 +travel_explore e2db +travel_luggage_and_bags efc3 +trending_down e8e3 +trending_flat e8e4 +trending_up e8e5 +trip e6fb +trip_origin e57b +trolley f86b +trolley_cable_car f46e +trophy ea23 +troubleshoot e1d2 +try f07c +tsunami ebd8 +tsv e6d6 +tty f1aa +tune e429 +tungsten f07d +turn_left eba6 +turn_right ebab +turn_sharp_left eba7 +turn_sharp_right ebaa +turn_slight_left eba4 +turn_slight_right eb9a +turned_in e8e7 +turned_in_not e8e7 +tv e63b +tv_displays f3ec +tv_gen e830 +tv_guide e1dc +tv_next f3eb +tv_off e647 +tv_options_edit_channels e1dd +tv_options_input_settings e1de +tv_remote f5d9 +tv_signin e71b +tv_with_assistant e785 +two_pager f51f +two_pager_store f3c4 +two_wheeler e9f9 +type_specimen f8f0 +u_turn_left eba1 +u_turn_right eba2 +udon ef32 +ulna_radius f89d +ulna_radius_alt f89e +umbrella f1ad +unarchive e169 +undo e166 +unfold_less e5d6 +unfold_less_double f8cf +unfold_more e5d7 +unfold_more_double f8d0 +ungroup f731 +universal_currency e9fa +universal_currency_alt e734 +universal_local e9fb +unknown_2 f49f +unknown_5 e6a5 +unknown_7 f49e +unknown_document f804 +unknown_med eabd +unlicense eb05 +unpaved_road f46d +unpin e6f9 +unpublished f236 +unsubscribe e0eb +upcoming f07e +update e923 +update_disabled e075 +upgrade f0fb +upi_pay f3cf +upload f09b +upload_2 f521 +upload_file e9fc +uppercase f488 +urology e137 +usb e1e0 +usb_off e4fa +user_attributes e708 +vaccines e138 +vacuum efc5 +valve e224 +vape_free ebc6 +vaping_rooms ebcf +variable_add f51e +variable_insert f51d +variable_remove f51c +variables f851 +ventilator e139 +verified ef76 +verified_off f30e +verified_user f013 +vertical_align_bottom e258 +vertical_align_center e259 +vertical_align_top e25a +vertical_distribute e076 +vertical_shades ec0e +vertical_shades_closed ec0d +vertical_split e949 +vibration f2cb +video_call e070 +video_camera_back f07f +video_camera_back_add f40c +video_camera_front f080 +video_camera_front_off f83b +video_chat f8a0 +video_file eb87 +video_label e071 +video_library e04a +video_search efc6 +video_settings ea75 +video_stable f081 +videocam e04b +videocam_alert f390 +videocam_off e04c +videogame_asset e338 +videogame_asset_off e500 +view_agenda e8e9 +view_apps f376 +view_array e8ea +view_carousel e8eb +view_column e8ec +view_column_2 f847 +view_comfy e42a +view_comfy_alt eb73 +view_compact e42b +view_compact_alt eb74 +view_cozy eb75 +view_day e8ed +view_headline e8ee +view_in_ar efc9 +view_in_ar_new efc9 +view_in_ar_off f61b +view_kanban eb7f +view_list e8ef +view_module e8f0 +view_object_track f432 +view_quilt e8f1 +view_real_size f4c2 +view_sidebar f114 +view_stream e8f2 +view_timeline eb85 +view_week e8f3 +vignette e435 +vignette_2 f2b3 +villa e586 +visibility e8f4 +visibility_lock f653 +visibility_off e8f5 +vital_signs e650 +vitals e13b +vo2_max f4aa +voice_chat e62e +voice_over_off e94a +voice_selection f58a +voice_selection_off f42c +voicemail e0d9 +voicemail_2 f352 +volcano ebda +volume_down e04d +volume_down_alt e79c +volume_mute e04e +volume_off e04f +volume_up e050 +volunteer_activism ea70 +voting_chip f852 +vpn_key e0da +vpn_key_alert f6cc +vpn_key_off eb7a +vpn_lock e62f +vpn_lock_2 f350 +vr180_create2d efca +vr180_create2d_off f571 +vrpano f082 +wall_art efcb +wall_lamp e2b4 +wallet f8ff +wallpaper e1bc +wallpaper_slideshow f672 +wand_shine f31f +wand_stars f31e +ward e13c +warehouse ebb8 +warning f083 +warning_amber f083 +warning_off f7ad +wash f1b1 +washoku f280 +watch e334 +watch_arrow f2ca +watch_button_press f6aa +watch_check f468 +watch_later efd6 +watch_off eae3 +watch_screentime f6ae +watch_vibration f467 +watch_wake f6a9 +water f084 +water_bottle f69d +water_bottle_large f69e +water_damage f203 +water_do f870 +water_drop e798 +water_ec f875 +water_full f6d6 +water_heater e284 +water_lock f6ad +water_loss f6d5 +water_lux f874 +water_medium f6d4 +water_orp f878 +water_ph f87a +water_pump f5d8 +water_voc f87b +waterfall_chart ea00 +waves e176 +waving_hand e766 +wb_auto e42c +wb_cloudy f15c +wb_incandescent e42e +wb_iridescent f07d +wb_shade ea01 +wb_sunny e430 +wb_twilight e1c6 +wc e63d +weather_hail f67f +weather_mix f60b +weather_snowy e2cd +web e051 +web_asset e069 +web_asset_off ef47 +web_stories e595 +web_traffic ea03 +webhook eb92 +weekend e16b +weight e13d +west f1e6 +whatshot e80e +wheelchair_pickup f1ab +where_to_vote e177 +widget_medium f3ba +widget_small f3b9 +widget_width f3b8 +widgets e1bd +width f730 +width_full f8f5 +width_normal f8f6 +width_wide f8f7 +wifi e63e +wifi_1_bar e4ca +wifi_2_bar e4d9 +wifi_add f7a8 +wifi_calling ef77 +wifi_calling_1 f0e7 +wifi_calling_2 f0f6 +wifi_calling_3 f0e7 +wifi_calling_bar_1 f44c +wifi_calling_bar_2 f44b +wifi_calling_bar_3 f44a +wifi_channel eb6a +wifi_find eb31 +wifi_home f671 +wifi_lock e1e1 +wifi_notification f670 +wifi_off e648 +wifi_password eb6b +wifi_protected_setup f0fc +wifi_proxy f7a7 +wifi_tethering e1e2 +wifi_tethering_error ead9 +wifi_tethering_off f087 +wind_power ec0c +window f088 +window_closed e77e +window_open e78c +window_sensor e2bb +windshield_defrost_auto f248 +windshield_defrost_front f32a +windshield_defrost_rear f329 +windshield_heat_front f328 +wine_bar f1e8 +woman e13e +woman_2 f8e7 +work e943 +work_alert f5f7 +work_history ec09 +work_off e942 +work_outline e943 +work_update f5f8 +workflow ea04 +workspace_premium e7af +workspaces ea0f +workspaces_outline ea0f +wounds_injuries e13f +wrap_text e25b +wrist f69c +wrong_location ef78 +wysiwyg f1c3 +yakitori ef31 +yard f089 +yoshoku f27f +your_trips eb2b +youtube_activity f85a +youtube_searched_for e8fa +zone_person_alert e781 +zone_person_idle e77a +zone_person_urgent e788 +zoom_in e8ff +zoom_in_map eb2d +zoom_out e900 +zoom_out_map e56b \ No newline at end of file diff --git a/Assets/Resources/PerformanceTestRunSettings.json.meta b/Assets/Resources/Fonts/Icons/MaterialSymbolsOutlinedCodepoints.txt.meta similarity index 75% rename from Assets/Resources/PerformanceTestRunSettings.json.meta rename to Assets/Resources/Fonts/Icons/MaterialSymbolsOutlinedCodepoints.txt.meta index 549c51c5..3e15f3f9 100644 --- a/Assets/Resources/PerformanceTestRunSettings.json.meta +++ b/Assets/Resources/Fonts/Icons/MaterialSymbolsOutlinedCodepoints.txt.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: cba8cf29ff1a3af4c951dc8785008b52 +guid: 76e3b660a1fc448428151d868fcb09c5 TextScriptImporter: externalObjects: {} userData: diff --git a/Assets/Resources/PerformanceTestRunInfo.json b/Assets/Resources/PerformanceTestRunInfo.json deleted file mode 100644 index 2ec3d68c..00000000 --- a/Assets/Resources/PerformanceTestRunInfo.json +++ /dev/null @@ -1 +0,0 @@ -{"TestSuite":"","Date":0,"Player":{"Development":false,"ScreenWidth":0,"ScreenHeight":0,"ScreenRefreshRate":0,"Fullscreen":false,"Vsync":0,"AntiAliasing":0,"Batchmode":false,"RenderThreadingMode":"Split","MtRendering":false,"GraphicsJobs":false,"GpuSkinning":true,"Platform":"","ColorSpace":"","AnisotropicFiltering":"","BlendWeights":"","GraphicsApi":"","ScriptingBackend":"IL2CPP","AndroidTargetSdkVersion":"AndroidApiLevelAuto","AndroidBuildSystem":"Gradle","BuildTarget":"StandaloneWindows64","StereoRenderingPath":"MultiPass"},"Hardware":{"OperatingSystem":"","DeviceModel":"","DeviceName":"","ProcessorType":"","ProcessorCount":0,"GraphicsDeviceName":"","SystemMemorySizeMB":0},"Editor":{"Version":"6000.2.12f1","Branch":"6000.2/staging","Changeset":"e89d5df0e333","Date":1762305399},"Dependencies":["com.cysharp.unitask@2.5.10","com.github-glitchenzo.nugetforunity@4.5.0","com.unity.2d.sprite@1.0.0","com.unity.ai.navigation@2.0.9","com.unity.cloud.gltfast@6.14.1","com.unity.ide.rider@3.0.38","com.unity.ide.visualstudio@2.0.25","com.unity.inputsystem@1.14.2","com.unity.multiplayer.center@1.0.0","com.unity.nuget.newtonsoft-json@3.2.1","com.unity.render-pipelines.core@17.2.0","com.unity.render-pipelines.universal@17.2.0","com.unity.test-framework@1.6.0","com.unity.timeline@1.8.9","com.unity.ugui@2.0.0","com.unity.visualscripting@1.9.8","com.unity.modules.accessibility@1.0.0","com.unity.modules.ai@1.0.0","com.unity.modules.androidjni@1.0.0","com.unity.modules.animation@1.0.0","com.unity.modules.assetbundle@1.0.0","com.unity.modules.audio@1.0.0","com.unity.modules.cloth@1.0.0","com.unity.modules.director@1.0.0","com.unity.modules.imageconversion@1.0.0","com.unity.modules.imgui@1.0.0","com.unity.modules.jsonserialize@1.0.0","com.unity.modules.particlesystem@1.0.0","com.unity.modules.physics@1.0.0","com.unity.modules.physics2d@1.0.0","com.unity.modules.screencapture@1.0.0","com.unity.modules.terrain@1.0.0","com.unity.modules.terrainphysics@1.0.0","com.unity.modules.tilemap@1.0.0","com.unity.modules.ui@1.0.0","com.unity.modules.uielements@1.0.0","com.unity.modules.umbra@1.0.0","com.unity.modules.unityanalytics@1.0.0","com.unity.modules.unitywebrequest@1.0.0","com.unity.modules.unitywebrequestassetbundle@1.0.0","com.unity.modules.unitywebrequestaudio@1.0.0","com.unity.modules.unitywebrequesttexture@1.0.0","com.unity.modules.unitywebrequestwww@1.0.0","com.unity.modules.vehicles@1.0.0","com.unity.modules.video@1.0.0","com.unity.modules.vr@1.0.0","com.unity.modules.wind@1.0.0","com.unity.modules.xr@1.0.0","com.unity.modules.subsystems@1.0.0","com.unity.modules.hierarchycore@1.0.0","com.unity.ext.nunit@2.0.5","com.unity.shadergraph@17.2.0","com.unity.render-pipelines.universal-config@17.0.3","com.unity.burst@1.8.25","com.unity.mathematics@1.3.2","com.unity.collections@2.6.2","com.unity.rendering.light-transport@1.0.1","com.unity.searcher@4.9.3","com.unity.nuget.mono-cecil@1.11.5","com.unity.test-framework.performance@3.2.0"],"Results":[]} \ No newline at end of file diff --git a/Assets/Resources/PerformanceTestRunSettings.json b/Assets/Resources/PerformanceTestRunSettings.json deleted file mode 100644 index 49438ae1..00000000 --- a/Assets/Resources/PerformanceTestRunSettings.json +++ /dev/null @@ -1 +0,0 @@ -{"MeasurementCount":-1} \ No newline at end of file diff --git a/Assets/Resources/Prefabs/UI/List/ComponentListItem.prefab b/Assets/Resources/Prefabs/UI/List/ComponentListItem.prefab index 0af9ebaf..3123d53e 100644 --- a/Assets/Resources/Prefabs/UI/List/ComponentListItem.prefab +++ b/Assets/Resources/Prefabs/UI/List/ComponentListItem.prefab @@ -37,8 +37,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 24.000008, y: -3.5} - m_SizeDelta: {x: 0, y: 15} + m_AnchoredPosition: {x: 24, y: -3.5} + m_SizeDelta: {x: 16.79, y: 15} m_Pivot: {x: 0, y: 1} --- !u!222 &1821424897527179892 CanvasRenderer: @@ -667,10 +667,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 3094276047947572059} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 15} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 8.395, y: -7.5} + m_SizeDelta: {x: 6.79, y: 15} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &7899941541401797984 MonoBehaviour: @@ -1418,7 +1418,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &3186561737559845992 RectTransform: m_ObjectHideFlags: 0 @@ -1635,7 +1635,7 @@ RectTransform: m_AnchorMin: {x: 1, y: 0.5} m_AnchorMax: {x: 1, y: 0.5} m_AnchoredPosition: {x: -2, y: 0} - m_SizeDelta: {x: 0, y: 22} + m_SizeDelta: {x: 40.79, y: 22} m_Pivot: {x: 1, y: 0.5} --- !u!114 &4840481829667430247 MonoBehaviour: @@ -2163,10 +2163,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 5465326936975101749} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 22} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 11, y: -11} + m_SizeDelta: {x: 22, y: 22} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &4173370272032766120 CanvasRenderer: diff --git a/Assets/Resources/SHI/Modal/ISOP/ISOPChart.uss b/Assets/Resources/SHI/Modal/ISOP/ISOPChart.uss index c790120e..7af86ee4 100644 --- a/Assets/Resources/SHI/Modal/ISOP/ISOPChart.uss +++ b/Assets/Resources/SHI/Modal/ISOP/ISOPChart.uss @@ -81,10 +81,11 @@ } /* 첫 번째 행: 상단 테두리 추가 */ -.task-row:first-child { +/* Unity USS does not support :first-child pseudo-class */ +/* .task-row:first-child { border-top-width: 1px; border-top-color: rgb(136, 190, 230); -} +} */ /* 호버 상태: 연한 파란색 배경 */ .task-row:hover { @@ -127,6 +128,7 @@ } /* 첫 번째 레벨 셀: 왼쪽 테두리 없음 */ -.task-txt:first-child { +/* Unity USS does not support :first-child pseudo-class */ +/* .task-txt:first-child { border-left-width: 0; -} +} */ diff --git a/Assets/Resources/SHI/Modal/NW/NWChart.uss b/Assets/Resources/SHI/Modal/NW/NWChart.uss index eb8b4c4e..4f94b281 100644 --- a/Assets/Resources/SHI/Modal/NW/NWChart.uss +++ b/Assets/Resources/SHI/Modal/NW/NWChart.uss @@ -171,7 +171,7 @@ border-color: rgba(51, 51, 51, 0.5); /* 반투명 회색 테두리 */ justify-content: center; align-items: center; - cursor: link; /* 클릭 가능 커서 */ + cursor: resource('UIToolkit/Images/cursor_point_white_32') 14 5; /* 클릭 가능 커서 */ transition-duration: 0.15s; /* 호버 애니메이션 */ } diff --git a/Assets/Resources/SHI/Modal/TreeList.uss b/Assets/Resources/SHI/Modal/TreeList.uss index 88715206..100385ca 100644 --- a/Assets/Resources/SHI/Modal/TreeList.uss +++ b/Assets/Resources/SHI/Modal/TreeList.uss @@ -1,130 +1,73 @@ -/* - * TreeList.uss - TreeList 컴포넌트 스타일시트 - * - * [개요] - * TreeList.uxml과 TreeListItem.uxml에서 사용하는 스타일을 정의합니다. - * 어두운 테마(Dark Theme)에 맞춰 디자인되었습니다. - * - * [스타일 구조] - * 1. .tree-menu-container : 메인 컨테이너 (어두운 배경, 240px 너비) - * 2. .search-field : 검색 입력 필드 (흰색 배경, 둥근 모서리) - * 3. #main-tree-view : TreeView 기본 설정 (들여쓰기 10px) - * 4. .unity-tree-view__item-toggle : 펼침/접기 토글 버튼 - * 5. .unity-collection-view__item : 항목 배경색 (기본/호버/선택) - * 6. .visibility-toggle : 가시성 토글 버튼 (눈 아이콘) - * - * [색상 팔레트] - * - 배경: rgb(40, 44, 52) - 어두운 회색 - * - 호버: rgba(0, 10, 37, 0.25) - 반투명 파랑 - * - 선택: rgba(0, 10, 37, 0.5) - 더 진한 반투명 파랑 - * - 텍스트: rgb(255, 255, 255) - 흰색 - * - * [연관 파일] - * - TreeList.uxml : 메인 레이아웃 - * - TreeListItem.uxml : 개별 항목 템플릿 - * - TreeList.cs : C# 컨트롤러 - */ - -/* =================================== - 메인 컨테이너 스타일 - 사이드 패널 전체를 감싸는 컨테이너 - =================================== */ .tree-menu-container { - background-color: rgb(40, 44, 52); /* 어두운 회색 배경 */ - flex-grow: 1; /* 부모 영역 채우기 */ + background-color: rgb(40, 44, 52); + flex-grow: 1; padding: 5px; padding-top: 25px; padding-bottom: 25px; padding-left: 20px; padding-right: 20px; - width: 240px; /* 고정 너비 */ + width: 240px; } -/* =================================== - 검색 입력 필드 스타일 - 흰색 배경의 둥근 입력창 - =================================== */ .search-field { margin-bottom: 20px; - background-color: rgb(255, 255, 255); /* 흰색 배경 */ - border-radius: 4px; /* 둥근 모서리 */ + background-color: rgb(255, 255, 255); + border-radius: 4px; height: 30px; width: auto; margin-top: 0; margin-right: 0; margin-left: 0; - -unity-font-definition: resource('Fonts/Pretendard/Pretendard-Regular'); } -/* 검색 필드 내부 텍스트 입력 영역 */ #search-field > #unity-text-input { padding-top: 4px; - padding-right: 24px; /* 오른쪽 아이콘 공간 확보 */ + padding-right: 24px; padding-bottom: 4px; padding-left: 4px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; - border-top-width: 0; /* 테두리 제거 */ + border-top-width: 0; border-right-width: 0; border-bottom-width: 0; border-left-width: 0; } -/* =================================== - 체크박스 스타일 - =================================== */ #unity-checkmark { -unity-background-image-tint-color: rgb(255, 255, 255); } -/* =================================== - TreeView 기본 설정 - =================================== */ #main-tree-view { - --unity-item-indent-width: 10; /* 계층별 들여쓰기 너비 */ + --unity-item-indent-width: 10; } -/* 펼침/접기 토글 아이콘 컨테이너 */ #unity-tree-view__item-toggle > VisualElement > VisualElement { margin-left: 0; margin-right: 0; - width: 22px; /* 토글 아이콘 너비 */ + width: 22px; } -/* 펼침/접기 토글 버튼 */ .unity-tree-view__item-toggle { - margin-right: 5px; /* 라벨과의 간격 */ + margin-right: 5px; } -/* =================================== - 항목 배경색 스타일 - 기본, 호버, 선택 상태별 배경색 - =================================== */ - -/* 기본 상태: 투명 배경 */ .unity-collection-view__item { background-color: rgba(50, 50, 50, 0); } -/* 호버 상태: 반투명 파란색 배경 */ .unity-collection-view__item:hover { background-color: rgba(0, 10, 37, 0.25); } -/* 선택 상태: 더 진한 반투명 파란색 배경 */ .unity-collection-view__item--selected { background-color: rgba(0, 10, 37, 0.5); } -/* =================================== - 가시성 토글 버튼 스타일 - 눈 아이콘으로 3D 모델 가시성 제어 - =================================== */ .visibility-toggle { - background-color: rgba(0, 0, 0, 0); /* 투명 배경 */ - border-width: 0; /* 테두리 없음 */ + background-color: rgba(0, 0, 0, 0); + border-width: 0; width: 16px; height: 16px; margin-top: 0; @@ -137,52 +80,42 @@ padding-right: 0; padding-left: 0; margin-left: 0; - flex-shrink: 0; /* 크기 축소 방지 */ - background-image: resource('SHI/Images/icon_visibility_on_64'); /* 기본: 보이는 상태 */ + flex-shrink: 0; + background-image: resource('SHI/Images/icon_visibility_on_64'); } -/* 가시성 켜짐 상태 (눈 열린 아이콘) */ .visibility-on { background-image: resource('SHI/Images/icon_visibility_on_64'); } -/* 가시성 꺼짐 상태 (눈 닫힌 아이콘) */ .visibility-off { background-image: resource('SHI/Images/icon_visibility_off_64'); } -/* =================================== - 세로 스크롤바 스타일 - 슬림한 6px 너비의 커스텀 스크롤바 - =================================== */ .unity-scroller--vertical { - width: 6px; /* 슬림한 너비 */ + width: 6px; margin-right: 4px; - margin-bottom: 0px; + margin-bottom: 0; } -/* 세로 스크롤바 트랙 (배경) */ .unity-scroller--vertical .unity-base-slider__tracker { - background-color: rgba(255, 255, 255, 0); /* 흰색 배경 */ + background-color: rgba(255, 255, 255, 0); border-width: 0; } -/* 세로 스크롤바 드래거 컨테이너 위치 조정 */ .unity-scroller--vertical .unity-base-slider__drag-container { left: 0; right: 0; } -/* 세로 스크롤바 드래거 (핸들) */ .unity-scroller--vertical .unity-base-slider__dragger { - background-color: rgb(216, 216, 216); /* 밝은 회색 */ + background-color: rgb(216, 216, 216); border-width: 0; - border-radius: 3px; /* 둥근 모서리 */ + border-radius: 3px; width: 6px; left: 0; } -/* 세로 스크롤바 화살표 버튼 숨김 */ .unity-scroller--vertical .unity-repeat-button { display: none; width: 0; @@ -191,49 +124,39 @@ min-height: 0; } -/* 세로 스크롤바 슬라이더 마진 제거 */ .unity-scroller--vertical .unity-slider { margin: 0; } -/* 세로 스크롤바 입력 필드 크기 조정 */ .unity-scroller--vertical .unity-base-field__input { width: 6px; min-width: 6px; } -/* =================================== - 가로 스크롤바 스타일 - 슬림한 6px 높이의 커스텀 스크롤바 - =================================== */ .unity-scroller--horizontal { - height: 6px; /* 슬림한 높이 */ + height: 6px; margin-bottom: 4px; - margin-right: 0px; + margin-right: 0; } -/* 가로 스크롤바 트랙 (배경) */ .unity-scroller--horizontal .unity-base-slider__tracker { - background-color: rgba(255, 255, 255, 0); /* 흰색 배경 */ + background-color: rgba(255, 255, 255, 0); border-width: 0; } -/* 가로 스크롤바 드래거 컨테이너 위치 조정 */ .unity-scroller--horizontal .unity-base-slider__drag-container { top: 0; bottom: 0; } -/* 가로 스크롤바 드래거 (핸들) */ .unity-scroller--horizontal .unity-base-slider__dragger { - background-color: rgb(216, 216, 216); /* 밝은 회색 */ + background-color: rgb(216, 216, 216); border-width: 0; - border-radius: 3px; /* 둥근 모서리 */ + border-radius: 3px; height: 6px; top: 0; } -/* 가로 스크롤바 화살표 버튼 숨김 */ .unity-scroller--horizontal .unity-repeat-button { display: none; width: 0; @@ -242,12 +165,10 @@ min-height: 0; } -/* 가로 스크롤바 슬라이더 마진 제거 */ .unity-scroller--horizontal .unity-slider { margin: 0; } -/* 가로 스크롤바 입력 필드 크기 조정 */ .unity-scroller--horizontal .unity-base-field__input { height: 6px; min-height: 6px; diff --git a/Assets/Resources/Simulator/FreeForkLift/Prefabs/Forklift.prefab b/Assets/Resources/Simulator/FreeForkLift/Prefabs/Forklift.prefab index 639f7749..19f62144 100644 --- a/Assets/Resources/Simulator/FreeForkLift/Prefabs/Forklift.prefab +++ b/Assets/Resources/Simulator/FreeForkLift/Prefabs/Forklift.prefab @@ -24,12 +24,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000010839049058} + serializedVersion: 2 m_LocalRotation: {x: -0.000000029802322, y: -0.7071068, z: -0.000000029802322, w: 0.7071067} m_LocalPosition: {x: 0.546, y: 0.5154157, z: 0.9} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4000012554966720} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: -90, z: -90} --- !u!146 &146000014083572840 WheelCollider: @@ -38,6 +39,7 @@ WheelCollider: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000010839049058} + serializedVersion: 2 m_Center: {x: 0, y: 0, z: 0} m_Radius: 0.35 m_SuspensionSpring: @@ -60,7 +62,15 @@ WheelCollider: m_AsymptoteSlip: 0.5 m_AsymptoteValue: 0.75 m_Stiffness: 1 + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_Enabled: 1 + m_ProvidesContacts: 0 --- !u!1 &1000010860801872 GameObject: m_ObjectHideFlags: 0 @@ -86,12 +96,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000010860801872} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 100, y: 100, z: 100} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4000013356346940} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &33000011975467108 MeshFilter: @@ -112,9 +123,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 4294967295 m_RendererPriority: 0 m_Materials: @@ -126,6 +145,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -135,9 +155,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &1000011070132974 GameObject: m_ObjectHideFlags: 0 @@ -161,16 +183,17 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000011070132974} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 4000012432798180} - {fileID: 4000012935168970} - {fileID: 4000011892871780} - {fileID: 4000012432309022} m_Father: {fileID: 4000013356346940} - m_RootOrder: 8 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1000011073349600 GameObject: @@ -199,13 +222,14 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000011073349600} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 4000013356346940} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!54 &54000013437409432 Rigidbody: @@ -214,10 +238,21 @@ Rigidbody: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000011073349600} - serializedVersion: 2 + serializedVersion: 5 m_Mass: 3000 - m_Drag: 0.1 - m_AngularDrag: 0.05 + m_LinearDamping: 0.1 + m_AngularDamping: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 m_UseGravity: 1 m_IsKinematic: 0 m_Interpolate: 0 @@ -315,13 +350,14 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000011434685428} + serializedVersion: 2 m_LocalRotation: {x: -0.21805806, y: 0, z: 0, w: 0.9759358} m_LocalPosition: {x: -0.09799957, y: 0.56307596, z: 0.7989998} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 4000012006374022} m_Father: {fileID: 4000013356346940} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: -25.19, y: 0, z: 0} --- !u!1 &1000011473680638 GameObject: @@ -347,9 +383,11 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000011473680638} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 4000013471762282} - {fileID: 4000010406632914} @@ -362,7 +400,6 @@ Transform: - {fileID: 4000012554966720} - {fileID: 4000011998697752} m_Father: {fileID: 4000013476106956} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!65 &65000010894959072 BoxCollider: @@ -372,9 +409,17 @@ BoxCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000011473680638} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_Size: {x: 1, y: 1, z: 2.3914237} m_Center: {x: -0.000000014901161, y: 0.6700001, z: 0.105711475} --- !u!1 &1000011477830700 @@ -402,12 +447,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000011477830700} + serializedVersion: 2 m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071067} m_LocalPosition: {x: -0.5451015, y: 0.33541575, z: 0.89999986} m_LocalScale: {x: 100, y: 100.00001, z: 100.00001} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4000013356346940} - m_RootOrder: 5 m_LocalEulerAnglesHint: {x: -89.980194, y: 0, z: 0} --- !u!33 &33000012518384032 MeshFilter: @@ -428,9 +474,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 4294967295 m_RendererPriority: 0 m_Materials: @@ -442,6 +496,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -451,9 +506,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &1000011734525732 GameObject: m_ObjectHideFlags: 0 @@ -479,12 +536,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000011734525732} + serializedVersion: 2 m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071067} m_LocalPosition: {x: -0.5037266, y: 0.26429352, z: -0.707311} m_LocalScale: {x: 100, y: 100.00001, z: 100.00001} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4000013356346940} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: -89.980194, y: 0, z: 0} --- !u!33 &33000012340827016 MeshFilter: @@ -505,9 +563,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 4294967295 m_RendererPriority: 0 m_Materials: @@ -519,6 +585,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -528,9 +595,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &1000011739579314 GameObject: m_ObjectHideFlags: 0 @@ -555,12 +624,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000011739579314} + serializedVersion: 2 m_LocalRotation: {x: -0.000000059604645, y: -0.7071068, z: -0.000000059604645, w: 0.7071067} m_LocalPosition: {x: -0.5037265, y: 0.44729352, z: -0.7073109} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4000012554966720} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: -90, z: -90} --- !u!146 &146000011170915886 WheelCollider: @@ -569,6 +639,7 @@ WheelCollider: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000011739579314} + serializedVersion: 2 m_Center: {x: 0, y: 0, z: 0} m_Radius: 0.28 m_SuspensionSpring: @@ -591,7 +662,15 @@ WheelCollider: m_AsymptoteSlip: 0.5 m_AsymptoteValue: 0.75 m_Stiffness: 1 + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_Enabled: 1 + m_ProvidesContacts: 0 --- !u!1 &1000012502322780 GameObject: m_ObjectHideFlags: 0 @@ -617,13 +696,14 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000012502322780} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 100, y: 100, z: 100} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 4000010940013096} m_Father: {fileID: 4000013356346940} - m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &33000013424043954 MeshFilter: @@ -644,9 +724,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 4294967295 m_RendererPriority: 0 m_Materials: @@ -658,6 +746,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -667,9 +756,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &1000012659452950 GameObject: m_ObjectHideFlags: 0 @@ -694,12 +785,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000012659452950} + serializedVersion: 2 m_LocalRotation: {x: -0.000000029802322, y: -0.7071068, z: -0.000000029802322, w: 0.7071067} m_LocalPosition: {x: 0.5037265, y: 0.44729352, z: -0.7073109} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4000012554966720} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: -90, z: -90} --- !u!146 &146000013894646302 WheelCollider: @@ -708,6 +800,7 @@ WheelCollider: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000012659452950} + serializedVersion: 2 m_Center: {x: 0, y: 0, z: 0} m_Radius: 0.28 m_SuspensionSpring: @@ -730,7 +823,15 @@ WheelCollider: m_AsymptoteSlip: 0.5 m_AsymptoteValue: 0.75 m_Stiffness: 1 + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_Enabled: 1 + m_ProvidesContacts: 0 --- !u!1 &1000012833946986 GameObject: m_ObjectHideFlags: 0 @@ -755,12 +856,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000012833946986} + serializedVersion: 2 m_LocalRotation: {x: -0.000000059604645, y: -0.7071068, z: -0.000000059604645, w: 0.7071067} m_LocalPosition: {x: -0.54510164, y: 0.5154157, z: 0.9} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4000012554966720} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: -90, z: -90} --- !u!146 &146000011117633326 WheelCollider: @@ -769,6 +871,7 @@ WheelCollider: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000012833946986} + serializedVersion: 2 m_Center: {x: 0, y: 0, z: 0} m_Radius: 0.35 m_SuspensionSpring: @@ -791,7 +894,15 @@ WheelCollider: m_AsymptoteSlip: 0.5 m_AsymptoteValue: 0.75 m_Stiffness: 1 + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_Enabled: 1 + m_ProvidesContacts: 0 --- !u!1 &1000013477262638 GameObject: m_ObjectHideFlags: 0 @@ -817,12 +928,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000013477262638} + serializedVersion: 2 m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071067} m_LocalPosition: {x: 0.5037266, y: 0.26429352, z: -0.707311} m_LocalScale: {x: 100, y: 100.00001, z: 100.00001} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4000013356346940} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: -89.980194, y: 0, z: 0} --- !u!33 &33000013523892176 MeshFilter: @@ -843,9 +955,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 4294967295 m_RendererPriority: 0 m_Materials: @@ -857,6 +977,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -866,9 +987,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &1000013532054310 GameObject: m_ObjectHideFlags: 0 @@ -894,12 +1017,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000013532054310} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 100, y: 100, z: 100} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4000013356346940} - m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &33000012354022326 MeshFilter: @@ -920,9 +1044,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 4294967295 m_RendererPriority: 0 m_Materials: @@ -934,6 +1066,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -943,9 +1076,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &1000013738711648 GameObject: m_ObjectHideFlags: 0 @@ -971,12 +1106,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000013738711648} + serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.01, y: 0.01, z: 0.01} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4000012230258352} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!65 &65000013609962728 BoxCollider: @@ -986,9 +1122,17 @@ BoxCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000013738711648} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_Size: {x: 0.7810302, y: 0.037019253, z: 1.136157} m_Center: {x: -0.0026693344, y: 0.036987662, z: 1.8662252} --- !u!65 &65000011325912258 @@ -999,9 +1143,17 @@ BoxCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000013738711648} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_Size: {x: 1.202784, y: 0.99137866, z: 0.09446905} m_Center: {x: 1.4210855e-14, y: 0.63167053, z: 1.3453856} --- !u!1 &1000013874299352 @@ -1029,12 +1181,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000013874299352} + serializedVersion: 2 m_LocalRotation: {x: 0.21805808, y: -0, z: -0, w: 0.9759358} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 100, y: 100, z: 100} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4000013471762282} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &33000010944424196 MeshFilter: @@ -1055,9 +1208,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 4294967295 m_RendererPriority: 0 m_Materials: @@ -1069,6 +1230,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -1078,9 +1240,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &1000013991346752 GameObject: m_ObjectHideFlags: 0 @@ -1106,12 +1270,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000013991346752} + serializedVersion: 2 m_LocalRotation: {x: -0.7071068, y: 0, z: -0, w: 0.7071067} m_LocalPosition: {x: 0.5459999, y: 0.33541575, z: 0.89999986} m_LocalScale: {x: 100, y: 100.00001, z: 100.00001} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4000013356346940} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: -89.980194, y: 0, z: 0} --- !u!33 &33000012990824728 MeshFilter: @@ -1132,9 +1297,17 @@ MeshRenderer: m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 4294967295 m_RendererPriority: 0 m_Materials: @@ -1146,6 +1319,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -1155,9 +1329,11 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &1000014025593340 GameObject: m_ObjectHideFlags: 0 @@ -1182,12 +1358,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000014025593340} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4000013356346940} - m_RootOrder: 9 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!65 &65000011180271422 BoxCollider: @@ -1197,8 +1374,16 @@ BoxCollider: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000014025593340} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_Size: {x: 1.202322, y: 1.1608126, z: 1.3974968} m_Center: {x: 9.313244e-10, y: 1.5547146, z: 0.13412763} diff --git a/Assets/Resources/Simulator/FreeForkLift/Prefabs/PalletEmpty.prefab b/Assets/Resources/Simulator/FreeForkLift/Prefabs/PalletEmpty.prefab index d33ab069..d732eb35 100644 --- a/Assets/Resources/Simulator/FreeForkLift/Prefabs/PalletEmpty.prefab +++ b/Assets/Resources/Simulator/FreeForkLift/Prefabs/PalletEmpty.prefab @@ -1,21 +1,11 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1001 &100100000 -Prefab: - m_ObjectHideFlags: 1 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: [] - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 0} - m_RootGameObject: {fileID: 1000010367924706} - m_IsPrefabAsset: 1 --- !u!1 &1000010367924706 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - component: {fileID: 4000010654416078} @@ -28,11 +18,78 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 +--- !u!4 &4000010654416078 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000010367924706} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 5.71} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4000012846995296} + - {fileID: 4000011572875330} + - {fileID: 4000011710664838} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} +--- !u!54 &54000013494727520 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000010367924706} + serializedVersion: 5 + m_Mass: 50 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!65 &65000011714920370 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000010367924706} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 0.04, z: 1} + m_Center: {x: 0, y: 0.12, z: 0} --- !u!1 &1000011940101718 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - component: {fileID: 4000011572875330} @@ -44,11 +101,48 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 +--- !u!4 &4000011572875330 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011940101718} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.072, z: -0.56} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4000010654416078} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &65000011694717970 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000011940101718} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 0.1440002, z: 0.1006759} + m_Center: {x: 0, y: 0, z: 0} --- !u!1 &1000012623322564 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - component: {fileID: 4000011710664838} @@ -60,11 +154,48 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 +--- !u!4 &4000011710664838 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012623322564} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0.072, z: 0.539} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4000010654416078} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &65000012467042714 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000012623322564} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 0.1440002, z: 0.1006759} + m_Center: {x: 0, y: 0, z: 0} --- !u!1 &1000013525428288 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - component: {fileID: 4000012846995296} @@ -78,75 +209,53 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &4000010654416078 -Transform: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 1000010367924706} - m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 5.71} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 4000012846995296} - - {fileID: 4000011572875330} - - {fileID: 4000011710664838} - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} ---- !u!4 &4000011572875330 -Transform: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 1000011940101718} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0.072, z: -0.56} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 4000010654416078} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!4 &4000011710664838 -Transform: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 1000012623322564} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0.072, z: 0.539} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 4000010654416078} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!4 &4000012846995296 Transform: - m_ObjectHideFlags: 1 + m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000013525428288} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 100, y: 100, z: 100} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 4000010654416078} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &33000011068149276 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1000013525428288} + m_Mesh: {fileID: 4300000, guid: 5661de86a21f8ef4b8fa880ef2e7b46c, type: 3} --- !u!23 &23000011150270100 MeshRenderer: - m_ObjectHideFlags: 1 + m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000013525428288} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 4294967295 + m_RendererPriority: 0 m_Materials: - {fileID: 2100000, guid: bb5b8dcebe22c1c43a002cc9b3d28174, type: 2} m_StaticBatchInfo: @@ -156,6 +265,7 @@ MeshRenderer: m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 + m_ReceiveGI: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 @@ -165,76 +275,29 @@ MeshRenderer: m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 ---- !u!33 &33000011068149276 -MeshFilter: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 1000013525428288} - m_Mesh: {fileID: 4300000, guid: 5661de86a21f8ef4b8fa880ef2e7b46c, type: 3} ---- !u!54 &54000013494727520 -Rigidbody: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 1000010367924706} - serializedVersion: 2 - m_Mass: 50 - m_Drag: 0 - m_AngularDrag: 0.05 - m_UseGravity: 1 - m_IsKinematic: 0 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!65 &65000011694717970 -BoxCollider: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 1000011940101718} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 0.1440002, z: 0.1006759} - m_Center: {x: 0, y: 0, z: 0} ---- !u!65 &65000011714920370 -BoxCollider: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 1000010367924706} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 0.04, z: 1} - m_Center: {x: 0, y: 0.12, z: 0} ---- !u!65 &65000012467042714 -BoxCollider: - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} - m_GameObject: {fileID: 1000012623322564} - m_Material: {fileID: 0} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 0.1440002, z: 0.1006759} - m_Center: {x: 0, y: 0, z: 0} + m_AdditionalVertexStreams: {fileID: 0} --- !u!65 &65000012969618506 BoxCollider: - m_ObjectHideFlags: 1 + m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInternal: {fileID: 100100000} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1000013525428288} m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 m_IsTrigger: 0 + m_ProvidesContacts: 0 m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_Size: {x: 0.010000003, y: 0.0014400017, z: 0.0010067594} m_Center: {x: 0.00009318173, y: 0.0007195668, z: -0.005589797} diff --git a/Assets/Resources/Simulator/FreeForkLift/Scripts/ForkController.cs b/Assets/Resources/Simulator/FreeForkLift/Scripts/ForkController.cs index 075199f8..5bea1418 100644 --- a/Assets/Resources/Simulator/FreeForkLift/Scripts/ForkController.cs +++ b/Assets/Resources/Simulator/FreeForkLift/Scripts/ForkController.cs @@ -15,8 +15,7 @@ public class ForkController : MonoBehaviour { // Update is called once per frame void FixedUpdate () { - - Debug.Log(mastMoveTrue); + if(fork.transform.localPosition.y >= maxYmast.y && fork.transform.localPosition.y < maxY.y) { mastMoveTrue = true; diff --git a/Assets/Resources/Studio/Prefabs/Modal/Setting/SettingShortcutTabContent.prefab b/Assets/Resources/Studio/Prefabs/Modal/Setting/SettingShortcutTabContent.prefab index 3f5cd98b..80e18f68 100644 --- a/Assets/Resources/Studio/Prefabs/Modal/Setting/SettingShortcutTabContent.prefab +++ b/Assets/Resources/Studio/Prefabs/Modal/Setting/SettingShortcutTabContent.prefab @@ -464,7 +464,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 431, y: -2} - m_SizeDelta: {x: 50, y: 0} + m_SizeDelta: {x: 80, y: 0} m_Pivot: {x: 0, y: 1} --- !u!114 &8952730479983948989 MonoBehaviour: @@ -1965,6 +1965,10 @@ PrefabInstance: propertyPath: m_fontSizeBase value: 12 objectReference: {fileID: 0} + - target: {fileID: 431666316254308180, guid: 40cc873fb7f9d6446b24facc889836b5, type: 3} + propertyPath: m_HorizontalAlignment + value: 4 + objectReference: {fileID: 0} - target: {fileID: 2230432181843762964, guid: 40cc873fb7f9d6446b24facc889836b5, type: 3} propertyPath: m_Pivot.x value: 0 @@ -1991,7 +1995,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2230432181843762964, guid: 40cc873fb7f9d6446b24facc889836b5, type: 3} propertyPath: m_SizeDelta.x - value: 50 + value: 80 objectReference: {fileID: 0} - target: {fileID: 2230432181843762964, guid: 40cc873fb7f9d6446b24facc889836b5, type: 3} propertyPath: m_SizeDelta.y @@ -2057,6 +2061,10 @@ PrefabInstance: propertyPath: m_fontSizeBase value: 12 objectReference: {fileID: 0} + - target: {fileID: 6932173583458566539, guid: 40cc873fb7f9d6446b24facc889836b5, type: 3} + propertyPath: m_HorizontalAlignment + value: 4 + objectReference: {fileID: 0} - target: {fileID: 7640204669525975220, guid: 40cc873fb7f9d6446b24facc889836b5, type: 3} propertyPath: m_Text value: diff --git a/Assets/Resources/Studio/UIToolkit.meta b/Assets/Resources/Studio/UIToolkit.meta new file mode 100644 index 00000000..04b1cc7a --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 036922f6ebd1fc246b7f9dcbed76951d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Studio/UIToolkit/Modal.meta b/Assets/Resources/Studio/UIToolkit/Modal.meta new file mode 100644 index 00000000..3359da6d --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit/Modal.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 523651d33563a6e4eb5a39945fe0017f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentDBUXML.uxml b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentDBUXML.uxml new file mode 100644 index 00000000..d0afa7c9 --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentDBUXML.uxml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentDBUXML.uxml.meta b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentDBUXML.uxml.meta new file mode 100644 index 00000000..61356b36 --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentDBUXML.uxml.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: d27b20f78aec0354b8b97b9af0765701 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentGeneralUXML.uxml b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentGeneralUXML.uxml new file mode 100644 index 00000000..c3cd0cfc --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentGeneralUXML.uxml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentGeneralUXML.uxml.meta b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentGeneralUXML.uxml.meta new file mode 100644 index 00000000..670af551 --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentGeneralUXML.uxml.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 0a709a335acffbd4c9d4358c153fad81 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentShortcutUXML.uxml b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentShortcutUXML.uxml new file mode 100644 index 00000000..96d9145f --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentShortcutUXML.uxml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentShortcutUXML.uxml.meta b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentShortcutUXML.uxml.meta new file mode 100644 index 00000000..37338f45 --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentShortcutUXML.uxml.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: dcdd51dd452d3e94ca374da0307608a4 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/Resources/UIToolkit.meta b/Assets/Resources/UIToolkit.meta new file mode 100644 index 00000000..69a0e951 --- /dev/null +++ b/Assets/Resources/UIToolkit.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 166e6c1e42c1dee4a836845108ff7782 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/UIToolkit/Button.meta b/Assets/Resources/UIToolkit/Button.meta new file mode 100644 index 00000000..130cea7a --- /dev/null +++ b/Assets/Resources/UIToolkit/Button.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0c207fd08d36fad46b095869721794d7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/UIToolkit/Button/UTKButton.uss b/Assets/Resources/UIToolkit/Button/UTKButton.uss new file mode 100644 index 00000000..08a00ef5 --- /dev/null +++ b/Assets/Resources/UIToolkit/Button/UTKButton.uss @@ -0,0 +1,436 @@ +/* + * =================================== + * UTKButton.uss + * 기본 버튼 컴포넌트 스타일 + * =================================== + */ + +/* =================================== + Base Button + =================================== */ + +.utk-button { + flex-direction: row; + align-items: center; + justify-content: center; + padding-left: var(--space-m); + padding-right: var(--space-m); + padding-top: var(--space-s); + padding-bottom: var(--space-s); + border-radius: var(--radius-s); + border-width: var(--border-width); + border-color: var(--color-border); + background-color: var(--color-btn-normal); + color: var(--color-text-primary); + transition-duration: var(--anim-fast); + transition-property: background-color, border-color, color; + cursor: resource('UIToolkit/Images/cursor_point_white_32') 14 5; +} + +.utk-button:hover { + background-color: var(--color-btn-hover); +} + +.utk-button:active { + background-color: var(--color-btn-pressed); +} + +.utk-button:focus { + border-color: var(--color-border-focus); +} + +/* =================================== + Button Icon + =================================== */ + +.utk-button__icon { + font-size: var(--font-size-body1); + color: var(--color-text-primary); + margin: 0; + padding: 0; + -unity-text-align: middle-center; + align-self: center; +} + +.utk-button--has-icon .utk-button__icon { + margin-right: var(--space-s); +} + +/* =================================== + Button Text + =================================== */ + +.utk-button__text { + font-size: var(--font-size-body2); + color: var(--color-text-primary); + -unity-text-align: middle-center; +} + +/* =================================== + Icon Only Mode + =================================== */ + +.utk-button--icon-only { + padding: 0; + min-width: auto; + width: var(--size-icon-btn); + height: var(--size-icon-btn); + justify-content: center; + align-items: center; +} + +.utk-button--icon-only .utk-button__icon { + margin: 0; + padding: 0; + align-self: center; +} + +/* =================================== + Size Variants + =================================== */ + +.utk-button--small { + height: 20px; + min-width: 60px; + padding-left: var(--space-s); + padding-right: var(--space-s); + font-size: var(--font-size-label3); +} + +.utk-button--small .utk-button__text { + font-size: var(--font-size-label3); +} + +.utk-button--small .utk-button__icon { + font-size: var(--font-size-label3); +} + +.utk-button--medium { + height: var(--size-btn-height); + min-width: var(--size-btn-min-width); +} + +.utk-button--large { + height: 32px; + min-width: 100px; + padding-left: var(--space-l); + padding-right: var(--space-l); +} + +.utk-button--large .utk-button__text { + font-size: var(--font-size-body1); +} + +.utk-button--large .utk-button__icon { + font-size: var(--font-size-body1); +} + +/* =================================== + Style Variants + =================================== */ + +/* Normal (Default) */ +.utk-button--normal { + background-color: var(--color-btn-normal); + border-color: var(--color-border); + color: var(--color-text-primary); +} + +.utk-button--normal:hover { + background-color: var(--color-btn-hover); +} + +.utk-button--normal:active { + background-color: var(--color-btn-pressed); +} + +/* Primary */ +.utk-button--primary { + background-color: var(--color-btn-primary); + border-color: var(--color-btn-primary); + color: var(--color-text-on-primary); +} + +.utk-button--primary:hover { + background-color: var(--color-btn-primary-hover); + border-color: var(--color-btn-primary-hover); +} + +.utk-button--primary:active { + background-color: var(--color-blue-04); + border-color: var(--color-blue-04); +} + +.utk-button--primary .utk-button__text, +.utk-button--primary .utk-button__icon { + color: var(--color-text-on-primary); +} + +/* Secondary */ +.utk-button--secondary { + background-color: var(--color-btn-secondary); + border-color: var(--color-border); + color: var(--color-text-primary); +} + +.utk-button--secondary:hover { + background-color: var(--color-btn-secondary-hover); +} + +/* Ghost (Transparent) */ +.utk-button--ghost { + background-color: transparent; + border-color: transparent; + color: var(--color-text-primary); +} + +.utk-button--ghost:hover { + background-color: rgba(255, 255, 255, 0.1); +} + +.utk-button--ghost:active { + background-color: rgba(255, 255, 255, 0.15); +} + +/* Danger */ +.utk-button--danger { + background-color: var(--color-red-01); + border-color: var(--color-red-01); + color: var(--color-text-on-primary); +} + +.utk-button--danger:hover { + background-color: var(--color-red-02); + border-color: var(--color-red-02); +} + +.utk-button--danger .utk-button__text, +.utk-button--danger .utk-button__icon { + color: var(--color-text-on-primary); +} + +/* =================================== + Outline Variants + =================================== */ + +/* Outline Normal */ +.utk-button--outline-normal { + background-color: transparent; + border-color: var(--color-border); + border-width: 1px; + color: var(--color-text-primary); +} + +.utk-button--outline-normal:hover { + background-color: var(--color-btn-hover); + border-color: var(--color-text-primary); +} + +.utk-button--outline-normal:active { + background-color: var(--color-btn-pressed); +} + +.utk-button--outline-normal .utk-button__text, +.utk-button--outline-normal .utk-button__icon { + color: var(--color-text-primary); +} + +/* Outline Primary */ +.utk-button--outline-primary { + background-color: transparent; + border-color: var(--color-btn-primary); + border-width: 1px; + color: var(--color-btn-primary); +} + +.utk-button--outline-primary:hover { + background-color: var(--color-btn-primary); + border-color: var(--color-btn-primary); +} + +.utk-button--outline-primary:active { + background-color: var(--color-btn-primary-hover); + border-color: var(--color-btn-primary-hover); +} + +.utk-button--outline-primary .utk-button__text, +.utk-button--outline-primary .utk-button__icon { + color: var(--color-btn-primary); +} + +.utk-button--outline-primary:hover .utk-button__text, +.utk-button--outline-primary:hover .utk-button__icon { + color: var(--color-text-on-primary); +} + +/* Outline Danger */ +.utk-button--outline-danger { + background-color: transparent; + border-color: var(--color-red-01); + border-width: 1px; + color: var(--color-red-01); +} + +.utk-button--outline-danger:hover { + background-color: var(--color-red-01); + border-color: var(--color-red-01); +} + +.utk-button--outline-danger:active { + background-color: var(--color-red-02); + border-color: var(--color-red-02); +} + +.utk-button--outline-danger .utk-button__text, +.utk-button--outline-danger .utk-button__icon { + color: var(--color-red-01); +} + +.utk-button--outline-danger:hover .utk-button__text, +.utk-button--outline-danger:hover .utk-button__icon { + color: var(--color-text-on-primary); +} + +/* =================================== + Text Variant (Label/Icon only, no background/border) + =================================== */ + +/* Text - 배경과 외곽선이 투명하고 텍스트/아이콘만 표시 */ +.utk-button--text { + background-color: transparent; + border-color: transparent; + border-width: 0; + color: var(--color-text-primary); + padding-left: var(--space-s); + padding-right: var(--space-s); + min-width: auto; +} + +.utk-button--text:hover { + background-color: transparent; + color: var(--color-btn-primary); +} + +.utk-button--text:active { + background-color: transparent; + color: var(--color-btn-primary-hover); +} + +.utk-button--text .utk-button__text, +.utk-button--text .utk-button__icon { + color: var(--color-text-primary); +} + +.utk-button--text:hover .utk-button__text, +.utk-button--text:hover .utk-button__icon { + color: var(--color-btn-primary); +} + +.utk-button--text:active .utk-button__text, +.utk-button--text:active .utk-button__icon { + color: var(--color-btn-primary-hover); +} + +/* Text Icon Only - 원형 아이콘 버튼 */ +.utk-button--text.utk-button--icon-only { + width: var(--size-icon-btn); + height: var(--size-icon-btn); + border-radius: 50%; + padding: 0; +} + +.utk-button--text.utk-button--icon-only:hover { + background-color: rgba(255, 255, 255, 0.1); +} + +.utk-button--text.utk-button--icon-only:hover .utk-button__icon { + color: var(--color-text-primary); +} + +.utk-button--text.utk-button--icon-only:active { + background-color: rgba(255, 255, 255, 0.15); +} + +.utk-button--text.utk-button--icon-only:active .utk-button__icon { + color: var(--color-text-primary); +} + +/* =================================== + Disabled State + =================================== */ + +.utk-button--disabled { + background-color: var(--color-btn-disabled); + border-color: var(--color-border); + color: var(--color-text-disabled); + cursor: arrow; +} + +.utk-button--disabled:hover { + background-color: var(--color-btn-disabled); + border-color: var(--color-border); +} + +.utk-button--disabled:active { + background-color: var(--color-btn-disabled); + border-color: var(--color-border); +} + +.utk-button--disabled:focus { + border-color: var(--color-border); +} + +.utk-button--disabled .utk-button__text, +.utk-button--disabled .utk-button__icon { + color: var(--color-text-disabled); +} + +/* Text Variant Disabled - hover/active 시에도 색상 유지 */ +.utk-button--text.utk-button--disabled { + background-color: transparent; + border-color: transparent; +} + +.utk-button--text.utk-button--disabled:hover { + background-color: transparent; +} + +.utk-button--text.utk-button--disabled:hover .utk-button__text, +.utk-button--text.utk-button--disabled:hover .utk-button__icon { + color: var(--color-text-disabled); +} + +.utk-button--text.utk-button--disabled:active .utk-button__text, +.utk-button--text.utk-button--disabled:active .utk-button__icon { + color: var(--color-text-disabled); +} + +/* =================================== + Image Icon Support + =================================== */ + +.utk-button__image-icon { + width: 20px; + height: 20px; + flex-shrink: 0; + -unity-background-scale-mode: scale-to-fit; +} + +.utk-button--has-image-icon .utk-button__image-icon { + margin-right: var(--space-s); +} + +.utk-button--icon-only .utk-button__image-icon { + margin-right: 0; +} + +/* Size Variants for Image Icon */ +.utk-button--small .utk-button__image-icon { + width: 16px; + height: 16px; +} + +.utk-button--large .utk-button__image-icon { + width: 24px; + height: 24px; +} diff --git a/Assets/Resources/UIToolkit/Button/UTKButton.uss.meta b/Assets/Resources/UIToolkit/Button/UTKButton.uss.meta new file mode 100644 index 00000000..353c9b28 --- /dev/null +++ b/Assets/Resources/UIToolkit/Button/UTKButton.uss.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d87c1fbcdd3ffee42b5860c781bcb4f8 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 diff --git a/Assets/Resources/UIToolkit/Button/UTKCheckBox.uss b/Assets/Resources/UIToolkit/Button/UTKCheckBox.uss new file mode 100644 index 00000000..3bd0ca14 --- /dev/null +++ b/Assets/Resources/UIToolkit/Button/UTKCheckBox.uss @@ -0,0 +1,118 @@ +/* + * =================================== + * UTKCheckBox.uss + * 체크박스 스타일 + * =================================== + */ + +/* =================================== + Base Container + =================================== */ + +.utk-checkbox { + flex-direction: row; + align-items: center; + cursor: resource('UIToolkit/Images/cursor_point_white_32') 14 5; +} + +/* =================================== + Checkbox Box + =================================== */ + +.utk-checkbox__box { + width: 18px; + height: 18px; + min-width: 18px; + min-height: 18px; + border-radius: var(--radius-s); + border-width: 2px; + border-color: var(--color-border); + background-color: var(--color-bg-input); + align-items: center; + justify-content: center; + transition-duration: var(--anim-fast); + transition-property: border-color, background-color; + cursor: resource('UIToolkit/Images/cursor_point_white_32') 14 5; /* 클릭 가능 커서 */ +} + +.utk-checkbox:hover .utk-checkbox__box { + border-color: var(--color-btn-primary); +} + +.utk-checkbox--checked .utk-checkbox__box, +.utk-checkbox--indeterminate .utk-checkbox__box { + border-color: var(--color-btn-primary); + background-color: var(--color-btn-primary); + cursor: resource('UIToolkit/Images/cursor_point_white_32') 14 5; /* 클릭 가능 커서 */ +} + +/* =================================== + Check Icon + =================================== */ + +.utk-checkbox__icon { + width: 14px; + height: 14px; + font-size: 12px; + color: var(--color-text-primary); + -unity-text-align: middle-center; + -unity-font-style: bold; + opacity: 0; + transition-duration: var(--anim-fast); + transition-property: opacity; + margin: 0; + padding: 0; + position: absolute; + left: 50%; + top: 50%; + translate: -50% -50%; + cursor: resource('UIToolkit/Images/cursor_point_white_32') 14 5; /* 클릭 가능 커서 */ +} + +.utk-checkbox--checked .utk-checkbox__icon, +.utk-checkbox--indeterminate .utk-checkbox__icon { + opacity: 1; +} + +/* =================================== + Label + =================================== */ + +.utk-checkbox__label { + margin-left: var(--space-m); + font-size: var(--font-size-body2); + color: var(--color-text-primary); + cursor: resource('UIToolkit/Images/cursor_point_white_32') 14 5; /* 클릭 가능 커서 */ +} + +/* =================================== + Disabled State + =================================== */ + +.utk-checkbox--disabled { + cursor: arrow; +} + +.utk-checkbox--disabled .utk-checkbox__box { + border-color: var(--color-border); + background-color: var(--color-btn-disabled); +} + +.utk-checkbox--disabled:hover .utk-checkbox__box { + border-color: var(--color-border); +} + +.utk-checkbox--disabled.utk-checkbox--checked .utk-checkbox__box, +.utk-checkbox--disabled.utk-checkbox--indeterminate .utk-checkbox__box { + background-color: var(--color-text-disabled); + border-color: var(--color-text-disabled); +} + +.utk-checkbox--disabled.utk-checkbox--checked:hover .utk-checkbox__box, +.utk-checkbox--disabled.utk-checkbox--indeterminate:hover .utk-checkbox__box { + border-color: var(--color-text-disabled); +} + +.utk-checkbox--disabled .utk-checkbox__label { + color: var(--color-text-disabled); +} diff --git a/Assets/Resources/UIToolkit/Button/UTKCheckBox.uss.meta b/Assets/Resources/UIToolkit/Button/UTKCheckBox.uss.meta new file mode 100644 index 00000000..fdbb32ec --- /dev/null +++ b/Assets/Resources/UIToolkit/Button/UTKCheckBox.uss.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c2c311091db8199469dcc687e40e3765 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 diff --git a/Assets/Resources/UIToolkit/Button/UTKRadioButton.uss b/Assets/Resources/UIToolkit/Button/UTKRadioButton.uss new file mode 100644 index 00000000..db9c7311 --- /dev/null +++ b/Assets/Resources/UIToolkit/Button/UTKRadioButton.uss @@ -0,0 +1,124 @@ +/* + * =================================== + * UTKRadioButton.uss + * Unity RadioButton 래핑 스타일 + * =================================== + */ + +/* =================================== + Base Container + =================================== */ + +.utk-radio { + flex-direction: row; + align-items: center; + align-self: flex-start; + cursor: resource('UIToolkit/Images/cursor_point_white_32') 14 5; +} + +/* =================================== + Radio Input Container + =================================== */ + +.utk-radio > .unity-radio-button__input { + flex-direction: row; + align-items: center; +} + +/* =================================== + Checkmark Container (Outer Circle) + =================================== */ + +.utk-radio .unity-radio-button__checkmark-background { + width: 18px; + height: 18px; + border-radius: 9px; + border-width: 2px; + border-color: var(--color-border); + background-color: var(--color-bg-input); + align-items: center; + justify-content: center; + transition-duration: var(--anim-fast); + transition-property: border-color, background-color; +} + +.utk-radio:hover .unity-radio-button__checkmark-background { + border-color: var(--color-btn-primary); +} + +.utk-radio:checked .unity-radio-button__checkmark-background { + border-color: var(--color-btn-primary); + background-color: var(--color-btn-primary); +} + +/* =================================== + Checkmark (Inner Dot) + =================================== */ + +.utk-radio .unity-radio-button__checkmark { + width: 8px; + height: 8px; + border-radius: 4px; + background-color: transparent; + background-image: none; + -unity-background-image-tint-color: transparent; + position: absolute; + left: 50%; + top: 50%; + translate: -50% -50%; + transition-duration: var(--anim-fast); + transition-property: background-color; +} + +.utk-radio:checked .unity-radio-button__checkmark { + background-color: var(--color-text-on-primary); +} + +/* =================================== + Label + =================================== */ + +.utk-radio .unity-radio-button__text { + margin-left: var(--space-s); + font-size: var(--font-size-body2); + color: var(--color-text-primary); +} + +/* =================================== + Disabled State + =================================== */ + +.utk-radio:disabled { + cursor: arrow; + opacity: 1; +} + +.utk-radio:disabled .unity-radio-button__checkmark-background { + border-color: var(--color-border); + background-color: var(--color-btn-disabled); +} + +.utk-radio:disabled:hover .unity-radio-button__checkmark-background { + border-color: var(--color-border); +} + +.utk-radio:disabled:checked:hover .unity-radio-button__checkmark-background { + border-color: var(--color-text-disabled); +} + +.utk-radio:disabled:checked .unity-radio-button__checkmark-background { + background-color: var(--color-text-disabled); + border-color: var(--color-text-disabled); +} + +.utk-radio:disabled .unity-radio-button__checkmark { + background-color: var(--color-btn-disabled); +} + +.utk-radio:disabled:checked .unity-radio-button__checkmark { + background-color: var(--color-text-on-primary); +} + +.utk-radio:disabled .unity-radio-button__text { + color: var(--color-text-disabled); +} diff --git a/Assets/Resources/UIToolkit/Button/UTKRadioButton.uss.meta b/Assets/Resources/UIToolkit/Button/UTKRadioButton.uss.meta new file mode 100644 index 00000000..58ba329b --- /dev/null +++ b/Assets/Resources/UIToolkit/Button/UTKRadioButton.uss.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1480e5ed2b9f5914f8a920e59c027cf3 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 diff --git a/Assets/Resources/UIToolkit/Button/UTKToggle.uss b/Assets/Resources/UIToolkit/Button/UTKToggle.uss new file mode 100644 index 00000000..fafadd04 --- /dev/null +++ b/Assets/Resources/UIToolkit/Button/UTKToggle.uss @@ -0,0 +1,112 @@ +/* + * =================================== + * UTKToggle.uss + * Unity Toggle 래핑 스타일 + * =================================== + */ + +/* =================================== + Base Container + =================================== */ + +.utk-toggle { + flex-direction: row; + align-items: center; + align-self: flex-start; + cursor: resource('UIToolkit/Images/cursor_point_white_32') 14 5; +} + +/* =================================== + Hide default Unity checkmark + =================================== */ + +.utk-toggle > .unity-toggle__input { + width: 36px; + height: 20px; + min-width: 36px; + min-height: 20px; + border-radius: 10px; + background-color: var(--color-btn-normal); + border-width: var(--border-width); + border-color: var(--color-border); + flex-shrink: 0; + transition-duration: var(--anim-normal); + transition-property: background-color, border-color; +} + +.utk-toggle:hover > .unity-toggle__input { + border-color: var(--color-btn-primary); +} + +.utk-toggle--on > .unity-toggle__input { + background-color: var(--color-btn-primary); + border-color: var(--color-btn-primary); +} + +/* =================================== + Checkmark (Thumb) + =================================== */ + +.utk-toggle > .unity-toggle__input > .unity-toggle__checkmark { + width: 14px; + height: 14px; + border-width: 0; + border-radius: var(--radius-full); + background-color: var(--color-text-secondary); + -unity-background-image-tint-color: transparent; + background-image: none; + margin: 2px; + transition-duration: var(--anim-normal); + transition-property: translate, background-color; +} + +.utk-toggle--on > .unity-toggle__input > .unity-toggle__checkmark { + translate: 16px 0; + background-color: var(--color-text-on-primary); +} + +/* =================================== + Label + =================================== */ + +.utk-toggle > .unity-toggle__label, +.utk-toggle > .unity-label { + margin-left: var(--space-m); + font-size: var(--font-size-body2); + color: var(--color-text-primary); +} + +/* =================================== + Disabled State + =================================== */ + +.utk-toggle--disabled { + cursor: arrow; +} + +.utk-toggle--disabled > .unity-toggle__input { + background-color: var(--color-btn-disabled); + border-color: var(--color-border); +} + +.utk-toggle--disabled:hover > .unity-toggle__input { + border-color: var(--color-border); +} + +.utk-toggle--disabled.utk-toggle--on > .unity-toggle__input { + background-color: var(--color-text-disabled); + border-color: var(--color-text-disabled); +} + +.utk-toggle--disabled.utk-toggle--on:hover > .unity-toggle__input { + border-color: var(--color-text-disabled); +} + +.utk-toggle--disabled > .unity-toggle__input > .unity-toggle__checkmark { + background-color: var(--color-text-disabled); +} + +.utk-toggle--disabled > .unity-toggle__label, +.utk-toggle--disabled > .unity-label { + color: var(--color-text-disabled); +} diff --git a/Assets/Resources/UIToolkit/Button/UTKToggle.uss.meta b/Assets/Resources/UIToolkit/Button/UTKToggle.uss.meta new file mode 100644 index 00000000..e9324798 --- /dev/null +++ b/Assets/Resources/UIToolkit/Button/UTKToggle.uss.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ea8e7fa6e2b464743a2cb236bc35086f +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 diff --git a/Assets/Resources/UIToolkit/Button/UTKToggleButtonGroup.uss b/Assets/Resources/UIToolkit/Button/UTKToggleButtonGroup.uss new file mode 100644 index 00000000..eb22d623 --- /dev/null +++ b/Assets/Resources/UIToolkit/Button/UTKToggleButtonGroup.uss @@ -0,0 +1,87 @@ +/* + * =================================== + * UTKToggleButtonGroup.uss + * Unity ToggleButtonGroup 래핑 스타일 + * =================================== + */ + +/* =================================== + Base Container + =================================== */ + +.utk-toggle-group { + flex-direction: row; + background-color: var(--color-bg-secondary); + border-radius: var(--radius-s); + border-width: var(--border-width); + border-color: var(--color-border); + padding: 2px; +} + +/* =================================== + Toggle Buttons + =================================== */ + +.utk-toggle-group > .unity-button { + margin: 0; + padding: var(--space-xs) var(--space-m); + background-color: transparent; + border-width: 0; + border-radius: var(--radius-xs); + font-size: var(--font-size-body2); + color: var(--color-text-primary); + transition-duration: var(--anim-fast); + transition-property: background-color, color; +} + +.utk-toggle-group > .unity-button:hover { + background-color: var(--color-btn-hover); +} + +.utk-toggle-group > .unity-button:checked { + background-color: var(--color-btn-primary); + color: var(--color-text-on-primary); +} + +.utk-toggle-group > .unity-button:checked:hover { + background-color: var(--color-btn-primary-hover); +} + +/* =================================== + Custom Button Class + =================================== */ + +.utk-toggle-group__button { + flex-direction: row; + align-items: center; +} + +.utk-toggle-group__icon { + margin-right: var(--space-xs); +} + +/* =================================== + Disabled State + =================================== */ + +.utk-toggle-group--disabled { + opacity: 1; +} + +.utk-toggle-group--disabled > .unity-button { + color: var(--color-text-disabled); + background-color: transparent; +} + +.utk-toggle-group--disabled > .unity-button:hover { + background-color: transparent; +} + +.utk-toggle-group--disabled > .unity-button:checked { + background-color: var(--color-btn-disabled); + color: var(--color-text-disabled); +} + +.utk-toggle-group--disabled > .unity-button:checked:hover { + background-color: var(--color-btn-disabled); +} diff --git a/Assets/Resources/UIToolkit/Button/UTKToggleButtonGroup.uss.meta b/Assets/Resources/UIToolkit/Button/UTKToggleButtonGroup.uss.meta new file mode 100644 index 00000000..d95795c7 --- /dev/null +++ b/Assets/Resources/UIToolkit/Button/UTKToggleButtonGroup.uss.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b86bf8de13087274d838017cb2603ed2 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 diff --git a/Assets/Resources/UIToolkit/Card.meta b/Assets/Resources/UIToolkit/Card.meta new file mode 100644 index 00000000..71aed263 --- /dev/null +++ b/Assets/Resources/UIToolkit/Card.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 68a77a858a5c1ce44832e5b9580b80de +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/UIToolkit/Card/UTKCard.uss b/Assets/Resources/UIToolkit/Card/UTKCard.uss new file mode 100644 index 00000000..f6b3949d --- /dev/null +++ b/Assets/Resources/UIToolkit/Card/UTKCard.uss @@ -0,0 +1,112 @@ +/* + * =================================== + * UTKCard.uss + * 카드 컴포넌트 스타일 + * =================================== + */ + +/* =================================== + Base Container + =================================== */ + +.utk-card { + flex-direction: column; + border-radius: var(--radius-l); + overflow: hidden; +} + +/* =================================== + Variants + =================================== */ + +.utk-card--elevated { + background-color: var(--color-bg-elevated); +} + +.utk-card--outlined { + background-color: var(--color-bg-panel); + border-width: var(--border-width); + border-color: var(--color-border); +} + +.utk-card--filled { + background-color: var(--color-btn-normal); +} + +/* =================================== + Clickable State + =================================== */ + +.utk-card--clickable { + cursor: resource('UIToolkit/Images/cursor_point_white_32') 14 5; + transition-duration: var(--anim-fast); + transition-property: background-color; +} + +.utk-card--clickable:hover { + background-color: var(--color-btn-hover); +} + +.utk-card--clickable:active { + background-color: var(--color-btn-pressed); +} + +/* =================================== + Image Container + =================================== */ + +.utk-card__image { + height: 160px; + background-size: cover; + background-position: center; +} + +/* =================================== + Header + =================================== */ + +.utk-card__header { + flex-direction: column; + padding: var(--space-l); + padding-bottom: 0; +} + +/* =================================== + Title + =================================== */ + +.utk-card__title { + font-size: var(--font-size-h3); + color: var(--color-text-primary); + -unity-font-style: bold; + margin-bottom: var(--space-xs); +} + +/* =================================== + Subtitle + =================================== */ + +.utk-card__subtitle { + font-size: var(--font-size-body2); + color: var(--color-text-secondary); +} + +/* =================================== + Content + =================================== */ + +.utk-card__content { + padding: var(--space-l); +} + +/* =================================== + Actions + =================================== */ + +.utk-card__actions { + flex-direction: row; + justify-content: flex-end; + padding: var(--space-m) var(--space-l); + border-top-width: var(--border-width); + border-top-color: var(--color-border); +} diff --git a/Assets/Resources/UIToolkit/Card/UTKCard.uss.meta b/Assets/Resources/UIToolkit/Card/UTKCard.uss.meta new file mode 100644 index 00000000..259784f8 --- /dev/null +++ b/Assets/Resources/UIToolkit/Card/UTKCard.uss.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2fe5884914f7ee14d8a93eedb3b40fd4 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 diff --git a/Assets/Resources/UIToolkit/Common.meta b/Assets/Resources/UIToolkit/Common.meta new file mode 100644 index 00000000..f12d413f --- /dev/null +++ b/Assets/Resources/UIToolkit/Common.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 31176a3f98a362d4283ac94b4d603372 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/UIToolkit/Common/UTKFoldout.uss b/Assets/Resources/UIToolkit/Common/UTKFoldout.uss new file mode 100644 index 00000000..40c4da9d --- /dev/null +++ b/Assets/Resources/UIToolkit/Common/UTKFoldout.uss @@ -0,0 +1,100 @@ +/* + * =================================== + * UTKFoldout.uss + * Unity Foldout 래핑 스타일 + * =================================== + */ + +/* =================================== + Base Container + =================================== */ + +.utk-foldout { + margin-bottom: var(--space-s); +} + +/* =================================== + Toggle (Header) + =================================== */ + +.utk-foldout > .unity-foldout__toggle { + margin: 0; + padding: var(--space-s) var(--space-m); + background-color: var(--color-bg-secondary); + border-radius: var(--radius-s); + border-width: var(--border-width); + border-color: var(--color-border); + transition-duration: var(--anim-fast); + transition-property: background-color, border-color; +} + +.utk-foldout > .unity-foldout__toggle:hover { + background-color: var(--color-btn-hover); +} + +/* =================================== + Checkmark (Arrow) + =================================== */ + +.utk-foldout > .unity-foldout__toggle > .unity-toggle__input > .unity-foldout__checkmark { + width: 16px; + height: 16px; + -unity-background-image-tint-color: var(--color-text-secondary); + transition-duration: var(--anim-fast); + transition-property: rotate; + margin-top: 0; + margin-bottom: 0; + margin-left: 0; + margin-right: var(--space-xs); +} + +.utk-foldout > .unity-foldout__toggle:checked > .unity-toggle__input > .unity-foldout__checkmark { + rotate: 0deg; +} + +/* =================================== + Title Label + =================================== */ + +.utk-foldout > .unity-foldout__toggle > .unity-toggle__input > .unity-foldout__text { + font-size: var(--font-size-body2); + color: var(--color-text-primary); + -unity-font-style: bold; + margin: 0; + padding: var(--space-s) 0; +} + +/* =================================== + Content Container + =================================== */ + +.utk-foldout .unity-foldout__content { + margin-top: var(--space-s); + margin-left: var(--space-m); + padding: var(--space-m); + background-color: var(--color-bg-secondary); + border-radius: var(--radius-s); + border-width: var(--border-width); + border-color: var(--color-border); +} + +.utk-foldout .unity-foldout__content { + font-size: var(--font-size-body2); + color: var(--color-text-primary); +} + +/* =================================== + Collapsed State - Remove content border radius on top + =================================== */ + +.utk-foldout:checked > .unity-foldout__toggle { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.utk-foldout:checked .unity-foldout__content { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; + border-top-width: 0; +} diff --git a/Assets/Resources/UIToolkit/Common/UTKFoldout.uss.meta b/Assets/Resources/UIToolkit/Common/UTKFoldout.uss.meta new file mode 100644 index 00000000..5bd33a1e --- /dev/null +++ b/Assets/Resources/UIToolkit/Common/UTKFoldout.uss.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7a0f870707b8498449e18047de242133 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 diff --git a/Assets/Resources/UIToolkit/Common/UTKHelpBox.uss b/Assets/Resources/UIToolkit/Common/UTKHelpBox.uss new file mode 100644 index 00000000..c2530033 --- /dev/null +++ b/Assets/Resources/UIToolkit/Common/UTKHelpBox.uss @@ -0,0 +1,127 @@ +/* + * =================================== + * UTKHelpBox.uss + * Unity HelpBox 래핑 스타일 + * =================================== + */ + +/* =================================== + Base Container + =================================== */ + +.utk-helpbox { + flex-direction: row; + align-items: center; + padding: var(--space-m); + border-radius: var(--radius-s); + border-width: var(--border-width); + min-height: 32px; +} + +/* =================================== + Icon + =================================== */ + +.utk-helpbox__icon { + font-size: 20px; + margin-right: var(--space-m); + flex-shrink: 0; + align-self: center; +} + +/* =================================== + Message + =================================== */ + +.utk-helpbox__message { + flex-grow: 1; + font-size: var(--font-size-body2); + white-space: normal; + -unity-text-align: middle-left; +} + +/* =================================== + Info Type + =================================== */ + +.utk-helpbox--info { + background-color: rgba(8, 151, 251, 0.1); + border-color: var(--color-state-info); +} + +.utk-helpbox--info .utk-helpbox__icon { + color: var(--color-state-info); +} + +.utk-helpbox--info .utk-helpbox__message { + color: var(--color-state-info); +} + +/* =================================== + Success Type + =================================== */ + +.utk-helpbox--success { + background-color: rgba(115, 201, 145, 0.1); + border-color: var(--color-state-success); +} + +.utk-helpbox--success .utk-helpbox__icon { + color: var(--color-state-success); +} + +.utk-helpbox--success .utk-helpbox__message { + color: var(--color-state-success); +} + +/* =================================== + Warning Type + =================================== */ + +.utk-helpbox--warning { + background-color: rgba(238, 157, 40, 0.1); + border-color: var(--color-state-warning); +} + +.utk-helpbox--warning .utk-helpbox__icon { + color: var(--color-state-warning); +} + +.utk-helpbox--warning .utk-helpbox__message { + color: var(--color-state-warning); +} + +/* =================================== + Error Type + =================================== */ + +.utk-helpbox--error { + background-color: rgba(241, 76, 76, 0.1); + border-color: var(--color-state-error); +} + +.utk-helpbox--error .utk-helpbox__icon { + color: var(--color-state-error); +} + +.utk-helpbox--error .utk-helpbox__message { + color: var(--color-state-error); +} + +/* =================================== + None Type (No icon) + =================================== */ + +.utk-helpbox--none { + background-color: var(--color-bg-secondary); + border-color: var(--color-border); +} + +.utk-helpbox--none .utk-helpbox__icon { + display: none; +} + +.utk-helpbox--none .utk-helpbox__message { + color: var(--color-text-primary); +} + diff --git a/Assets/Resources/UIToolkit/Common/UTKHelpBox.uss.meta b/Assets/Resources/UIToolkit/Common/UTKHelpBox.uss.meta new file mode 100644 index 00000000..6af21a0a --- /dev/null +++ b/Assets/Resources/UIToolkit/Common/UTKHelpBox.uss.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e71b5c9d9a33d264fbd619b3b6e3a707 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 diff --git a/Assets/Resources/UIToolkit/Common/UTKImage.uss b/Assets/Resources/UIToolkit/Common/UTKImage.uss new file mode 100644 index 00000000..b124b2ae --- /dev/null +++ b/Assets/Resources/UIToolkit/Common/UTKImage.uss @@ -0,0 +1,10 @@ +/* UTKImage 기본 스타일 */ +.utk-image { + overflow: hidden; + -unity-background-scale-mode: scale-to-fit; +} + +/* 로딩 상태 */ +.utk-image--loading { + opacity: 0.5; +} diff --git a/Assets/Resources/UIToolkit/Common/UTKImage.uss.meta b/Assets/Resources/UIToolkit/Common/UTKImage.uss.meta new file mode 100644 index 00000000..f78b8f30 --- /dev/null +++ b/Assets/Resources/UIToolkit/Common/UTKImage.uss.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 143038e63b8fc834cafe9db628cc5011 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 diff --git a/Assets/Resources/UIToolkit/Common/UTKScrollView.uss b/Assets/Resources/UIToolkit/Common/UTKScrollView.uss new file mode 100644 index 00000000..0daea829 --- /dev/null +++ b/Assets/Resources/UIToolkit/Common/UTKScrollView.uss @@ -0,0 +1,57 @@ +/* + * =================================== + * UTKScrollView.uss + * Unity ScrollView 래핑 스타일 + * =================================== + */ + +/* =================================== + Base Container + =================================== */ + +.utk-scrollview { + flex-grow: 1; +} + +/* =================================== + Content Container + =================================== */ + +.utk-scrollview > .unity-scroll-view__content-and-vertical-scroll-container { + flex-grow: 1; +} + +.utk-scrollview > .unity-scroll-view__content-and-vertical-scroll-container > .unity-scroll-view__content-viewport { + flex-grow: 1; +} + +.utk-scrollview > .unity-scroll-view__content-and-vertical-scroll-container > .unity-scroll-view__content-viewport > .unity-scroll-view__content-container { + padding: 0; +} + +/* =================================== + Content Text + =================================== */ + +.utk-scrollview .unity-label { + font-size: var(--font-size-body2); + color: var(--color-text-primary); +} + +/* =================================== + Vertical Scroller + =================================== */ + +.utk-scrollview .unity-scroller--vertical > .unity-scroller__slider { + width: 6px; + margin: 0; +} + +/* =================================== + Horizontal Scroller + =================================== */ + +.utk-scrollview .unity-scroller--horizontal > .unity-scroller__slider { + height: 6px; + margin: 0; +} diff --git a/Assets/Resources/UIToolkit/Common/UTKScrollView.uss.meta b/Assets/Resources/UIToolkit/Common/UTKScrollView.uss.meta new file mode 100644 index 00000000..d54687ac --- /dev/null +++ b/Assets/Resources/UIToolkit/Common/UTKScrollView.uss.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ff0a7d358a20ced4dbe5ef646db9b0f3 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 diff --git a/Assets/Resources/UIToolkit/Common/UTKTooltip.uss b/Assets/Resources/UIToolkit/Common/UTKTooltip.uss new file mode 100644 index 00000000..c3cba5cf --- /dev/null +++ b/Assets/Resources/UIToolkit/Common/UTKTooltip.uss @@ -0,0 +1,18 @@ +/* UTKTooltip.uss - 툴팁 스타일 */ + +.utk-tooltip-container { + position: absolute; + background-color: var(--color-bg-tooltip); + border-radius: var(--radius-m); + padding: var(--space-s) var(--space-m); + max-width: 300px; + border-width: var(--border-width); + border-color: var(--color-border-light); +} + +.utk-tooltip-label { + color: #FFFFFF; + font-size: var(--font-size-body2); + white-space: normal; + -unity-text-align: middle-left; +} diff --git a/Assets/Resources/UIToolkit/Common/UTKTooltip.uss.meta b/Assets/Resources/UIToolkit/Common/UTKTooltip.uss.meta new file mode 100644 index 00000000..7c0855b5 --- /dev/null +++ b/Assets/Resources/UIToolkit/Common/UTKTooltip.uss.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d18684c4217403848995bd0890378f98 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 diff --git a/Assets/Resources/UIToolkit/Common/UTKTooltip.uxml b/Assets/Resources/UIToolkit/Common/UTKTooltip.uxml new file mode 100644 index 00000000..6534bc28 --- /dev/null +++ b/Assets/Resources/UIToolkit/Common/UTKTooltip.uxml @@ -0,0 +1,6 @@ + +