콜라이더 사용
고려할 부분
상호작용 구현에 있어서 너무 많은 기능 → 분리구현할 필요가 있어 보임
→ 플레이어 컨트롤과 플레이어 상호작용 로직을 분리, 상호작용 로직을 인터페이스로 구현
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) {
// 탐사선 출입 로직
}
}
상호과정 로직 흐름 설명(플레이어- 자원)
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 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); // 자원을 인벤토리에 추가한 후, 오브젝트 제거
}
}