본문 바로가기
C#

[C#][Unity] 2D 아이템 자동습득

by teamnova 2022. 11. 28.

안녕하세요.

오늘은 드롭된 아이템이 날라와서 자동습득하는 예제를 진행하겠습니다.

더보기

기존예제인 '2D 오브젝트 제거시 아이템드랍' 에서 이어지는 예제입니다.

https://stickode.tistory.com/612

 

먼저, 싱글톤 패턴인 GameManager를 생성하겠습니다.

(싱글톤패턴에 관련해서는 다른 게시글에 자세하게 설명이 되어있습니다.)

 

GameManager라는 스크립트를 생성합니다.

GameManager라는 정확한 명칭으로 생성하면 많이 사용하는 명칭이라 유니티에서 아이콘 모양을 다르게 표시해줍니다.

 

//GameManager.cs

public class GameManager : MonoBehaviour
{
    public static GameManager instance;
    private void Awake(){
        instance = this;
    }

    public GameObject player;
}

 

그 다음, 계층구조에서 빈오브젝트를 생성합니다.

 

그리고 이름을 마찬가지로 GameManager로 변경해줍니다.

 

GameManager 오브젝트에 GameManager 스크립트를 컴포넌트로 추가합니다.

그리고 Player 파라미터에 메인캐릭터 오브젝트를 지정합니다.

 

GameManager 세팅이 끝났습니다.

이제 드랍되는 아이템에 PickUpItem 이라는 스크립트를 새컴포넌트로 추가합니다.

 

 

//PickUpItem.cs

public class PickUpItem : MonoBehaviour
{   
    Transform player;
    [SerializeField] float speed = 5f; //플레이어가 습득시 플레이어로 날라오는 속도
    [SerializeField] float pickUpDistance = 1.5f; //아이템습득범위
    
    private void Awake(){
        player = GameManager.instance.player.transform;
    }
    
    void Update()
    {
        float distance = Vector3.Distance(transform.position, player.position); 
        //transform.position 은 아이템의 위치, player.position은 플레이어 위치
        //Vector3.Distance(a,b) => a와 b 사이의 거리 반환

        if(distance > pickUpDistance){//아이템 습득 범위보다 멀리 캐릭터가 있는경우 
            return;
        }

        transform.position = Vector3.MoveTowards(transform.position, player.position, speed * Time.deltaTime);
        //아이템 위치를 플레이어로 이동 , 속력(3번째 매개변수)
        //time.deltaTime => 컴퓨터 성능이 제각기 다르므로 (1초에 어떤 컴은 20프레임 어떤컴은 10프레임) 이를 동일하게 하는 함수
    
        if(distance < 0.1f){ //물체가 캐릭터로 이동하면서 거리가 일정 미만되면 습득으로 간주하고 아이템삭제
            Destroy(gameObject);
        }
    }
}

아이템에 플레이어가 가까이가면 아이템이 플레이어로 날아오면서 일정 거리 미만이 되면 아이템을 습득한 것 처럼 삭제됩니다.