유니티 방치형 프로젝트 - 코인 획득

반응형

 

 

코인 획득하는 로직을 작성하기 전에 코인이 나타나는 과정을 러프하게 설명하겠습니다.

 

코인이 나타나는 기준은 몬스터를 처치했을 때 입니다. 

따라서 플레이어가 몬스터를 공격하는 시점부터 설명하겠습니다.

 

플레이어 몬스터 공격 ( Character.cs )

공격 모션 취할 때 Bullet() 메서드가 실행 되며 Bullet 오브젝트를 생성합니다 

 

생성 된 Bulet 오브젝트 몬스터를 향해 이동 ( Bullet.cs )

블릿과 몬스터의 일정 거리가 0.1f 이하일 때 타겟에 성공했다고 판단하고 GetDamage로 데미지 처리 진행

 

몬스터 타격 처리 (Monster.cs)

GetDamage는 Monster 스크립트에 작성 된 메서드 입니다 .

 

GetDamage에서는
1. 데미지 UI를 표시합니다

2. 몬스터 체력이 0 이하라면 이펙트도 표시합니다.

3. 그리고 몬스터 체력이 0이라는 것은 사망을 의미하기 때문에 이 때 코인을 획득하게 됩니다 Pooling_Obj에서 CointParent 이름으로 된 풀을 가져오게 됩니다

 

CoinParent 구조 살펴보기

우리가 딕셔너리 참조 후 풀에서 꺼내온 CoinParent는 여러개의 코인이미자가 자식으로 되어있고 부모는 CointParnet  스크립트가 적용 되어 있습니다. 이 코인은 몬스터 처치할떄 랜덤하게 살짝 퍼졌다가 왼쪽 상단 코인 UI에 합쳐지도록 설계할 것입니다.

 

몬스터 사망 위치 전달 

위 코드에도 나와있지만 아래 한 번 더 적었습니다

Init 할 때 몬스터의 위치 transform,position을 같이 전달합니다.,

 

코인 오브젝트 캔버스에 설정

Vector3로 받은 pos는 몬스터가 죽은 위치값 입니다.

이 값을 우선은 _target에 저장합니다. (지금 당장 사용 하지는 않음)

 

그리고 몬스터가 죽은 위치에 코인을 나타나게 하기 위해 pos값을 월드좌표 => 화면좌표 로 변경합니다.

 

일단은 코인이 죽은 몬스터 위치에서 나타나야 하므로 Vector3 로 받은 pos의 월드좌표를 화면 좌표로 변경하고 transform.position 으로 설정합니다 이러면 코인이 죽은 몬스터 위치로 설정 됩니다. 

 

for문을 돌리는 이유는 이 오브젝트가 오브젝트 풀링 기법에 의해 재사용 되기 때문에 위치를 초기화 시키기 위함 입니다.

 

HolderLayer는 레이어 설정입니다 코인 위에 데미지 UI Text가 표시 되게 합니다.

 

이제 코인이 랜덤하게 살짝 펼쳐졌다가 왼쪽 상단으로 쭉 이동되도록 하는 코루틴을 실행시킨다.


우선 Coint_Effect 코루틴의 동작 방식을 단계적으로 설명해 보겠습니다.

 

코인 랜덤하게 퍼질 위치 설정

첫 번쨰 for문을 통해 randomPos에 각 코인 이미지들이 도착해야 하는 위치값을 저장합니다.

 

설정한 위치로 코인 이동

첫 번쨰 while 문 내부의 for문을 보면 Movetowards를 사용하여 아까 randomPos에 랜덤위치 정했던 곳으로 코인을 이동시킵니다.

 

모든 코인이 randomPos에 잘 도착한 경우에만 while문을 종료시킵니다.

Distance_Boolean 메서드에서는 모든 코인을 순회하면서 randomPos로 부터 얼마나 떨어져있는지 체크하고 0.5이상인 게 하나라도 있으면 false를 반환하여 while 문 내부 for문을 계속 돌게 한다.

r

위에서 간략하게 설명한 Distance_Bollean 메서드이다

아래 메서드의 핵심은 distance값 그니까 현재 위치와 도착지점의 거리를 계산해서 하나라도 0,5f 이상이면 다시 진행한다 return false를 반환해서. 

 

위에서 랜덤한 위치로 코인이 다 이동 됐다면 이제 왼쪽 UI로 이동하도록 해야한다 약간의 딜레이를 주기 위해 waitforSeconds 0,3f 정도 주고

MoveTowards 메서드를 사용하여 Base_Canvas의 Coin position으로 이동시킨다 

 

그리고 모든 코인이 도착하면 true를 반환하는 Distance_Boolean_World 메서드를 사용하여 Return 오브젝트를 큐에 반환 시킨다

 

 

 

반응형