211 lines
7.0 KiB
C#
211 lines
7.0 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.EventSystems;
|
|
using UnityEngine.UI;
|
|
|
|
namespace TON
|
|
{
|
|
public class SkillSettingUI : UIBase
|
|
{
|
|
public static SkillSettingUI Instance => UIManager.Singleton.GetUI<SkillSettingUI>(UIList.SkillSettingUI);
|
|
|
|
// 사용할 스킬 슬롯 3개 매핑을 위한 변수
|
|
public Transform skillSlotGroup;
|
|
public SkillSettingSlot skillSlotPrefab;
|
|
public List<SkillSettingSlot> createSkillSlots = new List<SkillSettingSlot>();
|
|
|
|
// 전체 스킬 리스트를 스크롤 형식으로 구현하기 위함
|
|
public ScrollRect scrollRect;
|
|
public SkillInformationItem skillInfoPrefab;
|
|
public List<RectTransform> uiPrefabList = new List<RectTransform>();
|
|
public List<SkillInformationItem> createSkillInfo = new List<SkillInformationItem>();
|
|
|
|
public Button settingButton;
|
|
|
|
|
|
private int selectedSlotIndex = -1;
|
|
private string selectedSkillId = null;
|
|
private int playerLevel;
|
|
|
|
public void Start()
|
|
{
|
|
playerLevel = PlayerDataManager.Singleton.player.level;
|
|
|
|
SetSkillSlots();
|
|
SetSkillInfoItem();
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (selectedSlotIndex != -1 && !string.IsNullOrWhiteSpace(selectedSkillId))
|
|
{
|
|
settingButton.interactable = true;
|
|
}
|
|
else
|
|
{
|
|
settingButton.interactable = false;
|
|
}
|
|
}
|
|
|
|
private void SetSkillSlots()
|
|
{
|
|
// 기존 UI 삭제
|
|
if (createSkillSlots.Count > 0)
|
|
{
|
|
foreach (var button in createSkillSlots)
|
|
{
|
|
Destroy(button.gameObject);
|
|
}
|
|
createSkillSlots.Clear();
|
|
}
|
|
|
|
// 스킬 버튼 생성
|
|
List<SkillBase> activatedSkills = SkillDataManager.Singleton.GetEquippedSkills();
|
|
int maxEquipSkillCount = SkillDataManager.Singleton.GetActiveSkillCount();
|
|
|
|
// 슬롯 번호에 맞게 스킬을 매핑
|
|
Dictionary<int, SkillBase> skillMap = new Dictionary<int, SkillBase>();
|
|
foreach (var skill in activatedSkills)
|
|
{
|
|
skillMap[skill.SkillData.slotNumber - 1] = skill;
|
|
}
|
|
|
|
for (int i = 0; i < 3; i++)
|
|
{
|
|
SkillSettingSlot newSkillSlot = Instantiate(skillSlotPrefab, skillSlotGroup);
|
|
newSkillSlot.gameObject.SetActive(true);
|
|
|
|
if (skillMap.TryGetValue(i, out SkillBase skill))
|
|
{
|
|
// 해당 슬롯에 스킬이 있으면 초기화
|
|
newSkillSlot.Initalize(skill.SkillData.id, i);
|
|
}
|
|
else
|
|
{
|
|
if (i < maxEquipSkillCount)
|
|
{
|
|
// 스킬을 배치할 수 있는 슬롯이지만 스킬이 없으면 비활성 슬롯으로 표시
|
|
newSkillSlot.Initalize(null, i);
|
|
}
|
|
else
|
|
{
|
|
newSkillSlot.GetComponent<Button>().interactable = false;
|
|
}
|
|
}
|
|
|
|
createSkillSlots.Add(newSkillSlot);
|
|
}
|
|
}
|
|
|
|
private void SetSkillInfoItem()
|
|
{
|
|
// 이미 기존에 UI가 생성되어 있다면 삭제
|
|
if (createSkillInfo.Count > 0)
|
|
{
|
|
foreach (var button in createSkillInfo)
|
|
{
|
|
Destroy(button.gameObject);
|
|
}
|
|
createSkillInfo.Clear();
|
|
}
|
|
if (uiPrefabList.Count > 0)
|
|
{
|
|
uiPrefabList.Clear();
|
|
}
|
|
|
|
List<SkillData> skillDatas = SkillDataManager.Singleton.skillDatas;
|
|
|
|
float y = 0;
|
|
for (int i = 0; i < skillDatas.Count; i++)
|
|
{
|
|
SkillData skillData = skillDatas[i];
|
|
SkillInformationItem skillInfoItem = Instantiate(skillInfoPrefab, scrollRect.content);
|
|
|
|
skillInfoItem.gameObject.SetActive(true);
|
|
skillInfoItem.Initalize(skillData, playerLevel);
|
|
createSkillInfo.Add(skillInfoItem);
|
|
|
|
if (playerLevel < skillData.requiredLevel)
|
|
{
|
|
skillInfoItem.GetComponent<Button>().interactable = false;
|
|
}
|
|
|
|
RectTransform rectTransform = skillInfoItem.GetComponent<RectTransform>();
|
|
|
|
uiPrefabList.Add(rectTransform);
|
|
uiPrefabList[i].anchoredPosition = new Vector2(0f, -y);
|
|
y += uiPrefabList[i].sizeDelta.y;
|
|
}
|
|
|
|
scrollRect.content.sizeDelta = new Vector2(scrollRect.content.sizeDelta.x, y);
|
|
}
|
|
|
|
public void OnClickSkillSlot()
|
|
{
|
|
GameObject selectedSlotGameObject = EventSystem.current.currentSelectedGameObject;
|
|
SkillSettingSlot selectedSlot = selectedSlotGameObject.GetComponent<SkillSettingSlot>();
|
|
|
|
selectedSlotIndex = selectedSlot.SelectedSlot();
|
|
for (int i = 0; i < 3; i++)
|
|
{
|
|
if (i != selectedSlotIndex)
|
|
{
|
|
createSkillSlots[i].UnselectedSlot();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void OnClickSkillInfo()
|
|
{
|
|
GameObject selectedSlotGameObject = EventSystem.current.currentSelectedGameObject;
|
|
SkillInformationItem selectedSkillInfo = selectedSlotGameObject.GetComponent<SkillInformationItem>();
|
|
|
|
selectedSkillId = selectedSkillInfo.SelectedSkillInfo();
|
|
foreach (var skillInfo in createSkillInfo)
|
|
{
|
|
if (skillInfo.skillId != selectedSkillId)
|
|
{
|
|
skillInfo.UnselectedSkillInfo();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void OnClickSettingButton()
|
|
{
|
|
// 스킬 데이터 업데이트 할때 selectedSlotIndex +1 해서 넘겨줘야함
|
|
SkillDataManager.Singleton.UpdateSkillData(selectedSkillId, selectedSlotIndex + 1, () =>
|
|
{
|
|
// 스킬 업데이트 후 UI 갱신
|
|
var unselectedSkill = createSkillInfo.Find(skill => skill.skillId == selectedSkillId);
|
|
unselectedSkill?.UnselectedSkillInfo();
|
|
createSkillSlots[selectedSlotIndex].UnselectedSlot();
|
|
|
|
selectedSkillId = null;
|
|
selectedSlotIndex = -1;
|
|
|
|
RefreshUI();
|
|
});
|
|
|
|
}
|
|
|
|
private void RefreshUI()
|
|
{
|
|
SetSkillSlots();
|
|
SetSkillInfoItem();
|
|
}
|
|
|
|
public void OnClickCloseButton()
|
|
{
|
|
StartCoroutine(CloseButtonDelay());
|
|
}
|
|
|
|
IEnumerator CloseButtonDelay()
|
|
{
|
|
yield return new WaitForSeconds(0.2f); // 0.2초 대기
|
|
|
|
UIManager.Hide<SkillSettingUI>(UIList.SkillSettingUI);
|
|
}
|
|
}
|
|
}
|