Files
XRLib/Assets/Scripts/Simulator/PropertyWindow/SourceProperty.cs

493 lines
22 KiB
C#
Raw Normal View History

2025-12-24 17:36:01 +09:00
using Simulator.Data;
using System;
using System.Collections.Generic;
using UnityEngine;
using UVC.UI.Window.PropertyWindow;
public enum SpawnPolicy
{
Constant,
Normal,
Uniform,
Exponential,
Triangular
}
public class SourceProperty : MonoBehaviour
{
[SerializeField]
private PropertyWindow propertyWindow;
private void Awake()
{
propertyWindow.PropertyValueChanged += OnPropertyValueChanged;
}
public void SetProertyWindow(ComponentType type, ComponentDataBase data)
{
Debug.Log(data);
switch (type)
{
case ComponentType.Source:
InitSourceProperty(data as SourceDataClass);
break;
}
}
void SaveChange(object source,object value,string name)
{
var path = PathIndexer.GetNodePath(source);
Patch updateData = new Patch();
updateData.value = value;
UpdateValueStack.AddPatch($"{path}.{name}", value);
//UpdateValueStack.Save();
}
public void InitSourceProperty(SourceDataClass source)
{
List<IPropertyEntry> entries = new List<IPropertyEntry>
{
new StringProperty("name", "이름", source.name)
{
IsReadOnly=true
},
new StringProperty("label", "라벨", source.label)
{
IsReadOnly=false
}.Bind(
setter: v => {source.label = v;SaveChange(source,v,"label"); }
),
new Vector2Property("Position","X,Y 좌표(m)", new Vector2(source.physical.position.x,source.physical.position.z))
{
IsReadOnly=false
}.Bind(
setter: v => {source.physical.position.x = v.x;source.physical.position.z = v.y; SaveChange(source,v,"physical.position"); }
),
new ListProperty("prefabType","생성될 개체 유형",new List<string>(PrefabManager.Instance.prefabDict.Keys),source.prefab)
{
IsReadOnly=false
}.Bind(
setter: v => {source.prefab=v; SaveChange(source,v,"prefab"); }
),
new EnumProperty("display_mode_TimePolicy", "생산 간격 정책",source.spawn_time_policy.policy).Bind(
setter: v=>{source.spawn_time_policy=PolicyFactory.Create(v.ToString());SaveChange(source,v.ToString(),"spawn_time_policy.type");}
),
CreateSpawnTimePolicy_Constant(source),
CreateSpawnTimePolicy_Normal(source),
CreateSpawnTimePolicy_Uniform(source),
CreateSpawnTimePolicy_Exponential(source),
CreateSpawnTimePolicy_Triangular(source),
new EnumProperty("display_mode_CountPolicy", "생산 개수 정책",source.spawn_count_policy.policy).Bind(
setter: v=>{source.spawn_count_policy=PolicyFactory.Create(v.ToString());SaveChange(source,v.ToString(),"spawn_count_policy.type");}
),
CreateSpawnCountPolicy_Constant(source),
CreateSpawnCountPolicy_Normal(source),
CreateSpawnCountPolicy_Uniform(source),
CreateSpawnCountPolicy_Exponential(source),
CreateSpawnCountPolicy_Triangular(source),
new BoolProperty("Is_Unlimited","무제한 모드",source.is_unlimited),
new EnumProperty("display_mode_DefectPolicy", "불량률 정책",source.defect_rate_policy.policy).Bind(
setter: v=>{source.defect_rate_policy=PolicyFactory.Create(v.ToString());SaveChange(source,v.ToString(),"defect_rate_policy.type");}
),
CreateSpawnDefectPolicy_Constant(source),
CreateSpawnDefectPolicy_Normal(source),
CreateSpawnDefectPolicy_Uniform(source),
CreateSpawnDefectPolicy_Exponential(source),
CreateSpawnDefectPolicy_Triangular(source),
};
propertyWindow.LoadMixedProperties(entries);
HandleDisplayModeChanged_TimePolicy(source.spawn_time_policy.policy.ToString());
HandleDisplayModeChanged_CountPolicy(source.spawn_count_policy.policy.ToString());
HandleDisplayModeChanged_DefectPolicy(source.defect_rate_policy.policy.ToString());
}
private void OnPropertyValueChanged(object sender, PropertyValueChangedEventArgs e)
{
Debug.Log($"[PropertyChanged] Id:{e.PropertyId}, Type:{e.PropertyType}, Value:{e.NewValue}");
// 동적 그룹 표시/비표시 테스트
if (e.PropertyId == "display_mode_TimePolicy")
{
string selectedMode = e.NewValue.ToString();
HandleDisplayModeChanged_TimePolicy(selectedMode);
}
if (e.PropertyId == "display_mode_CountPolicy")
{
string selectedMode = e.NewValue.ToString();
HandleDisplayModeChanged_CountPolicy(selectedMode);
}
if (e.PropertyId == "display_mode_DefectPolicy")
{
string selectedMode = e.NewValue.ToString();
HandleDisplayModeChanged_DefectPolicy(selectedMode);
}
}
#region
private PropertyGroup CreateSpawnTimePolicy_Constant(SourceDataClass source)
{
var group = new PropertyGroup("SpawnTimePolicy_Constant", "", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("SpawnTimePolicy_Constant_Value", "상수 값", (source.spawn_time_policy as Policy_Constant) ?.value ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_time_policy as Policy_Constant).value = v;SaveChange(source,v,"Spawn_time_Policy.value"); }
),
});
return group;
}
private PropertyGroup CreateSpawnTimePolicy_Normal(SourceDataClass source)
{
var group = new PropertyGroup("SpawnTimePolicy_Normal", "", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("SpawnTimePolicy_Normal_Mean", "정규 분포 표준치", (source.spawn_time_policy as Policy_Normal) ?.mean ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_time_policy as Policy_Normal).mean = v;SaveChange(source,v,"Spawn_time_Policy.mean"); }
),
new FloatProperty("SpawnTimePolicy_Normal_Gap", "정규 분포 표준 편차", (source.spawn_time_policy as Policy_Normal) ?.stddev ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_time_policy as Policy_Normal).stddev = v;SaveChange(source,v,"Spawn_time_Policy.stddev"); }
),
});
return group;
}
private PropertyGroup CreateSpawnTimePolicy_Uniform(SourceDataClass source)
{
var group = new PropertyGroup("SpawnTimePolicy_Uniform", "", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("SpawnTimePolicy_Uniform_Min", "균등 분포 최소값", (source.spawn_time_policy as Policy_Uniform) ?.min_val ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_time_policy as Policy_Uniform).min_val = v;SaveChange(source,v,"Spawn_time_Policy.min_val"); }
),
new FloatProperty("SpawnTimePolicy_Uniform_Max", "균등 분포 최대값", (source.spawn_time_policy as Policy_Uniform) ?.max_val ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_time_policy as Policy_Uniform).max_val = v;SaveChange(source,v,"Spawn_time_Policy.max_val"); }
),
});
return group;
}
private PropertyGroup CreateSpawnTimePolicy_Exponential(SourceDataClass source)
{
var group = new PropertyGroup("SpawnTimePolicy_Exponential", "", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("SpawnTimePolicy_Exponential_Mean", "지수 분포 평균치", (source.spawn_time_policy as Policy_Exponential) ?.mean ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_time_policy as Policy_Exponential).mean = v;SaveChange(source,v,"Spawn_time_Policy.mean"); }
),
});
return group;
}
private PropertyGroup CreateSpawnTimePolicy_Triangular(SourceDataClass source)
{
var group = new PropertyGroup("SpawnTimePolicy_Triangular", "", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("SpawnTimePolicy_Triangular_Min", "지수 분포 최소값", (source.spawn_time_policy as Policy_Triangular) ?.min_val ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_time_policy as Policy_Triangular).min_val = v;SaveChange(source,v,"Spawn_time_Policy.min_val"); }
),
new FloatProperty("SpawnTimePolicy_Triangular_Mean", "지수 분포 최빈값", (source.spawn_time_policy as Policy_Triangular) ?.mode ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_time_policy as Policy_Triangular).mode = v;SaveChange(source,v,"Spawn_time_Policy.mode"); }
),
new FloatProperty("SpawnTimePolicy_Triangular_Max", "지수 분포 최대값", (source.spawn_time_policy as Policy_Triangular) ?.max_val ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_time_policy as Policy_Triangular).max_val = v;SaveChange(source,v,"Spawn_time_Policy.max_val"); }
),
});
return group;
}
private void HandleDisplayModeChanged_TimePolicy(string mode)
{
// 모든 조건부 그룹 숨김
propertyWindow.SetGroupVisibility("SpawnTimePolicy_Constant", false);
propertyWindow.SetGroupVisibility("SpawnTimePolicy_Normal", false);
propertyWindow.SetGroupVisibility("SpawnTimePolicy_Uniform", false);
propertyWindow.SetGroupVisibility("SpawnTimePolicy_Exponential", false);
propertyWindow.SetGroupVisibility("SpawnTimePolicy_Triangular", false);
// 선택된 모드에 따라 해당 그룹만 표시
switch (mode)
{
case "Constant":
propertyWindow.SetGroupVisibility("SpawnTimePolicy_Constant", true);
break;
case "Normal":
propertyWindow.SetGroupVisibility("SpawnTimePolicy_Normal", true);
break;
case "Uniform":
propertyWindow.SetGroupVisibility("SpawnTimePolicy_Uniform", true);
break;
case "Exponential":
propertyWindow.SetGroupVisibility("SpawnTimePolicy_Exponential", true);
break;
case "Triangular":
propertyWindow.SetGroupVisibility("SpawnTimePolicy_Triangular", true);
break;
}
}
#endregion
#region
private PropertyGroup CreateSpawnCountPolicy_Constant(SourceDataClass source)
{
var group = new PropertyGroup("SpawnCountPolicy_Constant", "", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("SpawnCountPolicy_Constant_Value", "상수 값", (source.spawn_count_policy as Policy_Constant)?.value??0f)
{
}.Bind(
setter: v => {(source.spawn_count_policy as Policy_Constant).value = v;SaveChange(source,v,"spawn_count_policy.value"); }
),
});
return group;
}
private PropertyGroup CreateSpawnCountPolicy_Normal(SourceDataClass source)
{
var group = new PropertyGroup("SpawnCountPolicy_Normal", "", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("SpawnCountPolicy_Normal_Mean", "정규 분포 표준치", (source.spawn_count_policy as Policy_Normal) ?.mean ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_count_policy as Policy_Normal).mean = v;SaveChange(source,v,"spawn_count_policy.mean"); }
),
new FloatProperty("SpawnCountPolicy_Normal_Gap", "정규 분포 표준 편차", (source.spawn_count_policy as Policy_Normal) ?.stddev ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_count_policy as Policy_Normal).stddev = v;SaveChange(source,v,"spawn_count_policy.stddev"); }
),
});
return group;
}
private PropertyGroup CreateSpawnCountPolicy_Uniform(SourceDataClass source)
{
var group = new PropertyGroup("SpawnCountPolicy_Uniform", "", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("SpawnCountPolicy_Uniform_Min", "균등 분포 최소값", (source.spawn_count_policy as Policy_Uniform) ?.min_val ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_count_policy as Policy_Uniform).min_val = v;SaveChange(source,v,"spawn_count_policy.min_val"); }
),
new FloatProperty("SpawnCountPolicy_Uniform_Max", "균등 분포 최대값", (source.spawn_count_policy as Policy_Uniform) ?.max_val ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_count_policy as Policy_Uniform).max_val = v;SaveChange(source,v,"spawn_count_policy.max_val"); }
),
});
return group;
}
private PropertyGroup CreateSpawnCountPolicy_Exponential(SourceDataClass source)
{
var group = new PropertyGroup("SpawnCountPolicy_Exponential", "", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("SpawnCountPolicy_Exponential_Mean", "지수 분포 평균치", (source.spawn_count_policy as Policy_Exponential) ?.mean ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_count_policy as Policy_Exponential).mean = v;SaveChange(source,v,"spawn_count_policy.mean"); }
),
});
return group;
}
private PropertyGroup CreateSpawnCountPolicy_Triangular(SourceDataClass source)
{
var group = new PropertyGroup("SpawnCountPolicy_Triangular", "", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("SpawnCountPolicy_Triangular_Min", "지수 분포 최소값", (source.spawn_count_policy as Policy_Triangular) ?.min_val ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_count_policy as Policy_Triangular).min_val = v;SaveChange(source,v,"spawn_count_policy.min_val"); }
),
new FloatProperty("SpawnCountPolicy_Triangular_Mean", "지수 분포 최빈값", (source.spawn_count_policy as Policy_Triangular) ?.mode ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_count_policy as Policy_Triangular).mode = v;SaveChange(source,v,"spawn_count_policy.mode"); }
),
new FloatProperty("SpawnCountPolicy_Triangular_Max", "지수 분포 최대값", (source.spawn_count_policy as Policy_Triangular) ?.max_val ?? 0f)
{
}.Bind(
setter: v => {(source.spawn_count_policy as Policy_Triangular).max_val = v;SaveChange(source,v,"spawn_count_policy.max_val"); }
),
});
return group;
}
private void HandleDisplayModeChanged_CountPolicy(string mode)
{
// 모든 조건부 그룹 숨김
propertyWindow.SetGroupVisibility("SpawnCountPolicy_Constant", false);
propertyWindow.SetGroupVisibility("SpawnCountPolicy_Normal", false);
propertyWindow.SetGroupVisibility("SpawnCountPolicy_Uniform", false);
propertyWindow.SetGroupVisibility("SpawnCountPolicy_Exponential", false);
propertyWindow.SetGroupVisibility("SpawnCountPolicy_Triangular", false);
// 선택된 모드에 따라 해당 그룹만 표시
switch (mode)
{
case "Constant":
propertyWindow.SetGroupVisibility("SpawnCountPolicy_Constant", true);
break;
case "Normal":
propertyWindow.SetGroupVisibility("SpawnCountPolicy_Normal", true);
break;
case "Uniform":
propertyWindow.SetGroupVisibility("SpawnCountPolicy_Uniform", true);
break;
case "Exponential":
propertyWindow.SetGroupVisibility("SpawnCountPolicy_Exponential", true);
break;
case "Triangular":
propertyWindow.SetGroupVisibility("SpawnCountPolicy_Triangular", true);
break;
}
}
#endregion
#region
private PropertyGroup CreateSpawnDefectPolicy_Constant(SourceDataClass source)
{
var group = new PropertyGroup("SpawnDefectPolicy_Constant", "", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("SpawnDefectPolicy_Constant_Value", "상수 값", (source.defect_rate_policy as Policy_Constant)?.value??0f)
{
}.Bind(
setter: v => {(source.defect_rate_policy as Policy_Constant).value = v;SaveChange(source,v,"defect_rate_policy.value"); }
),
});
return group;
}
private PropertyGroup CreateSpawnDefectPolicy_Normal(SourceDataClass source)
{
var group = new PropertyGroup("SpawnDefectPolicy_Normal", "", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("SpawnDefectPolicy_Normal_Mean", "정규 분포 표준치", (source.defect_rate_policy as Policy_Normal)?.mean??0f)
{
}.Bind(
setter: v => {(source.defect_rate_policy as Policy_Normal).mean = v;SaveChange(source,v,"defect_rate_policy.mean"); }
),
new FloatProperty("SpawnDefectPolicy_Normal_Gap", "정규 분포 표준 편차", (source.defect_rate_policy as Policy_Normal)?.stddev??0f)
{
}.Bind(
setter: v => {(source.defect_rate_policy as Policy_Normal).stddev = v;SaveChange(source,v,"defect_rate_policy.stddev"); }
),
});
return group;
}
private PropertyGroup CreateSpawnDefectPolicy_Uniform(SourceDataClass source)
{
var group = new PropertyGroup("SpawnDefectPolicy_Uniform", "", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("SpawnDefectPolicy_Uniform_Min", "균등 분포 최소값", (source.defect_rate_policy as Policy_Uniform) ?.min_val ?? 0f)
{
}.Bind(
setter: v => {(source.defect_rate_policy as Policy_Uniform).min_val = v;SaveChange(source,v,"defect_rate_policy.min_val"); }
),
new FloatProperty("SpawnDefectPolicy_Uniform_Max", "균등 분포 최대값", (source.defect_rate_policy as Policy_Uniform) ?.max_val ?? 0f)
{
}.Bind(
setter: v => {(source.defect_rate_policy as Policy_Uniform).max_val = v;SaveChange(source,v,"defect_rate_policy.max_val"); }
),
});
return group;
}
private PropertyGroup CreateSpawnDefectPolicy_Exponential(SourceDataClass source)
{
var group = new PropertyGroup("SpawnDefectPolicy_Exponential", "", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("SpawnDefectPolicy_Exponential_Mean", "지수 분포 평균치", (source.defect_rate_policy as Policy_Exponential) ?.mean ?? 0f)
{
}.Bind(
setter: v => {(source.defect_rate_policy as Policy_Exponential).mean = v;SaveChange(source,v,"defect_rate_policy.mean"); }
),
});
return group;
}
private PropertyGroup CreateSpawnDefectPolicy_Triangular(SourceDataClass source)
{
var group = new PropertyGroup("SpawnDefectPolicy_Triangular", "", isExpanded: true);
group.AddItems(new IPropertyItem[]
{
new FloatProperty("SpawnDefectPolicy_Triangular_Min", "지수 분포 최소값", (source.defect_rate_policy as Policy_Triangular) ?.min_val ?? 0f)
{
}.Bind(
setter: v => {(source.defect_rate_policy as Policy_Triangular).min_val = v;SaveChange(source,v,"defect_rate_policy.min_val"); }
),
new FloatProperty("SpawnDefectPolicy_Triangular_Mean", "지수 분포 최빈값", (source.defect_rate_policy as Policy_Triangular) ?.mode ?? 0f)
{
}.Bind(
setter: v => {(source.defect_rate_policy as Policy_Triangular).mode = v;SaveChange(source,v,"defect_rate_policy.mode"); }
),
new FloatProperty("SpawnDefectPolicy_Triangular_Max", "지수 분포 최대값", (source.defect_rate_policy as Policy_Triangular) ?.max_val ?? 0f)
{
}.Bind(
setter: v => {(source.defect_rate_policy as Policy_Triangular).max_val = v;SaveChange(source,v,"defect_rate_policy.max_val"); }
),
});
return group;
}
private void HandleDisplayModeChanged_DefectPolicy(string mode)
{
// 모든 조건부 그룹 숨김
propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Constant", false);
propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Normal", false);
propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Uniform", false);
propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Exponential", false);
propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Triangular", false);
// 선택된 모드에 따라 해당 그룹만 표시
switch (mode)
{
case "Constant":
propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Constant", true);
break;
case "Normal":
propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Normal", true);
break;
case "Uniform":
propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Uniform", true);
break;
case "Exponential":
propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Exponential", true);
break;
case "Triangular":
propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Triangular", true);
break;
}
}
#endregion
}