Files
Simulation/Assets/WorkSpace/LH/LogicData/Panel_PlacedObject.cs
2025-05-28 10:08:15 +09:00

166 lines
5.2 KiB
C#

using UnityEngine;
using System.Collections.Generic;
using UnityEngine.UI;
using System;
using TMPro;
namespace Octopus.Simulator
{
public class Panel_PlacedObject : MonoBehaviour
{
List<Button> buttons = new List<Button>();
[SerializeField]
Button ButtonPrefab;
RectTransform rect;
[SerializeField]
RectTransform contentRect;
[SerializeField]
TMP_Dropdown dropdown;
string mappingkey="";
public Action<string> onPlacedObjectSelected;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Awake()
{
rect = GetComponent<RectTransform>();
DataManager.I.onModelsUpdated += (value)=>SetDropdown();
}
public void SetDropdown(string mappingKey)
{
mappingkey = mappingKey;
gameObject.SetActive(true);
var models = DataManager.I.GetModels();
dropdown.onValueChanged.RemoveAllListeners();
dropdown.ClearOptions();
// 3) 옵션 데이터 생성
List<TMP_Dropdown.OptionData> options = new List<TMP_Dropdown.OptionData>
{
new TMP_Dropdown.OptionData("선택되지않음")
};
foreach (var model in models)
{
options.Add(new TMP_Dropdown.OptionData(model.name));
}
dropdown.AddOptions(options);
var current = LogicMappingDataBase.GetGameObject(mappingKey);
if (current != null)
{
// models 리스트에서 current와 같은 객체의 인덱스 찾기
int modelIndex = models.FindIndex(m => m == current);
if (modelIndex >= 0)
{
// 플레이스홀더(0) 다음이므로 +1
dropdown.value = modelIndex + 1;
}
else
{
dropdown.value = 0; // 혹시 리스트에 없으면 플레이스홀더
}
}
else
{
dropdown.value = 0; // 매핑된 게 없으면 플레이스홀더
}
dropdown.RefreshShownValue();
// 4) 콜백 초기화 후 등록
dropdown.onValueChanged.RemoveAllListeners();
dropdown.onValueChanged.AddListener(idx =>
{
if (idx == 0)
{
LogicMappingDataBase.SetMapping(mappingKey, null);
}
else
{
var selectedModel = models[idx-1];
LogicMappingDataBase.SetMapping(mappingKey, selectedModel);
Debug.Log(mappingKey);
}
onPlacedObjectSelected?.Invoke(mappingKey);
});
}
public void SetDropdown()
{
gameObject.SetActive(true);
var models = DataManager.I.GetModels();
dropdown.onValueChanged.RemoveAllListeners();
dropdown.ClearOptions();
// 3) 옵션 데이터 생성
List<TMP_Dropdown.OptionData> options = new List<TMP_Dropdown.OptionData>
{
new TMP_Dropdown.OptionData("선택되지않음")
};
foreach (var model in models)
{
options.Add(new TMP_Dropdown.OptionData(model.name));
}
dropdown.AddOptions(options);
var current = LogicMappingDataBase.GetGameObject(mappingkey);
if (current != null)
{
// models 리스트에서 current와 같은 객체의 인덱스 찾기
int modelIndex = models.FindIndex(m => m == current);
if (modelIndex >= 0)
{
// 플레이스홀더(0) 다음이므로 +1
dropdown.value = modelIndex + 1;
}
else
{
dropdown.value = 0; // 혹시 리스트에 없으면 플레이스홀더
}
}
else
{
dropdown.value = 0; // 매핑된 게 없으면 플레이스홀더
}
dropdown.RefreshShownValue();
// 4) 콜백 초기화 후 등록
dropdown.onValueChanged.RemoveAllListeners();
dropdown.onValueChanged.AddListener(idx =>
{
if (idx == 0)
{
LogicMappingDataBase.SetMapping(mappingkey, null);
}
else
{
var selectedModel = models[idx - 1];
LogicMappingDataBase.SetMapping(mappingkey, selectedModel);
Debug.Log(mappingkey);
}
onPlacedObjectSelected?.Invoke(mappingkey);
});
}
void ClearButton()
{
foreach (var button in buttons)
{
Destroy(button.gameObject);
}
buttons.Clear();
}
public void OnLogicDataSelected(ILogicItem item)
{
ClearButton();
SetDropdown(item.Name);
}
public void DataDeSelected()
{
mappingkey = "";
gameObject.SetActive(false);
}
}
}