해야 할 것
스크립트를 하나로 합쳤는데
2개 클릭 시 다시 다른 버튼 클릭을 막으려다
현재 클릭된 버튼도 클릭이 막힌 상태
클릭이 된 2개를 기준으로 클릭을 해제하면 다른 것을 클릭할 수 있도록 수정하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using UnityEngine.U2D;
using UnityEditor;
public class SelectSkillPopUp : MonoBehaviour
{
public GameObject[] selectSkills;
public Image[] skillImgs;
public TMP_Text[] skillIds;
public TMP_Text[] skillNames;
public TMP_Text[] skillDescs;
public Button shuffleSkills;
public Button selectBtn;
public SpriteAtlas skillsAtlas;
List<SkillData> skillList = new List<SkillData>();
private int selectedCount = 0;
private List<int> selectedIndexes = new List<int>();
void Start()
{
selectBtn.gameObject.SetActive(false);
ShowLevelUp();
foreach (var data in SkillManager.instance.skillDatas)
{
skillList.Add(data);
}
shuffleSkills.onClick.AddListener(ShuffleSkills);
// 각 스킬 오브젝트에 대해 클릭 이벤트 추가
for (int i = 0; i < selectSkills.Length; i++)
{
int index = i;
selectSkills[i].GetComponent<Button>().onClick.AddListener(() =>
{
ToggleSkill(index);
});
}
}
void ShowLevelUp()
{
selectedIndexes.Clear();
for (int i = 0; i < skillImgs.Length; i++)
{
int randomIndex = SkillManager.instance.GetSkillsRandomNum();
selectedIndexes.Add(randomIndex);
skillImgs[i].sprite = SkillManager.instance.GetRandomAtlasImg(randomIndex);
skillIds[i].text = SkillManager.instance.GetRandomAtlasImgId(randomIndex).ToString();
skillNames[i].text = SkillManager.instance.GetRandomAtlasName(randomIndex);
skillDescs[i].text = SkillManager.instance.GetRandomAtlasDesc(randomIndex);
}
}
void ShuffleSkills()
{
selectedCount = 0;
for (int i = 0; i < skillImgs.Length; i++)
{
int randomIndex = GetUniqueRandomIndex();
selectedIndexes[i] = randomIndex;
skillIds[i].text = SkillManager.instance.GetRandomAtlasImgId(randomIndex).ToString();
skillNames[i].text = SkillManager.instance.GetRandomAtlasName(randomIndex);
skillDescs[i].text = SkillManager.instance.GetRandomAtlasDesc(randomIndex);
skillImgs[i].sprite = SkillManager.instance.GetRandomAtlasImg(randomIndex);
SetImageAlpha(skillImgs[i], 1f); // 알파 값을 원래대로 초기화
}
UpdateSelectBtn();
}
int GetUniqueRandomIndex()
{
int randomIndex;
do
{
randomIndex = Random.Range(0, skillList.Count);
} while (selectedIndexes.Contains(randomIndex));
return randomIndex;
}
void SetImageAlpha(Image image, float alpha)
{
Color color = image.color;
color.a = alpha;
image.color = color;
}
void UpdateSelectBtn()
{
selectBtn.gameObject.SetActive(selectedCount == 2);
}
public void ToggleSkill(int index)
{
if (selectedCount >= 2)
{
// 이미 2개의 스킬이 선택되었으므로 다른 스킬 선택을 막음
return;
}
Image skillImage = skillImgs[index].GetComponent<Image>();
if (GetImageAlpha(skillImage) != 65f / 255f)
{
SetImageAlpha(skillImage, 65f / 255f);
selectedCount++;
}
else
{
SetImageAlpha(skillImage, 1f);
selectedCount--;
}
UpdateSelectBtn();
}
float GetImageAlpha(Image image)
{
return image.color.a;
}
}
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.U2D;
using UnityEngine.UI;
public class SkillManager : MonoBehaviour
{
public static SkillManager instance; // 싱글톤
public SpriteAtlas skillsAtlas;
public Button levelUpBtn;
public Button closeBtn;
public GameObject selectSkillPopUp;
public SkillData[] skillDatas;
private List<int> rememberRandomIndex = new List<int>();
private void Awake() // 싱글톤
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else if (instance != this)
{
Destroy(gameObject);
}
}
public void Start()
{
levelUpBtn.onClick.RemoveAllListeners();
OnClickLevelUpBtn();
OnClickCloseBtn();
TextAsset asset = Resources.Load<TextAsset>("data/skills_data");
string json = asset.text;
skillDatas = JsonConvert.DeserializeObject<SkillData[]>(json);
}
public SkillData GetDataById(int id)
{
SkillData foundSkillData = null;
foreach (SkillData skillData in skillDatas)
{
if (skillData.id == id)
{
foundSkillData = skillData;
break;
}
}
return foundSkillData;
}
public int GetRandomAtlasImgId(int randomIndex)
{
return skillDatas[randomIndex].id;
}
public string GetRandomAtlasName(int randomIndex)
{
return skillDatas[randomIndex].name;
}
public string GetRandomAtlasDesc(int randomIndex)
{
return skillDatas[randomIndex].desc;
}
public Sprite GetRandomAtlasImg(int randomIndex)
{
return skillsAtlas.GetSprite(skillDatas[randomIndex].name);
}
public int GetSkillsRandomNum()
{
int randomIndex;
do
{
randomIndex = Random.Range(0, skillDatas.Length);
} while (rememberRandomIndex.Contains(randomIndex));
rememberRandomIndex.Add(randomIndex);
Debug.Log("랜덤으로 선택된 스킬 인덱스: " + randomIndex);
return randomIndex;
}
public void OnClickLevelUpBtn()
{
levelUpBtn.onClick.AddListener(() =>
{
selectSkillPopUp.SetActive(true);
int randomIndex = GetSkillsRandomNum();
GetRandomAtlasImg(randomIndex);
GetRandomAtlasName(randomIndex);
GetRandomAtlasDesc(randomIndex);
});
}
public void OnClickCloseBtn()
{
closeBtn.onClick.AddListener(() =>
{
selectSkillPopUp.SetActive(false);
});
}
}
'Study > Unity' 카테고리의 다른 글
[3Match Puzzle] 2단계 블록을 터치 하면 (인덱스, 위치, 타입) 출력 하기 (0) | 2024.06.17 |
---|---|
[Unity] 클릭된 객체들의 정보를 인포로 저장하기 (1) | 2024.06.11 |
[Unity] 클릭시 색상 변경 및 Select버튼 On/Off (0) | 2024.06.09 |
[Unity] Random Skill Button & Select Button (0) | 2024.06.08 |
[Unity] 클릭시 json에 있는 파일들 랜덤으로 가져오기 (0) | 2024.06.07 |