[Unity] 유니티 소위말하는 '코인자석'은 이거면 끝인듯 So-called coin magnets only need to know this
유니티 코인자석
안녕하세요 정보처리마법사 입니다.
이번 포스팅의 주제는 코인자석 구현에 관한 내용입니다.
정식명칭은 아니지만 보통 게임에서 플레이어가 코인등의 아이템을 먹었을 때 이펙트가 똭 뜨고 코인의 갯수를 알려주는 UI쪽으로 슈르륵 이동하는 애니메이션 같은걸 그냥 코인자석이라고 부르겠습니다. 그렇게 부르는 사람도 이미 있구요. 플레이어가 코인 근처로 갔을 때 플레이어에게 자석처럼 끌려오는 것도 비슷한 원리이긴 하지만 일단 이 포스팅에서 다루는건 플레이어에게 다가오는 코인자석은 아니구요 앞에 말한 UI쪽으로 날아가는 코인자석입니다.
아 간단히 플레이어에게 다가오는 코인자석은 그냥 맵 상에 있는 코인의 컬라이더를 이따시만하게 크게 만들어서 플레이어가 코인의 컬라이더에 닿았을 때 그냥 코인이 플레이어에게 다가가서 이펙트가 터지게 만들면 됩니다. 둘 다 월드좌표계에 있기 땜시 좌표 변환을 하지 않아도 되기에 별 무리 없이 구현할 수 있습니다. 보통 처음 코인자석을 구현할 때 유니티 좌표계 땜시 혼란을 겪게 되는데요. 월드좌표계, 스크린좌표계 간의 변환땜시 저도 혼란을 많이 겪었는데, 이번 포스팅의 이유는 다음부터 삽질하지 않고 그냥 제 포스팅을 참고하려고 하는 간단한 포스팅입니다.
삽질 해보신분은 알겠지만 보통 함수 이름땜시 Camera.main.WorldToScreenPoint 와 Camera.main.ScreenToWorldPoint 이 두개를 이용하여 변환을 많이 하는데, 해상도 대응을 신경쓰지 않으면 어라 잘되네? 하면서 충분히 쉽게 구현할 수 있지만 해상도 대응을 위해 여러 해상도로 변환해서 테스트를 해보면 해상도 변경할 떄마다 설정한 RectTransform 으로 가지를 않습니다. 에디터에서 보면 분명히 제대로 위치를 설정했는데, 막상 코인 날아가는 곳은 이상한 곳으로 막 날아갑니다. 삽질 해보지 않으신 분들은 공감하지 못하시겠지만 제 생각에는 이거 땜시 삽질을 워낙 많이 해서 그냥 아래 저 이미지와 코드블럭과 같이 Camera.main.WorldToViewPortPoint 메서드를 사용하는 것이 젤 좋은 듯 합니다.
아래는 좌표변환 테스트용 참고 스크립트입니다.
풀링을 적용하지 않아 최적화된 코드는 아니므로 참고만 하시기 바랍니다.
using UnityEngine;
using DoozyUI;
using DG.Tweening;
public class Coin : MonoBehaviour
{
void Start()
{
RectTransform myRect = GameObject.Find("icon_gold").transform.GetComponent<RectTransform>();
Vector3 myPositionOnScreen = Camera.main.WorldToViewportPoint(myRect.position);
gameObject.transform.DOMove(myPositionOnScreen, 5).OnComplete(() =>
{
UIManager.PlaySound("Cash Register");
Destroy(gameObject, 1f);
});
}
}
일단 저는 DoozyUI, DotweenPro 에셋을 사용하기 때문에 이렇게 사용했지만, 안 쓰시는 분들은 그냥 아래 두 줄 만 참고하시면 됩니다.
RectTransform myRect = GameObject.Find("icon_gold").transform.GetComponent<RectTransform>();
Vector3 myPositionOnScreen = Camera.main.WorldToViewportPoint(myRect.position);
이상으로 포스팅을 마칩니다. 감사합니다.
잘 못 된 정보가 있으면 말씀해주세요.
공감버튼 클릭은 작성자에게 큰 힘이 됩니다. 행복한 하루 되세요.
“파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음"