49 Commits

Author SHA1 Message Date
60dc73a60f Merge pull request 'feature/uitoolkit' (#18) from feature/uitoolkit into master
Reviewed-on: http://220.90.135.190:3000/khi/XRLib/pulls/18
2026-02-26 09:57:37 +09:00
logonkhi
33f07529d3 Factory 용 Setting 모달 개발 완료 2026-02-26 09:56:34 +09:00
logonkhi
2914667223 Factory Modal 개발중. UTKLoading 개발 완료 2026-02-25 20:27:11 +09:00
logonkhi
8ca8bd0df9 UTKShortcutList 개발 완료. Modal 개선 2026-02-24 20:01:56 +09:00
logonkhi
b9b394935e UTKNotification 수정 중 2026-02-23 19:38:27 +09:00
logonkhi
106e7f51be UTKPropertyTabListWindow 개발 완료 2026-02-23 14:52:30 +09:00
logonkhi
9d02afd8e8 UTKPropertyTabListWindow 개발 중. UTKTabView Tab 버튼에 아이콘 설정 할 수 있게 기능 추가해야 함 2026-02-20 19:56:23 +09:00
logonkhi
b64c3e10bc UTKToolBar 완료 2026-02-20 19:17:36 +09:00
logonkhi
ad10e24d13 UTKReorableList 개발 중 2026-02-19 20:08:57 +09:00
logonkhi
739a62eb9b UTKToolBar 개발 완료 2026-02-19 18:40:37 +09:00
logonkhi
0333b83b57 UTKTopMenu 기능 추가 2026-02-19 10:43:52 +09:00
김형인
200a7faa6b UTKTopmenu 개발 완료 2026-02-13 20:27:31 +09:00
김형인
b19fb56c8c UTKPropertyWindow 완료 2026-02-13 12:23:09 +09:00
logonkhi
15886dc1f9 UTKProperty 버그 수정. Validation 추가 해야 함 2026-02-12 19:30:32 +09:00
logonkhi
85f270fd83 버그 수정 중 2026-02-12 19:18:55 +09:00
logonkhi
93e1423525 UTKInput Validation 기능 추가 2026-02-12 18:04:38 +09:00
logonkhi
df6d3e3b5a UTKProperyItem 수정 중 2026-02-10 20:48:49 +09:00
logonkhi
97bbb789ed UTKFloatStepper 추가. UTKFloatPropertyItem, UTKFloatPropertyItemView에 추가 2026-02-09 20:28:09 +09:00
김형인
a38efd756e Dropdown 샘플코드 갱신. Tab align 기능 추가 2026-02-07 00:15:41 +09:00
logonkhi
a7fc12f32f Dropdown popup 스타일 가이드 적용 및 다중 선택 Dropdown 추가 2026-02-06 19:54:11 +09:00
김형인
18af2fc9c6 UTKIntPropertyItemView, UTKIntRangePropertyItemView UTKNumberStepper 적용 2026-02-06 00:35:15 +09:00
김형인
c1f5d2c208 PropertyItem 수정 중 2026-02-05 23:26:35 +09:00
logonkhi
acd430c5d7 UTKIntPropertyItemView 수정중 2026-02-05 19:12:16 +09:00
logonkhi
c9af0d2d6f UTKPropertyItem 개선 2026-02-04 20:31:52 +09:00
logonkhi
8181eae4c6 UTKProperyWindow 개발 중 2026-02-03 20:43:36 +09:00
logonkhi
297ca29082 UTKProperyWIndow 수정 중 2026-02-02 19:33:27 +09:00
logonkhi
f2d0f3d423 스타일 가이드 1차 완성 2026-01-29 20:14:39 +09:00
logonkhi
097436a8b0 샘플 코드 개선. UTKHelpBox 개선 2026-01-26 20:00:21 +09:00
logonkhi
99f9c3b26d 스타일 가이드 수정 중 2026-01-23 19:04:12 +09:00
logonkhi
59d473c87b UTKAccodion 완료. UTKComponentList 수정 중 2026-01-22 20:12:22 +09:00
logonkhi
e00953de52 기본 Styleguide 완료 2026-01-21 20:43:54 +09:00
logonkhi
fd8f8c6de0 UIToolkit Sample uxml로 전환 2026-01-20 20:18:47 +09:00
logonkhi
ee86f93814 StyleGuide Sample 완료 2026-01-13 20:39:45 +09:00
logonkhi
c8ff7b503d LF 2026-01-13 20:38:46 +09:00
logonkhi
538c8a081e StyleGuide Sample 완료 2026-01-13 20:37:57 +09:00
logonkhi
24e7f038fe StyleGuide Sample 완료 2026-01-13 20:37:26 +09:00
logonkhi
eee00cfad6 StyleGuide Sample 완료 2026-01-13 20:36:55 +09:00
logonkhi
ecbc7e8e4a StyleGuide Sample 완료 2026-01-13 20:36:21 +09:00
logonkhi
ec2a367245 UTKColorPicker, UTKDatePicker 스타일 적용 완료. 주석 및 샘플 코드 추가 2026-01-13 20:35:09 +09:00
logonkhi
e1f2ac5b02 스타일 가이드 적용 완료. UTKCOlorPicker, UTKDatePicker 확인해야 함 2026-01-12 20:16:17 +09:00
logonkhi
6ae48ff30e UIToolkit 스타일 및 입력 컴포넌트 추가
- 기본 스타일을 위한 UTKDefaultStyle.uss파일을 생성했습니다.
- UIToolkit 설정 구성을 위한 UTKSettings.asset 파일을 추가했습니다.
- 포괄적인 색상 정의를 포함하는 다크 및 라이트 테마 스타일(UTKThemeDark.uss, UTKThemeLight.uss)을 도입했습니다.
- 테마에 독립적인 레이아웃 및 크기 변수를 위한 UTKVariables.uss를 구현했습니다.
- 스타일 및 이벤트 처리를 통해 열거형 선택을 위한 사용자 지정 드롭다운 컴포넌트(UTKEnumDropDown)를 개발했습니다.
- 사용자 지정 스타일 및 이벤트 관리를 통해 각각 이중 입력 필드와 긴 입력 필드를 위한 UTKDoubleField 및 UTKLongField 컴포넌트를 생성했습니다.
2026-01-09 18:42:17 +09:00
logonkhi
71831dd4c3 UIToolkit 기본 UI 개발 중 2026-01-08 20:15:57 +09:00
logonkhi
ef4e86820c UTKAccordion 개발 완료. UTKComponentList 완료 2026-01-06 18:51:37 +09:00
logonkhi
b7776f3af0 UTKAccordionList 개발 완료 2026-01-05 16:52:06 +09:00
logonkhi
430fb27a10 UTKImageListWindow 개발 중 2025-12-31 20:02:36 +09:00
logonkhi
91ca3c0468 UTKComponentList, UTKTreeList 완료 2025-12-30 20:38:25 +09:00
logonkhi
a9423b7479 UTKTreeListWindow 개발 중 2025-12-29 20:13:54 +09:00
logonkhi
b5b815170f UIToolkitTreeList 개발 중 2025-12-24 19:05:54 +09:00
logonkhi
a75d48265a 필요 없는 경로 삭제 2025-12-24 18:43:51 +09:00
1230 changed files with 126436 additions and 2789 deletions

View File

@@ -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 ^<?xml version=\"\"1.0\"\" encoding=\"\"utf-8\"\"?^>^<ui:UXML xmlns:ui=\"\"UnityEngine.UIElements\"\" xmlns:utk=\"\"UVC.UIToolkit\"\"^>^<utk:UTKLabel name=\"\"label\"\" text=\"\"Label\"\" class=\"\"utk-property-item-view__label\"\" /^>^<ui:VisualElement name=\"\"value-container\"\" class=\"\"utk-property-item-view__value\"\"^>^</ui:VisualElement^>^</ui:UXML^>\")",
"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": []

2
.github/copilot-instructions.md vendored Normal file
View File

@@ -0,0 +1,2 @@
프로젝트 루트 폴더의 CLAUDE.md를 참조해
답변은 항상 한국어로 작성해

3
.gitignore vendored
View File

@@ -86,4 +86,5 @@ crashlytics-build.properties
.DS_Store
.idea/
.idea/
.vscode/

8
.mcp.json Normal file
View File

@@ -0,0 +1,8 @@
{
"mcpServers": {
"ai-game-developer": {
"type": "http",
"url": "http://localhost:55726"
}
}
}

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: ebf477f3ba4991c439a8729dc21abac7
guid: 025311df5d1d7e54aa8d7ccaf9367bf3
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@@ -0,0 +1,148 @@
#nullable enable
using UnityEditor;
using UnityEngine;
/// <summary>
/// MCP for Unity EditorPrefs 설정 확인 및 수정 도구
/// </summary>
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 에디터를 재시작해주세요.");
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 955b75403593bb74fbf0ba110a3e1b83

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 65214e892d855cf4cb0219bebe3ecfbb
guid: d07e558de63aead44a5de53bc3a61d4d
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@@ -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
{
/// <summary>
/// 이미지 아이콘 폴더를 스캔하여 아이콘 경로 상수 클래스를 자동 생성하는 에디터 도구입니다.
/// </summary>
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<IconInfo>? _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<UTKImageIconsGenerator>("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<Texture2D>(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<IconInfo> GetIconInfos(string folder, bool includeSubfolders)
{
var result = new List<IconInfo>();
var searchOption = includeSubfolders ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
var usedNames = new HashSet<string>();
// 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<IconInfo> icons, string className, string namespaceName, string sourceFolder)
{
var sb = new StringBuilder();
// Resources 폴더 여부 확인
var isInResources = sourceFolder.Contains("Resources");
sb.AppendLine("// <auto-generated>");
sb.AppendLine("// 이 파일은 UTKImageIconsGenerator에 의해 자동 생성되었습니다.");
sb.AppendLine("// 직접 수정하지 마세요. Tools > UTK > Image Icons Generator 메뉴로 재생성하세요.");
sb.AppendLine($"// Source: {sourceFolder}");
sb.AppendLine("// </auto-generated>");
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(" /// <summary>");
sb.AppendLine(" /// 이미지 아이콘 리소스 경로 상수 클래스입니다.");
sb.AppendLine($" /// 총 {icons.Count}개의 아이콘을 포함합니다.");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <example>");
sb.AppendLine(" /// <code>");
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(" /// </code>");
sb.AppendLine(" /// </example>");
sb.AppendLine(" /// <remarks>");
sb.AppendLine(" /// <para><b>UXML에서 사용하기:</b></para>");
sb.AppendLine(" /// <para>UXML에서 이미지 아이콘을 사용하려면 USS에서 background-image를 설정합니다.</para>");
sb.AppendLine(" /// <code>");
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(" /// </code>");
sb.AppendLine(" /// <code>");
sb.AppendLine(" /// <!-- UXML 파일 -->");
sb.AppendLine(" /// <ui:VisualElement class=\"my-icon\" />");
sb.AppendLine(" /// </code>");
sb.AppendLine(" /// <para><b>C# 코드에서 UXML 요소에 이미지 적용:</b></para>");
sb.AppendLine(" /// <code>");
sb.AppendLine($" /// var iconElement = root.Q<VisualElement>(\"my-icon\");");
sb.AppendLine($" /// var texture = {className}.LoadTextureByName(\"icon_setting_22\");");
sb.AppendLine(" /// iconElement.style.backgroundImage = new StyleBackground(texture);");
sb.AppendLine(" /// </code>");
sb.AppendLine(" /// <para><b>Image 요소에서 사용:</b></para>");
sb.AppendLine(" /// <code>");
sb.AppendLine($" /// var image = root.Q<Image>(\"my-image\");");
sb.AppendLine($" /// image.sprite = {className}.LoadSpriteByName(\"btn_close_16\");");
sb.AppendLine(" /// </code>");
sb.AppendLine(" /// </remarks>");
sb.AppendLine($" public static class {className}");
sb.AppendLine(" {");
// 아이콘 경로 상수 생성
foreach (var icon in icons)
{
sb.AppendLine($" /// <summary>{icon.RelativePath}</summary>");
sb.AppendLine($" public const string {icon.FieldName} = \"{icon.ResourcePath}\";");
}
sb.AppendLine();
sb.AppendLine(" #region Lookup & Load");
sb.AppendLine();
// 이름으로 경로 조회 딕셔너리
sb.AppendLine(" private static readonly Dictionary<string, string> _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<string, Sprite?> _spriteCache = new();");
sb.AppendLine(" private static readonly Dictionary<string, Texture2D?> _textureCache = new();");
sb.AppendLine();
// 조회 메서드
sb.AppendLine(" /// <summary>");
sb.AppendLine(" /// 아이콘 이름으로 리소스 경로를 조회합니다.");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <param name=\"iconName\">아이콘 파일명 (확장자 제외)</param>");
sb.AppendLine(" /// <returns>리소스 경로, 없으면 빈 문자열</returns>");
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(" /// <summary>");
sb.AppendLine(" /// 아이콘이 존재하는지 확인합니다.");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" public static bool HasIcon(string iconName) => _pathsByName.ContainsKey(iconName);");
sb.AppendLine();
sb.AppendLine(" /// <summary>");
sb.AppendLine(" /// 모든 아이콘 이름 목록을 반환합니다.");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" public static IEnumerable<string> GetAllIconNames() => _pathsByName.Keys;");
sb.AppendLine();
sb.AppendLine(" /// <summary>");
sb.AppendLine(" /// 리소스 경로로 아이콘 이름을 조회합니다.");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <param name=\"resourcePath\">리소스 경로 (예: Icons/Home)</param>");
sb.AppendLine(" /// <returns>아이콘 이름, 없으면 빈 문자열</returns>");
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(" /// <summary>");
sb.AppendLine(" /// 전체 아이콘 수를 반환합니다.");
sb.AppendLine(" /// </summary>");
sb.AppendLine($" public static int Count => {icons.Count};");
sb.AppendLine();
// 동기 로드 메서드들
sb.AppendLine(" /// <summary>");
sb.AppendLine(" /// 리소스 경로로 Sprite를 동기로 로드합니다. (캐싱됨)");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <param name=\"resourcePath\">리소스 경로 (예: Icons/Home)</param>");
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<Sprite>(resourcePath);");
sb.AppendLine(" _spriteCache[resourcePath] = sprite;");
sb.AppendLine(" return sprite;");
sb.AppendLine(" }");
sb.AppendLine();
sb.AppendLine(" /// <summary>");
sb.AppendLine(" /// 리소스 경로로 Sprite를 비동기로 로드합니다. (캐싱됨)");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <param name=\"resourcePath\">리소스 경로 (예: Icons/Home)</param>");
sb.AppendLine(" /// <param name=\"ct\">취소 토큰</param>");
sb.AppendLine(" public static async UniTask<Sprite?> 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<Sprite>(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(" /// <summary>");
sb.AppendLine(" /// 리소스 경로로 Texture2D를 동기로 로드합니다. (캐싱됨)");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <param name=\"resourcePath\">리소스 경로 (예: Icons/Home)</param>");
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<Texture2D>(resourcePath);");
sb.AppendLine(" _textureCache[resourcePath] = texture;");
sb.AppendLine(" return texture;");
sb.AppendLine(" }");
sb.AppendLine();
sb.AppendLine(" /// <summary>");
sb.AppendLine(" /// 리소스 경로로 Texture2D를 비동기로 로드합니다. (캐싱됨)");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <param name=\"resourcePath\">리소스 경로 (예: Icons/Home)</param>");
sb.AppendLine(" /// <param name=\"ct\">취소 토큰</param>");
sb.AppendLine(" public static async UniTask<Texture2D?> 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<Texture2D>(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(" /// <summary>");
sb.AppendLine(" /// 아이콘 이름으로 Sprite를 동기로 로드합니다. (캐싱됨)");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <param name=\"iconName\">아이콘 파일명 (확장자 제외)</param>");
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(" /// <summary>");
sb.AppendLine(" /// 아이콘 이름으로 Sprite를 비동기로 로드합니다. (캐싱됨)");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <param name=\"iconName\">아이콘 파일명 (확장자 제외)</param>");
sb.AppendLine(" /// <param name=\"ct\">취소 토큰</param>");
sb.AppendLine(" public static async UniTask<Sprite?> 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(" /// <summary>");
sb.AppendLine(" /// 아이콘 이름으로 Texture2D를 동기로 로드합니다. (캐싱됨)");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <param name=\"iconName\">아이콘 파일명 (확장자 제외)</param>");
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(" /// <summary>");
sb.AppendLine(" /// 아이콘 이름으로 Texture2D를 비동기로 로드합니다. (캐싱됨)");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <param name=\"iconName\">아이콘 파일명 (확장자 제외)</param>");
sb.AppendLine(" /// <param name=\"ct\">취소 토큰</param>");
sb.AppendLine(" public static async UniTask<Texture2D?> 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(" /// <summary>");
sb.AppendLine(" /// 캐시를 클리어합니다.");
sb.AppendLine(" /// </summary>");
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<string> 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]));
}
}
}
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 3d7dbdad9e333f4478d838c2d78bb2be

View File

@@ -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
{
/// <summary>
/// MaterialSymbolsOutlinedCodepoints.txt 파일을 파싱하여
/// UTKMaterialIcons.cs 정적 클래스를 자동 생성하는 에디터 도구입니다.
/// </summary>
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<UTKMaterialIconsGenerator>("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<string>();
sb.AppendLine("// <auto-generated>");
sb.AppendLine("// 이 파일은 UTKMaterialIconsGenerator에 의해 자동 생성되었습니다.");
sb.AppendLine("// 직접 수정하지 마세요. Tools > UTK > Material Icons Generator 메뉴로 재생성하세요.");
sb.AppendLine("// </auto-generated>");
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(" /// <summary>");
sb.AppendLine(" /// Material Symbols Outlined 아이콘 유니코드 문자 상수 클래스입니다.");
sb.AppendLine($" /// 총 {icons.Count}개의 아이콘을 포함합니다.");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <example>");
sb.AppendLine(" /// <code>");
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(" /// </code>");
sb.AppendLine(" /// </example>");
sb.AppendLine(" /// <remarks>");
sb.AppendLine(" /// <para><b>UXML에서 사용하기:</b></para>");
sb.AppendLine(" /// <para>UXML에서 Material Icons를 사용하려면 USS에서 폰트를 설정하고, Label의 text에 유니코드 문자를 직접 입력합니다.</para>");
sb.AppendLine(" /// <code>");
sb.AppendLine(" /// /* USS 파일 */");
sb.AppendLine(" /// .material-icon {");
sb.AppendLine(" /// -unity-font: resource('Fonts/Icons/MaterialSymbolsOutlined');");
sb.AppendLine(" /// font-size: 24px;");
sb.AppendLine(" /// }");
sb.AppendLine(" /// </code>");
sb.AppendLine(" /// <code>");
sb.AppendLine(" /// <!-- UXML 파일 -->");
sb.AppendLine(" /// <ui:Label class=\"material-icon\" text=\"&#xe88a;\" /> <!-- home 아이콘 -->");
sb.AppendLine(" /// <ui:Label class=\"material-icon\" text=\"&#xe8b8;\" /> <!-- settings 아이콘 -->");
sb.AppendLine(" /// </code>");
sb.AppendLine(" /// <para><b>C# 코드에서 UXML Label에 아이콘 적용:</b></para>");
sb.AppendLine(" /// <code>");
sb.AppendLine($" /// var iconLabel = root.Q<Label>(\"my-icon\");");
sb.AppendLine($" /// iconLabel.text = {className}.Settings;");
sb.AppendLine($" /// {className}.ApplyIconStyle(iconLabel);");
sb.AppendLine(" /// </code>");
sb.AppendLine(" /// </remarks>");
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(" /// <summary>");
sb.AppendLine(" /// 아이콘 폰트를 동기로 로드합니다. (캐싱됨)");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <returns>로드된 Font, 실패 시 null</returns>");
sb.AppendLine(" public static Font? LoadFont()");
sb.AppendLine(" {");
sb.AppendLine(" if (_cachedFont == null)");
sb.AppendLine(" {");
sb.AppendLine(" _cachedFont = Resources.Load<Font>(FontResourcePath);");
sb.AppendLine(" }");
sb.AppendLine(" return _cachedFont;");
sb.AppendLine(" }");
sb.AppendLine();
sb.AppendLine(" /// <summary>");
sb.AppendLine(" /// 아이콘 폰트를 비동기로 로드합니다. (캐싱됨)");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <param name=\"ct\">취소 토큰</param>");
sb.AppendLine(" /// <returns>로드된 Font, 실패 시 null</returns>");
sb.AppendLine(" public static async UniTask<Font?> 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<Font>(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(" /// <summary>");
sb.AppendLine(" /// UI Toolkit용 StyleFontDefinition을 동기로 반환합니다. (캐싱됨)");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <returns>StyleFontDefinition, 폰트 로드 실패 시 기본값</returns>");
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(" /// <summary>");
sb.AppendLine(" /// UI Toolkit용 StyleFontDefinition을 비동기로 반환합니다. (캐싱됨)");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <param name=\"ct\">취소 토큰</param>");
sb.AppendLine(" /// <returns>StyleFontDefinition, 폰트 로드 실패 시 기본값</returns>");
sb.AppendLine(" public static async UniTask<StyleFontDefinition> 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(" /// <summary>");
sb.AppendLine(" /// VisualElement에 아이콘 폰트 스타일을 동기로 적용합니다.");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <param name=\"element\">스타일을 적용할 요소</param>");
sb.AppendLine(" /// <param name=\"fontSize\">폰트 크기 (기본값: 24)</param>");
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(" /// <summary>");
sb.AppendLine(" /// VisualElement에 아이콘 폰트 스타일을 비동기로 적용합니다.");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <param name=\"element\">스타일을 적용할 요소</param>");
sb.AppendLine(" /// <param name=\"ct\">취소 토큰</param>");
sb.AppendLine(" /// <param name=\"fontSize\">폰트 크기 (기본값: 24)</param>");
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(" /// <summary>");
sb.AppendLine(" /// 폰트 캐시를 클리어합니다.");
sb.AppendLine(" /// </summary>");
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($" /// <summary>{name} (U+{unicode.ToUpper()})</summary>");
sb.AppendLine($" public const string {fieldName} = \"{escapedChar}\";");
}
sb.AppendLine();
sb.AppendLine(" #region Lookup");
sb.AppendLine();
// 이름으로 아이콘 조회 딕셔너리
sb.AppendLine(" private static readonly Dictionary<string, string> _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(" /// <summary>");
sb.AppendLine(" /// 아이콘 이름으로 유니코드 문자를 조회합니다.");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" /// <param name=\"iconName\">아이콘 이름 (예: \"home\", \"settings\")</param>");
sb.AppendLine(" /// <returns>아이콘 문자, 없으면 빈 문자열</returns>");
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(" /// <summary>");
sb.AppendLine(" /// 아이콘이 존재하는지 확인합니다.");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" public static bool HasIcon(string iconName) => _iconsByName.ContainsKey(iconName);");
sb.AppendLine();
sb.AppendLine(" /// <summary>");
sb.AppendLine(" /// 유니코드 문자로 아이콘이 존재하는지 확인합니다.");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" public static bool IsIconChar(string iconChar) => _iconsByName.Values.Contains(iconChar);");
sb.AppendLine();
sb.AppendLine(" /// <summary>");
sb.AppendLine(" /// 유니코드 문자로 아이콘 이름을 조회합니다.");
sb.AppendLine(" /// </summary>");
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(" /// <summary>");
sb.AppendLine(" /// 모든 아이콘 이름 목록을 반환합니다.");
sb.AppendLine(" /// </summary>");
sb.AppendLine(" public static IEnumerable<string> GetAllIconNames() => _iconsByName.Keys;");
sb.AppendLine();
sb.AppendLine(" /// <summary>");
sb.AppendLine(" /// 전체 아이콘 수를 반환합니다.");
sb.AppendLine(" /// </summary>");
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<string> 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();
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: a4f9ee471e14d684aa1d05c88ee24116

View File

@@ -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>();
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.

View File

@@ -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

View File

@@ -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}

View File

@@ -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

View File

@@ -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: []

View File

@@ -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

View File

@@ -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
}
}
}

View File

@@ -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

View File

@@ -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
}
}
}
}

View File

@@ -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

View File

@@ -1,10 +0,0 @@
fileFormatVersion: 2
guid: 932f8193e5396db4babac4756c406dee
folderAsset: yes
timeCreated: 1522559213
licenseType: Store
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,10 +0,0 @@
fileFormatVersion: 2
guid: 2b0040b0ed7fbd64693e9195d13d25f9
folderAsset: yes
timeCreated: 1522615600
licenseType: Store
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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}

View File

@@ -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

View File

@@ -1,10 +0,0 @@
fileFormatVersion: 2
guid: 3916faa55c6a94248959031ee0ad499f
folderAsset: yes
timeCreated: 1522615614
licenseType: Store
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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}

View File

@@ -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

View File

@@ -1,10 +0,0 @@
fileFormatVersion: 2
guid: 3ddbd65d69a9f0b48bab4fe96a1fe099
folderAsset: yes
timeCreated: 1522559122
licenseType: Store
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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<Mesh> registeredMeshes = new HashSet<Mesh>();
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<Vector3> 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<Mesh> bakeKeys = new List<Mesh>();
[SerializeField, HideInInspector]
private List<ListVector3> bakeValues = new List<ListVector3>();
private Renderer[] renderers;
private Material outlineMaskMaterial;
private Material outlineFillMaterial;
private bool needsUpdate;
void Awake() {
// Cache renderers
renderers = GetComponentsInChildren<Renderer>();
// Instantiate outline materials
outlineMaskMaterial = Instantiate(Resources.Load<Material>(@"Materials/OutlineMask"));
outlineFillMaterial = Instantiate(Resources.Load<Material>(@"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<Mesh>();
foreach (var meshFilter in GetComponentsInChildren<MeshFilter>()) {
// 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<MeshFilter>()) {
// 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<Renderer>();
if (renderer != null) {
CombineSubmeshes(meshFilter.sharedMesh, renderer.sharedMaterials);
}
}
// Clear UV3 on skinned mesh renderers
foreach (var skinnedMeshRenderer in GetComponentsInChildren<SkinnedMeshRenderer>()) {
// 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<Vector3> SmoothNormals(Mesh mesh) {
// Group vertices by location
var groups = mesh.vertices.Select((vertex, index) => new KeyValuePair<Vector3, int>(vertex, index)).GroupBy(pair => pair.Key);
// Copy normals to a new list
var smoothNormals = new List<Vector3>(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;
}
}
}

View File

@@ -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

View File

@@ -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
}

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: a8692d97c02ffec48bc8f9f568e868a5
guid: 5ecf6949f73508f49ba3a0633329a219
TextScriptImporter:
externalObjects: {}
userData:

View File

@@ -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

View File

@@ -1,8 +1,6 @@
fileFormatVersion: 2
guid: 80ac8e52d3c31a94babd161e86bc6b97
guid: 35623d99e7e18de4c9218b9878efaac6
folderAsset: yes
timeCreated: 1522559139
licenseType: Store
DefaultImporter:
externalObjects: {}
userData:

View File

@@ -1,8 +1,6 @@
fileFormatVersion: 2
guid: 6a63caa2b0e993043a42c11f35ff2d1a
guid: 9ffd6459fed612148ac685b6329657a1
folderAsset: yes
timeCreated: 1522559134
licenseType: Store
DefaultImporter:
externalObjects: {}
userData:

View File

@@ -0,0 +1,5 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xmlns:utk="UVC.UIToolkit" editor-extension-mode="False">
<ui:VisualElement name="root" style="padding-left: 20px;">
<utk:UTKLabel text="알람 정보"/>
</ui:VisualElement>
</ui:UXML>

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 92f820b7de9d43c428503b7c574c9e69
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}

View File

@@ -0,0 +1,5 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xmlns:utk="UVC.UIToolkit" editor-extension-mode="False">
<ui:VisualElement name="root" style="padding-left: 20px;">
<utk:UTKReordableTabList name="tab-list" style="background-color: transparent; border-width: 0; padding: 0;" />
</ui:VisualElement>
</ui:UXML>

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: db6157353e844a84fabf731aed504f56
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}

View File

@@ -0,0 +1,5 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xmlns:utk="UVC.UIToolkit" editor-extension-mode="False">
<ui:VisualElement name="root" style="padding-left: 20px;">
<utk:UTKLabel text="일반 정보"/>
</ui:VisualElement>
</ui:UXML>

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 7b805d40178aceb48b21275834afbb24
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}

View File

@@ -0,0 +1,5 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xmlns:utk="UVC.UIToolkit" editor-extension-mode="False">
<ui:VisualElement name="root" style="padding-left: 20px;">
<utk:UTKLabel text="입력 정보"/>
</ui:VisualElement>
</ui:UXML>

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 5224fd32ba226a340aaac4e6dc070861
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}

View File

@@ -1,8 +1,6 @@
fileFormatVersion: 2
guid: 70fd40674751a8042a8b9b2e8d9f915f
guid: 1f3edc5b32ba94941ac6f2897a9cbf45
folderAsset: yes
timeCreated: 1522559128
licenseType: Store
DefaultImporter:
externalObjects: {}
userData:

View File

@@ -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:

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: cba8cf29ff1a3af4c951dc8785008b52
guid: 76e3b660a1fc448428151d868fcb09c5
TextScriptImporter:
externalObjects: {}
userData:

View File

@@ -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":[]}

View File

@@ -1 +0,0 @@
{"MeasurementCount":-1}

View File

@@ -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:

View File

@@ -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;
}
} */

View File

@@ -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; /* 호버 애니메이션 */
}

View File

@@ -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;

View File

@@ -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}

View File

@@ -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}

View File

@@ -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;

View File

@@ -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:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 036922f6ebd1fc246b7f9dcbed76951d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 523651d33563a6e4eb5a39945fe0017f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xmlns:utk="UVC.UIToolkit" editor-extension-mode="False">
<ui:VisualElement name="root" style="padding-left: 20px;">
<utk:UTKInputField label="Database IP" value="127.0.0.3" label-min-width="200" style="width: 400px;" />
<utk:UTKInputField label="Database PORT" value="3304" label-min-width="200" style="width: 400px;" />
<utk:UTKInputField label="Database ID" value="" label-min-width="200" style="width: 400px;" />
<utk:UTKInputField label="Database PASSWORD" value="" is-password-field="true" label-min-width="200" style="width: 400px;" />
</ui:VisualElement>
</ui:UXML>

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: d27b20f78aec0354b8b97b9af0765701
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}

View File

@@ -0,0 +1,24 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xmlns:utk="UVC.UIToolkit" editor-extension-mode="False">
<ui:VisualElement name="root" style="padding-left: 20px;">
<ui:VisualElement style="flex-direction: row;">
<utk:UTKIntegerField label="Auto Save Time" value="5" label-min-width="200" style="width: 400px;margin-right: 5px;" />
<utk:UTKLabel text="Minutes" />
</ui:VisualElement>
<ui:VisualElement style="flex-direction: row;">
<utk:UTKFloatField label="Grid Spacing" value="1" label-min-width="200" style="width: 400px;margin-right: 5px;" />
<utk:UTKLabel text="Meters" />
</ui:VisualElement>
<ui:VisualElement name="VisualElement" style="flex-direction: row;">
<utk:UTKFloatField label="Position Snap" value="0.5" label-min-width="200" style="width: 400px;margin-right: 5px;" />
<utk:UTKLabel text="Meters" />
</ui:VisualElement>
<ui:VisualElement style="flex-direction: row;">
<utk:UTKFloatField label="Rotation Snap" value="10" label-min-width="200" style="width: 400px;margin-right: 5px;" />
<utk:UTKLabel text="Meters" />
</ui:VisualElement>
<ui:VisualElement style="flex-direction: row;">
<utk:UTKFloatField label="Scale Snap" value="0.5" label-min-width="200" style="width: 400px;margin-right: 5px;" />
<utk:UTKLabel text="Meters" />
</ui:VisualElement>
</ui:VisualElement>
</ui:UXML>

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 0a709a335acffbd4c9d4358c153fad81
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}

View File

@@ -0,0 +1,5 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xmlns:utk="UVC.UIToolkit" editor-extension-mode="False">
<ui:VisualElement name="root" style="padding-left: 10px;">
<utk:UTKShortcutList name="window" style="background-color: transparent;" />
</ui:VisualElement>
</ui:UXML>

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: dcdd51dd452d3e94ca374da0307608a4
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 166e6c1e42c1dee4a836845108ff7782
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 0c207fd08d36fad46b095869721794d7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 68a77a858a5c1ce44832e5b9580b80de
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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);
}

View File

@@ -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

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 31176a3f98a362d4283ac94b4d603372
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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

View File

@@ -0,0 +1,10 @@
/* UTKImage 기본 스타일 */
.utk-image {
overflow: hidden;
-unity-background-scale-mode: scale-to-fit;
}
/* 로딩 상태 */
.utk-image--loading {
opacity: 0.5;
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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

View File

@@ -0,0 +1,6 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
<Style src="UTKTooltip.uss" />
<ui:VisualElement name="tooltip-container" class="utk-tooltip-container" picking-mode="Ignore">
<ui:Label name="tooltip-label" class="utk-tooltip-label" picking-mode="Ignore" />
</ui:VisualElement>
</ui:UXML>

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: f473e51c9a54d0842a93597f537a6d8b
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c4f4597de9fcbbf42b0ae7a69db1d5c3
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<ui:UXML
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ui="UnityEngine.UIElements"
xmlns:uie="UnityEditor.UIElements"
xsi:noNamespaceSchemaLocation="../../../../UIElementsSchema/UIElements.xsd"
>
</ui:UXML>

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 388c12cc6f747a3409725653495a6501
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<ui:UXML
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ui="UnityEngine.UIElements"
xmlns:uie="UnityEditor.UIElements"
xsi:noNamespaceSchemaLocation="../../../../UIElementsSchema/UIElements.xsd"
>
</ui:UXML>

Some files were not shown because too many files have changed in this diff Show More