• 콜라이더 사용

  • 고려할 부분

    • 상호작용 구현에 있어서 너무 많은 기능 → 분리구현할 필요가 있어 보임

      • 인터페이스로 분리 구현방법 구상

      → 플레이어 컨트롤과 플레이어 상호작용 로직을 분리, 상호작용 로직을 인터페이스로 구현

      public interface Interactable { //인터 페이스 구현
          void Interact(PlayerController player);
      }
      ------------------------------------------------
      public class PlayerInteractionController : MonoBehaviour { // 플레이어 상호작용 로직 클래
          private void Update() {
              if (Input.GetKeyDown(KeyCode.F)) {
                  InteractWithObject(); //상호작용 메소드 호출
              }
          }
      
          private void InteractWithObject() { //상호작용 메소드 구현
              Collider2D[] hitColliders = Physics2D.OverlapCircleAll(transform.position, 1f);
              foreach (var hitCollider in hitColliders) {
                  IInteractable interactable = hitCollider.GetComponent<IInteractable>();
                  if (interactable != null) {
                      interactable.Interact(this.GetComponent<PlayerController>());
                      break; // 첫 번째 상호작용 가능한 오브젝트와만 상호작용
                  }
              }
          }
      }
      
      ----------------------------------------------------
      public class Resource : MonoBehaviour, IInteractable {
          public void Interact(PlayerController player) {
              // 자원 채굴 로직
           
          }
      }
      
      public class MinerInOut : MonoBehaviour, IInteractable {
          public void Interact(PlayerController player) {
              // 탐사선 출입 로직
            
          }
      }
      

    상호과정 로직 흐름 설명(플레이어- 자원)

    1. 플레이어의 상호작용 입력 감지
    void Update() {
        if (Input.GetKeyDown(KeyCode.F)) {
            InteractWithObject();
        }
    }
    
    1. 상호작용 가능 오브젝트 탐지
    private void InteractWithObject() {
        Collider2D[] hitColliders = Physics2D.OverlapCircleAll(transform.position, 1f);
        foreach (var hitCollider in hitColliders) {
            IInteractable interactable = hitCollider.GetComponent<IInteractable>();
            if (interactable != null) {
                interactable.Interact(this.GetComponent<PlayerController>());
                break;
            }
        }
    }
    
    1. 오브젝트와 상호작용 처리
    public void Interact(PlayerController player) {
        PlayerInventory playerInventory = player.GetComponent<PlayerInventory>();
        if (playerInventory != null) {
            playerInventory.AddItem(resourceName, quantity);
            Debug.Log($"Added {quantity} {resourceName} to the player's inventory.");
            
            Destroy(gameObject); // 자원을 인벤토리에 추가한 후, 오브젝트 제거
        }
    }
    
    • 오브젝트 밀집도: 많은 오브젝트가 밀집되어 있는 지역에서는, 특정 오브젝트와의 상호작용이 의도치 않게 다른 오브젝트와의 상호작용으로 이어질 수 있슴
      • 해결방안
        1. 우선순위 설정
        2. 상호작용 영역 표시 및 설정