using System.Collections.Generic; using UnityEngine; public class table_script : MonoBehaviour { public Dictionary<int, int> collisionInfo = new(); public List<sample_script> collidedCardList = new(); // 충돌 시 호출되는 함수 private void OnTriggerEnter2D(Collider2D other) { sample_script sampleScript = other.GetComponent<sample_script>(); if (sampleScript != null) { int number = sampleScript.number; // 이미 충돌 정보가 존재하지 않으면 추가 if (!collisionInfo.ContainsKey(number)) { collisionInfo.Add(number, 1); Debug.Log($"충돌 정보 저장: number={number}, quantity=1"); } else { // 충돌 정보가 있으면 수량 증가 collisionInfo[number]++; Debug.Log($"충돌 정보 갱신: number={number}, quantity={collisionInfo[number]}"); } if (other.gameObject.CompareTag("cards")) { //이름을 저장하는게 아니라 스크립트(오브젝트) 자체를 저장 //보니까 모든 카드엔 sample_script 가 달려있는 것 같아서 여기로 옮김 collidedCardList.Add(sampleScript); Debug.Log($"충돌 카드 저장: {other.gameObject.name}"); } } } // 충돌 종료 시 호출되는 함수 private void OnTriggerExit2D(Collider2D other) { sample_script sampleScript = other.GetComponent<sample_script>(); if (sampleScript != null) { int number = sampleScript.number; if (collisionInfo.ContainsKey(number)) { collisionInfo[number]--; // 수량이 0이 되면 제거 if (collisionInfo[number] == 0) { collisionInfo.Remove(number); Debug.Log($"충돌 정보 제거: number={number}"); } else { Debug.Log($"충돌 정보 갱신 (감소): number={number}, quantity={collisionInfo[number]}"); } if (other.gameObject.CompareTag("cards")) { collidedCardList.Remove(sampleScript); Debug.Log($"충돌 카드 삭제: {sampleScript.gameObject.name}"); } } } } // 조합 시도하는 함수 public void Combination() { Debug.Log("조합 시작"); Object[] prefabs = Resources.LoadAll("Cards/Objects", typeof(GameObject)); foreach (Object prefab in prefabs) { Debug.Log($"조합 시도: {prefab.name}"); if (prefab is GameObject cardPrefab) { object_script needsScript = cardPrefab.GetComponent<object_script>(); if (needsScript != null && needsScript.Needs_number != null && needsScript.Needs_quality != null) { for (int i = 0, iMax = needsScript.Needs_number.Count; i < iMax; i++) { int number = needsScript.Needs_number[i]; // 충돌 정보가 있는지 확인 if (collisionInfo.ContainsKey(number)) { if (i < needsScript.Needs_quality.Count && collisionInfo[number] >= needsScript.Needs_quality[i]) { Debug.Log($"성공: {cardPrefab.name}"); // 조합 성공 시 카드 생성 GameObject newCard = Instantiate(cardPrefab, transform.position + new Vector3(10, 0, 0), Quaternion.identity); newCard.transform.SetParent(transform.parent); // 조합에 사용된 카드 제거 RemoveCollidedCards(needsScript); return; } } else { Debug.Log($"{cardPrefab.name} prefab에 충돌 정보가 없습니다."); } } } else { Debug.LogWarning($"{cardPrefab.name} prefab에 object_script 컴포넌트가 없거나 Needs_number/Needs_quality 리스트가 설정되지 않았습니다."); } } } Debug.Log("조합 실패"); } // 충돌한 카드를 제거하는 함수 (collidedObjectNames 사용, Needs와 Quality 참조) private void RemoveCollidedCards(object_script needsScript) { if (needsScript == null || needsScript.Needs_number == null || needsScript.Needs_quality == null) { Debug.LogError("needsScript가 제대로 설정되지 않았습니다."); return; } //제거 해야 할 카드 목록 변수 선언 List<sample_script> cardsToRemove = new(); for (int i = 0, iMax = needsScript.Needs_number.Count; i < iMax; i++) { int number = needsScript.Needs_number[i]; int quality = needsScript.Needs_quality[i]; int count = 0; // collidedObjectNames에서 number와 일치하는 카드 찾기 foreach (sample_script card in collidedCardList) { if (card != null && card.number == number) { //찾은 카드 저장 cardsToRemove.Add(card); count++; if (count >= quality) { break; } } if (count >= quality) { break; } } } // 찾은 카드들 제거 for (int i = 0, iMax = cardsToRemove.Count; i < iMax; i++) { sample_script card = cardsToRemove[i]; if (card != null) { int number = card.number; if (collisionInfo.ContainsKey(number)) { collisionInfo[number]--; if (collisionInfo[number] == 0) { collisionInfo.Remove(number); } } Debug.Log($"충돌 정보 제거: number={number}"); collidedCardList.Remove(card); Destroy(card.gameObject); } } } } 대충 이렇?게 하면 될 것 같은데 함 츄라이 츄라이