129 lines
4.8 KiB
C#
129 lines
4.8 KiB
C#
|
|
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 SetPropertyWindow(ComponentType type, ComponentDataBase data)
|
|
{
|
|
if (PlayerPropertyDataBase.isPlaying)
|
|
{
|
|
return;
|
|
}
|
|
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);
|
|
}
|
|
|
|
public void InitSourceProperty(SourceDataClass source)
|
|
{
|
|
var 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"); }
|
|
),
|
|
CreatePositionGroup(source),
|
|
new ListProperty("prefabType","생성될 개체 유형",new List<string>(PrefabManager.Instance.prefabDict.Keys),source.prefab)
|
|
{
|
|
IsReadOnly=false
|
|
}.Bind(
|
|
setter: v => {source.prefab=v; SaveChange(source,v,"prefab"); }
|
|
),
|
|
};
|
|
|
|
entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries(
|
|
"SpawnTimePolicy", "생산 간격 정책", "display_mode_TimePolicy",
|
|
() => source.spawn_time_policy, v => source.spawn_time_policy = v,
|
|
"spawn_time_policy", source, SaveChange));
|
|
|
|
entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries(
|
|
"SpawnCountPolicy", "생산 개수 정책", "display_mode_CountPolicy",
|
|
() => source.spawn_count_policy, v => source.spawn_count_policy = v,
|
|
"spawn_count_policy", source, SaveChange));
|
|
|
|
entries.Add(new BoolProperty("is_unlimited","무제한 모드",source.is_unlimited).Bind(
|
|
setter: v => {source.is_unlimited = v;SaveChange(source,v,"is_unlimited"); }
|
|
));
|
|
entries.Add(new IntProperty("capacity","최대 수용 개수", source.max_spawn_limit)
|
|
{
|
|
IsReadOnly=false
|
|
}.Bind(
|
|
setter: v => { source.max_spawn_limit = v; SaveChange(source, v, "max_spawn_limit"); }
|
|
));
|
|
|
|
entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries(
|
|
"SpawnDefectPolicy", "불량률 정책", "display_mode_DefectPolicy",
|
|
() => source.defect_rate_policy, v => source.defect_rate_policy = v,
|
|
"defect_rate_policy", source, SaveChange));
|
|
|
|
propertyWindow.LoadMixedProperties(entries);
|
|
|
|
PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "SpawnTimePolicy", source.spawn_time_policy.policy.ToString());
|
|
PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "SpawnCountPolicy", source.spawn_count_policy.policy.ToString());
|
|
PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "SpawnDefectPolicy", source.defect_rate_policy.policy.ToString());
|
|
propertyWindow.SetPropertyVisibility("capacity", !source.is_unlimited);
|
|
}
|
|
|
|
private void OnPropertyValueChanged(object sender, PropertyValueChangedEventArgs e)
|
|
{
|
|
Debug.Log($"[PropertyChanged] Id:{e.PropertyId}, Type:{e.PropertyType}, Value:{e.NewValue}");
|
|
|
|
PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_TimePolicy", "SpawnTimePolicy");
|
|
PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_CountPolicy", "SpawnCountPolicy");
|
|
PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_DefectPolicy", "SpawnDefectPolicy");
|
|
|
|
if (e.PropertyId == "is_unlimited")
|
|
{
|
|
bool flag = Convert.ToBoolean(e.NewValue);
|
|
propertyWindow.SetPropertyVisibility("capacity", !flag);
|
|
}
|
|
}
|
|
|
|
private PropertyGroup CreatePositionGroup(SourceDataClass source)
|
|
{
|
|
return PropertyHelper.CreatePositionGroup("source_position", source, propertyWindow, SaveChange);
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
if (propertyWindow != null)
|
|
propertyWindow.PropertyValueChanged -= OnPropertyValueChanged;
|
|
}
|
|
}
|