Merge branch 'DO-32-코인-서버-연동' of https://github.com/Degulleo/DegullMok-Client into DO-32-코인-서버-연동

This commit is contained in:
Jay 2025-03-14 22:07:00 +09:00
commit 9ab68d8e2b
13 changed files with 2835 additions and 419 deletions

View File

@ -0,0 +1,4 @@
org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M
org.gradle.parallel=true
unityStreamingAssets=**STREAMING_ASSETS**
**ADDITIONAL_PROPERTIES**

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 57bd9c046524f634fb28feaee6e8bfad
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,41 @@
apply plugin: 'com.android.library'
**APPLY_PLUGINS**
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
**DEPS**}
android {
namespace "com.unity3d.player"
ndkPath "**NDKPATH**"
compileSdkVersion **APIVERSION**
buildToolsVersion '**BUILDTOOLS**'
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
defaultConfig {
minSdkVersion **MINSDKVERSION**
targetSdkVersion **TARGETSDKVERSION**
ndk {
abiFilters **ABIFILTERS**
}
versionCode **VERSIONCODE**
versionName '**VERSIONNAME**'
consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD**
}
lintOptions {
abortOnError false
}
aaptOptions {
noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ')
ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~"
}**PACKAGING_OPTIONS**
}
**IL_CPP_BUILD_SETUP**
**SOURCE_BUILD_SETUP**
**EXTERNAL_SOURCES**

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 383d67e8b46371e4997c32d24e1c5340
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -58,7 +58,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.17254902, g: 0.21568628, b: 0.34901962, a: 1}
m_Color: {r: 0.119200125, g: 0.9245283, b: 0.67288977, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
@ -133,7 +133,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.17254902, g: 0.21568628, b: 0.34901962, a: 1}
m_Color: {r: 0.119200125, g: 0.9245283, b: 0.67288977, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
@ -160,6 +160,7 @@ GameObject:
m_Component:
- component: {fileID: 4060305112283542636}
- component: {fileID: 8984618795075575334}
- component: {fileID: 2222382815855860034}
m_Layer: 5
m_Name: Timer
m_TagString: Untagged
@ -208,6 +209,45 @@ MonoBehaviour:
headCapImage: {fileID: 3995031286537022070}
tailCapImage: {fileID: 3282082939413405386}
timeText: {fileID: 1414465240440161498}
--- !u!114 &2222382815855860034
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5197632138137602266}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2eb8d899eaaa7614cbb7b1fdb98d0dd7, type: 3}
m_Name:
m_EditorClassIdentifier:
colorSettings:
- targetObject: {fileID: 8836467620212376791}
componentType: Image
color: {r: 1, g: 1, b: 1, a: 1}
applyToChildren: 0
colorableComponent: {fileID: 4727671169278371324}
- targetObject: {fileID: 3197710723148271819}
componentType: Image
color: {r: 0.119200125, g: 0.9245283, b: 0.67288977, a: 1}
applyToChildren: 0
colorableComponent: {fileID: 337344169386659086}
- targetObject: {fileID: 6184671321993608803}
componentType: TMP_Text
color: {r: 0.119200125, g: 0.9245283, b: 0.67288977, a: 1}
applyToChildren: 0
colorableComponent: {fileID: 1414465240440161498}
- targetObject: {fileID: 880875562942959157}
componentType: Image
color: {r: 0.119200125, g: 0.9245283, b: 0.67288977, a: 1}
applyToChildren: 0
colorableComponent: {fileID: 3995031286537022070}
- targetObject: {fileID: 8065228685685210519}
componentType: Image
color: {r: 0.119200125, g: 0.9245283, b: 0.67288977, a: 1}
applyToChildren: 0
colorableComponent: {fileID: 3282082939413405386}
autoDetectChildren: 1
--- !u!1 &6184671321993608803
GameObject:
m_ObjectHideFlags: 0
@ -282,8 +322,8 @@ MonoBehaviour:
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4284036908
m_fontColor: {r: 0.17254902, g: 0.21568628, b: 0.34901962, a: 1}
rgba: 4289522718
m_fontColor: {r: 0.119200125, g: 0.9245283, b: 0.67288977, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
@ -400,7 +440,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.17254902, g: 0.21568628, b: 0.34901962, a: 1}
m_Color: {r: 0.119200125, g: 0.9245283, b: 0.67288977, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
@ -475,7 +515,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.9490196, g: 0.9490196, b: 0.9490196, a: 1}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1

View File

@ -37,7 +37,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 50, y: -100}
m_SizeDelta: {x: 228, y: 125.900024}
m_SizeDelta: {x: 228, y: 188.85}
m_Pivot: {x: 0, y: 1}
--- !u!222 &4747539784995484548
CanvasRenderer:
@ -196,10 +196,10 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
m_Name:
m_EditorClassIdentifier:
m_UiScaleMode: 0
m_UiScaleMode: 1
m_ReferencePixelsPerUnit: 100
m_ScaleFactor: 1
m_ReferenceResolution: {x: 800, y: 600}
m_ReferenceResolution: {x: 1920, y: 1080}
m_ScreenMatchMode: 0
m_MatchWidthOrHeight: 0
m_PhysicalUnit: 3
@ -224,6 +224,44 @@ MonoBehaviour:
m_BlockingMask:
serializedVersion: 2
m_Bits: 4294967295
--- !u!1 &638907547342607085
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6209444297678801107}
m_Layer: 5
m_Name: Player Div
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6209444297678801107
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 638907547342607085}
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: 8758049298581854606}
- {fileID: 2785359725927864505}
- {fileID: 1286412008661516750}
m_Father: {fileID: 8942070830740152784}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: -600, y: 335}
m_Pivot: {x: 0.5, y: 0}
--- !u!1 &2180157736785062510
GameObject:
m_ObjectHideFlags: 0
@ -284,7 +322,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 0.3679244, b: 0.49593952, a: 1}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
@ -292,7 +330,7 @@ MonoBehaviour:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 1
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
@ -406,17 +444,14 @@ RectTransform:
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 8758049298581854606}
- {fileID: 2785359725927864505}
- {fileID: 1286412008661516750}
- {fileID: 1250546304786973426}
- {fileID: 2039662309230983458}
- {fileID: 451599240785790819}
- {fileID: 6209444297678801107}
m_Father: {fileID: 6113787613246818512}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMax: {x: 0.5, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 1080, y: 500}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 0, y: 100}
m_SizeDelta: {x: 0, y: 500}
m_Pivot: {x: 0.5, y: 0}
--- !u!222 &870318249725167959
CanvasRenderer:
@ -439,7 +474,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.78798443, g: 0.26167864, b: 0.8238993, a: 1}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
@ -481,19 +516,19 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2964396940857713075}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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: 3482171304034939411}
m_Father: {fileID: 8942070830740152784}
m_Father: {fileID: 451599240785790819}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: -0.000061035156, y: 0}
m_SizeDelta: {x: 540, y: 120}
m_Pivot: {x: 0, y: 1}
m_Pivot: {x: 0, y: 0.5}
--- !u!222 &2606606041086763757
CanvasRenderer:
m_ObjectHideFlags: 0
@ -832,13 +867,13 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2627969753235636098}
m_Father: {fileID: 8942070830740152784}
m_Father: {fileID: 6209444297678801107}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMax: {x: 0.5, y: 0}
m_AnchoredPosition: {x: 0, y: 100}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 250, y: 250}
m_Pivot: {x: 0.5, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7235566515169572492
CanvasRenderer:
m_ObjectHideFlags: 0
@ -1214,20 +1249,20 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4670535236205086833}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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: 7503863592388163661}
- {fileID: 6390176559788333322}
m_Father: {fileID: 8942070830740152784}
m_Father: {fileID: 6209444297678801107}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 50, y: 40}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 250, y: 300}
m_Pivot: {x: 0, y: 0}
m_Pivot: {x: 0, y: 0.5}
--- !u!1 &5258332010899716781
GameObject:
m_ObjectHideFlags: 0
@ -1251,20 +1286,20 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5258332010899716781}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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: 469323470332872332}
- {fileID: 380278372965382015}
m_Father: {fileID: 8942070830740152784}
m_Father: {fileID: 6209444297678801107}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: -50, y: 40}
m_AnchorMin: {x: 1, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 250, y: 300}
m_Pivot: {x: 1, y: 0}
m_Pivot: {x: 1, y: 0.5}
--- !u!1 &5273637481048279427
GameObject:
m_ObjectHideFlags: 0
@ -1633,19 +1668,19 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8214827650714712775}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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: 4790269285780218839}
m_Father: {fileID: 8942070830740152784}
m_Father: {fileID: 451599240785790819}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchorMin: {x: 1, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 540, y: 120}
m_Pivot: {x: 1, y: 1}
m_Pivot: {x: 1, y: 0.5}
--- !u!222 &4536082858370354248
CanvasRenderer:
m_ObjectHideFlags: 0
@ -1684,6 +1719,43 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &8622821704889965313
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 451599240785790819}
m_Layer: 5
m_Name: Indicator Div
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &451599240785790819
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8622821704889965313}
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: 1250546304786973426}
- {fileID: 2039662309230983458}
m_Father: {fileID: 8942070830740152784}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: -300, y: 120}
m_Pivot: {x: 0.5, y: 1}
--- !u!1001 &4056566997434591085
PrefabInstance:
m_ObjectHideFlags: 0

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,22 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Camera))]
public class CameraController : MonoBehaviour
{
[SerializeField] private float widthUnit = 6f;
private Camera _camera;
void Start()
{
_camera = GetComponent<Camera>();
_camera.orthographicSize = widthUnit / _camera.aspect / 2;
}
void Update()
{
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a98355720bed2234fb32d55fc1b0cce6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d8268e93b195495ebd68dffa2b3b5aaa
timeCreated: 1741935635

View File

@ -0,0 +1,357 @@
using UnityEngine;
using System.Collections.Generic;
using TMPro;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.SceneManagement;
using System.Linq;
#endif
// 하위 요소들의 색상을 인스펙터에서 수정할 수 있게 해주는 컴포넌트
public class FioChildColorEditor : MonoBehaviour
{
// 인스펙터에서 수정할 색상 정보
[System.Serializable]
public class ColorSettings
{
public GameObject targetObject; // 직접 오브젝트 참조
public string componentType; // 컴포넌트 타입 (읽기 전용)
public Color color = Color.white; // 적용할 색상
public bool applyToChildren = false; // 해당 요소의 모든 하위 요소에도 적용할지 여부
[HideInInspector]
public Component colorableComponent; // 색상을 적용할 컴포넌트 참조
}
// 인스펙터에서 편집할 색상 목록
public List<ColorSettings> colorSettings = new List<ColorSettings>();
// 자동 감지 옵션
public bool autoDetectChildren = true;
// 지원되는 컴포넌트 유형들
private static readonly System.Type[] supportedTypes = new System.Type[]
{
typeof(Renderer),
typeof(SpriteRenderer),
typeof(UnityEngine.UI.Image),
typeof(UnityEngine.UI.RawImage),
typeof(UnityEngine.UI.Text),
typeof(TMP_Text)
};
// 초기화 시 하위 요소 자동 감지
private void OnValidate()
{
if (autoDetectChildren)
{
DetectChildComponents();
}
// 모든 항목에 대해 컴포넌트 타입 업데이트
UpdateComponentTypes();
}
// 하위 요소 자동 감지
public void DetectChildComponents()
{
// 현재 목록을 유지할 오브젝트들
HashSet<GameObject> existingObjects = new HashSet<GameObject>();
foreach (var setting in colorSettings)
{
if (setting.targetObject != null)
{
existingObjects.Add(setting.targetObject);
}
}
// 모든 자식 오브젝트 검색
List<ColorSettings> newSettings = new List<ColorSettings>();
foreach (Transform child in transform)
{
// 이미 목록에 있는 오브젝트는 건너뛰기
if (existingObjects.Contains(child.gameObject))
{
continue;
}
// 지원되는 컴포넌트 찾기
Component colorableComponent = FindColorableComponent(child.gameObject);
if (colorableComponent != null)
{
ColorSettings setting = new ColorSettings
{
targetObject = child.gameObject,
colorableComponent = colorableComponent,
color = GetCurrentColor(colorableComponent)
};
newSettings.Add(setting);
}
}
// 새로운 항목 추가 (기존 항목은 유지)
colorSettings.AddRange(newSettings);
// 컴포넌트 타입 업데이트
UpdateComponentTypes();
}
// 컴포넌트 타입 문자열 업데이트
private void UpdateComponentTypes()
{
foreach (var setting in colorSettings)
{
if (setting.targetObject != null)
{
// 컴포넌트 찾기
Component comp = setting.colorableComponent;
if (comp == null)
{
comp = FindColorableComponent(setting.targetObject);
setting.colorableComponent = comp;
}
if (comp != null)
{
setting.componentType = GetComponentTypeName(comp);
}
else
{
setting.componentType = "지원되지 않음";
}
}
else
{
setting.componentType = "없음";
}
}
}
// 컴포넌트 타입 이름 얻기
private string GetComponentTypeName(Component component)
{
if (component is Renderer) return "Renderer";
if (component is SpriteRenderer) return "SpriteRenderer";
if (component is UnityEngine.UI.Image) return "Image";
if (component is UnityEngine.UI.RawImage) return "RawImage";
if (component is UnityEngine.UI.Text) return "Text";
if (component is TMP_Text) return "TMP_Text";
return component.GetType().Name;
}
// 색상을 적용할 수 있는 컴포넌트 찾기
private Component FindColorableComponent(GameObject obj)
{
foreach (var type in supportedTypes)
{
Component comp = obj.GetComponent(type);
if (comp != null)
{
return comp;
}
}
return null;
}
// 현재 색상 가져오기
private Color GetCurrentColor(Component component)
{
if (component is Renderer renderer)
{
return renderer.material.color;
}
else if (component is SpriteRenderer spriteRenderer)
{
return spriteRenderer.color;
}
else if (component is UnityEngine.UI.Graphic graphic)
{
return graphic.color;
}
else if (component is TMP_Text tmpText)
{
return tmpText.color;
}
return Color.white;
}
// 색상을 적용하는 함수
public void ApplyColors()
{
foreach (var setting in colorSettings)
{
if (setting.targetObject != null)
{
ApplyColorToObject(setting.targetObject, setting.color, setting.applyToChildren);
}
}
}
// 특정 오브젝트에 색상 적용
private void ApplyColorToObject(GameObject obj, Color color, bool applyToChildren)
{
// 렌더러
Renderer renderer = obj.GetComponent<Renderer>();
if (renderer != null)
{
renderer.material.color = color;
}
// 스프라이트 렌더러
SpriteRenderer spriteRenderer = obj.GetComponent<SpriteRenderer>();
if (spriteRenderer != null)
{
spriteRenderer.color = color;
}
// UI 이미지
UnityEngine.UI.Image image = obj.GetComponent<UnityEngine.UI.Image>();
if (image != null)
{
image.color = color;
}
// UI 로우 이미지
UnityEngine.UI.RawImage rawImage = obj.GetComponent<UnityEngine.UI.RawImage>();
if (rawImage != null)
{
rawImage.color = color;
}
// UI 텍스트
UnityEngine.UI.Text text = obj.GetComponent<UnityEngine.UI.Text>();
if (text != null)
{
text.color = color;
}
// TextMeshPro 텍스트
TMP_Text tmpText = obj.GetComponent<TMP_Text>();
if (tmpText != null)
{
tmpText.color = color;
}
// 하위 요소에도 재귀적으로 색상 적용
if (applyToChildren)
{
foreach (Transform child in obj.transform)
{
ApplyColorToObject(child.gameObject, color, true);
}
}
}
}
#if UNITY_EDITOR
// 에디터 인스펙터 커스터마이징
[CustomEditor(typeof(FioChildColorEditor))]
public class ChildColorEditorInspector : Editor
{
private SerializedProperty colorSettingsProperty;
private SerializedProperty autoDetectChildrenProperty;
private void OnEnable()
{
colorSettingsProperty = serializedObject.FindProperty("colorSettings");
autoDetectChildrenProperty = serializedObject.FindProperty("autoDetectChildren");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
FioChildColorEditor colorEditor = (FioChildColorEditor)target;
// 자동 감지 옵션
EditorGUILayout.PropertyField(autoDetectChildrenProperty, new GUIContent("자동 하위 요소 감지"));
// 새로고침 버튼
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("하위 요소 새로 감지", GUILayout.Height(30)))
{
colorEditor.DetectChildComponents();
serializedObject.Update();
}
if (GUILayout.Button("목록 초기화", GUILayout.Height(30)))
{
colorSettingsProperty.ClearArray();
colorEditor.DetectChildComponents();
serializedObject.Update();
}
EditorGUILayout.EndHorizontal();
// 구분선 추가
EditorGUILayout.Space();
EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
// 목록 타이틀
EditorGUILayout.LabelField("하위 요소 색상 설정", EditorStyles.boldLabel);
// 각 항목 표시
for (int i = 0; i < colorSettingsProperty.arraySize; i++)
{
SerializedProperty itemProperty = colorSettingsProperty.GetArrayElementAtIndex(i);
SerializedProperty targetObjectProperty = itemProperty.FindPropertyRelative("targetObject");
SerializedProperty componentTypeProperty = itemProperty.FindPropertyRelative("componentType");
SerializedProperty colorProperty = itemProperty.FindPropertyRelative("color");
SerializedProperty applyToChildrenProperty = itemProperty.FindPropertyRelative("applyToChildren");
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
// 왼쪽에 오브젝트 선택 필드, 오른쪽에 컴포넌트 타입 표시
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PropertyField(targetObjectProperty, GUIContent.none, GUILayout.ExpandWidth(true));
GUI.enabled = false;
EditorGUILayout.TextField(componentTypeProperty.stringValue, GUILayout.Width(100));
GUI.enabled = true;
if (GUILayout.Button("✕", GUILayout.Width(20)))
{
colorSettingsProperty.DeleteArrayElementAtIndex(i);
serializedObject.ApplyModifiedProperties();
break;
}
EditorGUILayout.EndHorizontal();
// 색상과 하위 요소 적용 옵션
EditorGUILayout.PropertyField(colorProperty);
EditorGUILayout.PropertyField(applyToChildrenProperty, new GUIContent("하위 요소에도 적용"));
EditorGUILayout.EndVertical();
EditorGUILayout.Space();
}
// 항목 추가 버튼
if (GUILayout.Button("항목 추가"))
{
colorSettingsProperty.arraySize++;
serializedObject.ApplyModifiedProperties();
}
// 구분선 추가
EditorGUILayout.Space();
EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
EditorGUILayout.Space();
// 색상 적용 버튼 추가
if (GUILayout.Button("모든 색상 적용하기", GUILayout.Height(40)))
{
colorEditor.ApplyColors();
// 씬 변경 사항 저장
EditorUtility.SetDirty(target);
if (!Application.isPlaying)
{
EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
}
}
serializedObject.ApplyModifiedProperties();
}
}
#endif

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2eb8d899eaaa7614cbb7b1fdb98d0dd7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<projectSettings>
<projectSetting name="GooglePlayServices.UseJetifier" value="True" />
</projectSettings>