Files
XRLib/Assets/Sample/PropertyWindowGroupSample.cs

289 lines
9.0 KiB
C#
Raw Normal View History

2025-12-08 21:06:05 +09:00
using System;
using System.Collections.Generic;
using UnityEngine;
using UVC.UI.Tooltip;
using UVC.UI.Window.PropertyWindow;
/// <summary>
/// PropertyWindow의 그룹 기능과 혼용 방식을 테스트하는 샘플입니다.
/// </summary>
public class PropertyWindowGroupSample : MonoBehaviour
{
[Header("Sample Mode")]
[SerializeField] private SampleMode _sampleMode = SampleMode.Mixed;
private enum SampleMode
{
Legacy, // 기존 방식 (그룹 없이 flat)
GroupOnly, // 그룹만 사용
Mixed // 혼용 방식
}
void Start()
{
TooltipManager.Instance.Initialize();
switch (_sampleMode)
{
case SampleMode.Legacy:
LoadLegacySample();
break;
case SampleMode.GroupOnly:
LoadGroupOnlySample();
break;
case SampleMode.Mixed:
LoadMixedSample();
break;
}
// 이벤트 핸들러 등록
PropertyWindow.Instance.PropertyValueChanged += OnPropertyValueChanged;
PropertyWindow.Instance.GroupExpandedChanged += OnGroupExpandedChanged;
}
/// <summary>
/// [기존 방식] 그룹 없이 속성 목록을 로드합니다.
/// </summary>
private void LoadLegacySample()
{
Debug.Log("[PropertyWindowGroupSample] Legacy 방식으로 로드합니다.");
PropertyWindow.Instance.LoadProperties(new List<IPropertyItem>
{
new StringProperty("name", "Name", "Object1"),
new IntProperty("count", "Count", 10),
new BoolProperty("active", "Active", true),
new ColorProperty("color", "Color", Color.white)
});
}
/// <summary>
/// [그룹 방식] 그룹으로만 속성을 로드합니다.
/// </summary>
private void LoadGroupOnlySample()
{
Debug.Log("[PropertyWindowGroupSample] Group 방식으로 로드합니다.");
var groups = new List<IPropertyGroup>
{
CreateTransformGroup(),
CreateRenderingGroup(),
CreatePhysicsGroup()
};
PropertyWindow.Instance.LoadGroupedProperties(groups);
}
/// <summary>
/// [혼용 방식] 그룹과 개별 아이템을 혼용하여 로드합니다.
/// </summary>
private void LoadMixedSample()
{
Debug.Log("[PropertyWindowGroupSample] Mixed 방식으로 로드합니다.");
var entries = new List<IPropertyEntry>
{
// 상단에 그룹 없는 기본 정보 (Order: 0, 1)
new StringProperty("id", "ID", "OBJ_001") { Order = 0 },
new StringProperty("name", "Name", "MyGameObject") { Order = 1 },
// Transform 그룹 (Order: 2)
CreateTransformGroup(2),
// 중간에 그룹 없는 아이템 (Order: 3)
new BoolProperty("locked", "Locked", false)
{
Order = 3,
Description = "잠금 상태입니다. 잠금 시 수정할 수 없습니다.",
Tooltip = "객체 잠금 토글"
},
// Rendering 그룹 (Order: 4)
CreateRenderingGroup(4),
// Physics 그룹 (Order: 5, 기본적으로 접힌 상태)
CreatePhysicsGroup(5, false),
// 하단에 그룹 없는 아이템 (Order: 6)
new StringProperty("tags", "Tags", "Player, Movable")
{
Order = 6,
Description = "쉼표로 구분된 태그 목록"
}
};
PropertyWindow.Instance.LoadMixedProperties(entries);
}
#region Group Factory Methods
private PropertyGroup CreateTransformGroup(int order = 0)
{
var group = new PropertyGroup("transform", "Transform", order, true);
group.AddItems(new IPropertyItem[]
{
new Vector3Property("position", "Position", Vector3.zero)
{
Tooltip = "월드 좌표계에서의 위치"
},
new Vector3Property("rotation", "Rotation", Vector3.zero)
{
Tooltip = "오일러 각도 (도)"
},
new Vector3Property("scale", "Scale", Vector3.one)
{
Tooltip = "로컬 스케일"
}
});
return group;
}
private PropertyGroup CreateRenderingGroup(int order = 0)
{
var group = new PropertyGroup("rendering", "Rendering", order, true);
group.AddItems(new IPropertyItem[]
{
new BoolProperty("visible", "Visible", true)
{
Tooltip = "렌더링 활성화 여부"
},
new ColorProperty("color", "Color", Color.white)
{
Description = "메인 색상"
},
new FloatProperty("alpha", "Alpha", 1.0f, true, 0f, 1f)
{
Tooltip = "투명도 (0: 투명, 1: 불투명)"
},
new EnumProperty("layer", "Layer", RenderLayer.Default)
{
Description = "렌더링 레이어"
}
});
return group;
}
private PropertyGroup CreatePhysicsGroup(int order = 0, bool isExpanded = true)
{
var group = new PropertyGroup("physics", "Physics", order, isExpanded);
group.AddItems(new IPropertyItem[]
{
new BoolProperty("usePhysics", "Use Physics", false)
{
Tooltip = "물리 시뮬레이션 사용 여부"
},
new FloatProperty("mass", "Mass", 1.0f, true, 0.1f, 100f)
{
Description = "질량 (kg)"
},
new FloatProperty("drag", "Drag", 0.0f, true, 0f, 10f)
{
Tooltip = "공기 저항"
},
new BoolProperty("useGravity", "Use Gravity", true)
});
return group;
}
#endregion
#region Event Handlers
private void OnPropertyValueChanged(object sender, PropertyValueChangedEventArgs e)
{
Debug.Log($"[PropertyChanged] Id: {e.PropertyId}, Type: {e.PropertyType}, Value: {e.OldValue} -> {e.NewValue}");
}
private void OnGroupExpandedChanged(object sender, PropertyGroupExpandedEventArgs e)
{
Debug.Log($"[GroupExpanded] Group: {e.Group.GroupName}, Expanded: {e.WasExpanded} -> {e.IsExpanded}");
}
#endregion
#region Dynamic API Test Methods
/// <summary>
/// 런타임에 그룹을 추가하는 테스트 메서드입니다.
/// </summary>
[ContextMenu("Add Debug Group")]
public void AddDebugGroup()
{
var debugGroup = new PropertyGroup("debug", "Debug Settings", 10, true);
debugGroup.AddItems(new IPropertyItem[]
{
new BoolProperty("showGizmos", "Show Gizmos", false),
new BoolProperty("logEnabled", "Enable Logging", true),
new IntProperty("logLevel", "Log Level", 1, true, 0, 3)
});
PropertyWindow.Instance.AddGroup(debugGroup);
Debug.Log("[PropertyWindowGroupSample] Debug 그룹이 추가되었습니다.");
}
/// <summary>
/// 런타임에 개별 속성을 추가하는 테스트 메서드입니다.
/// </summary>
[ContextMenu("Add Single Property")]
public void AddSingleProperty()
{
var timestamp = DateTime.Now.ToString("HHmmss");
PropertyWindow.Instance.AddProperty(
new StringProperty($"dynamic_{timestamp}", $"Dynamic Property ({timestamp})", "New Value")
{
Order = 100
}
);
Debug.Log("[PropertyWindowGroupSample] 개별 속성이 추가되었습니다.");
}
/// <summary>
/// 기존 그룹에 속성을 추가하는 테스트 메서드입니다.
/// </summary>
[ContextMenu("Add Property to Transform Group")]
public void AddPropertyToTransformGroup()
{
PropertyWindow.Instance.AddPropertyToGroup(
"transform",
new Vector3Property("pivot", "Pivot", new Vector3(0.5f, 0.5f, 0.5f))
{
Description = "피벗 포인트"
},
"Transform" // 그룹이 없을 경우 생성될 이름
);
Debug.Log("[PropertyWindowGroupSample] Transform 그룹에 속성이 추가되었습니다.");
}
/// <summary>
/// 그룹을 토글하는 테스트 메서드입니다.
/// </summary>
[ContextMenu("Toggle Transform Group")]
public void ToggleTransformGroup()
{
PropertyWindow.Instance.ToggleGroupExpanded("transform");
}
#endregion
private void OnDestroy()
{
if (PropertyWindow.Instance != null)
{
PropertyWindow.Instance.PropertyValueChanged -= OnPropertyValueChanged;
PropertyWindow.Instance.GroupExpandedChanged -= OnGroupExpandedChanged;
}
}
/// <summary>
/// 샘플용 렌더 레이어 열거형
/// </summary>
private enum RenderLayer
{
Default,
UI,
Background,
Foreground,
Effects
}
}