Chapter 1. Coin Colleting

개발하는 운동인·2024년 11월 8일
post-thumbnail

Coin Colleting 구현 시작

    1. 먼저 코인이 어디서 부터 시작할 것인지 시작지점을 만들어줘야 한다.
  • RectTransform 컴포넌트만 갖고 있는 UI 이다. (빈 객체)

    1. 코인의 최종 목적지를 만들어 줘야 한다.

    1. 코인의 이미지와 텍스트를 만들어 준다. 코인의 최종 목적지 산하에 위치 시킨다.

    1. 버튼을 눌렀을 때 코인을 모을 것이기 때문에 버튼 UI 를 만들어준다.

    1. CoinManager라는 빈 객체를 만들고, UI_Coin 이라는 스크립트를 생성 후 추가 한다.
    1. 코인의 시작 위치와 코인의 부모 위치를 public으로 선언한다. (타입은 Transform)
    1. 버튼 UI를 클릭했을 때 실행할 메서드를 작성하고, 코인을 보여줄 메서드를 호출한다.
    1. 코인의 부모 위치를 Vector2 변수에 저장한다. 이유는 아래에서 설명하겠다.
    1. 기존 ResourceManager에 있는 Instantiate 메서드를 사용한다. Managers.Resource.Instantiate("경로",코인 시작 위치, 코인의 부모 위치)
  • Instantiate 메서드의 매개변수인 string path Vector3? position = null, Transform parent = null 가 있었다. path를 통해 UI_Coin 프리펩 위치에 대한 경로를 받아오고 GameObject 타입의 prefab으로 저장한다.

  • UI_Coin은 Poolable 이 아니므로 else문이 실행 된다. else문에서 Object.Instantiate(prefab,parent) 을 해서 프리펩 생성과, 해당 프리펩의 부모까지 설정하고 반환한다.

    1. 코인의 시작 위치를 생성했었던 코인의 위치로 저장한다. 즉, 코인의 시작위치에 코인이 생성되게 한다.
    1. UI_Coin 을 인스펙터창에서 할당한다.
  • 실행 시, 생성된 코인이 CoinUI 산하에 생성되었고, 코인이 시작 위치에 생성되긴 하지만 원하는데로 구현되지 않았다.

⭐ 계속

    1. DOTween 무료 에셋을 다운로드 받는다.
    1. 코인이 이동할 최종 위치(목적지)에 대한 변수를 생성한다.
    1. 코인이 이동했을 때의 속도에 대한 변수를 생성한다.
    1. Ease 타입 변수를 생성한다.

✅ Ease 타입의 대한 설명 (DOTween 지원)

  • public Ease moveEase;는 DOTween에서 제공하는 Ease 타입 변수이다.
  • Ease는 애니메이션의 움직임을 조절하는 방식을 정의하는 열거형(enum)이다.
    1. 생성한 cointObject가 최종 위치(목적지)까지 갈때 간단한 애니메이션을 적용하기 위해 DOMove 메서드를 사용한다. DOMove 또한 DOTween에서 지원하는 함수이다.
  • coinObject.transform.DOMove(coinEnd.position, moveDuration) : coinObject.transform 위치를 coinEnd.position 위치로 moveDuration(속도) 만큼 이동한다.
  • .SetEase(moveEase): SetEase는 애니메이션이 진행되는 동안 속도가 어떻게 변화할지를 설정하는 이다. 이전의 변수로 만들었던 moveEase는 Ease 타입의 변수이다. 인스펙터창에서 설정할 것이다.
    1. 인스펙터창에서 위에서 선언했던 것들에 대한 할당 한다.

  • CoinEnd도 할당한다. CoinEnd는 최종 목적지다.

  • 실행 시 , 코인이 움직이기 시작했다.

🤔 버튼을 클릭할 때마다 이동하는 것이 아닌(모으는 것이 아닌) 개수를 지정한다음 연달아 이동하게 하려면 어떻게 해야 할까?

  • 코인의 총 개수만큼 이동할 수 있게 끔 for문을 만들고, 이동 할 때 딜레이를 주도록 한다.

⭐ 계속

    1. 코인의 개수에 관한 변수와 코인이 연달아 이동할 때 약간의 딜레이를 줄 변수를 선언한다.
    1. 코인의 개수 만큼 이동하기 위해 for문을 사용하고, i * coinPerDelay 를 해서 나온 targetDelay변수를 ShowCoin 메서드를 호출할 때 인자로 넘긴다.
    1. ShowCoin의 매개변수를 추가하고, .SetDelay(딜레이); 을 해서 이동할 때 딜레이를 주도록 하는 메서드를 추가한다.
    1. 인스펙터창에서 위에서 추가한 값을 할당한다.
  • 실행 시, 딜레이 적용과 버튼 한번 클릭으로 CoinAmount만큼 코인이 최종목적지를 향해 움직인다.

🤔하지만, 코인이 코인의 시작위치에서 한 뭉탱이로 움직이는 것이 아닌 여러 군데에서 움직이게 하고 싶다. 어떻게 해야 할까?

  • 여러 군데라는 것은 Random.Range() 을 사용해서 새로운 위치를 새로운 벡터에 저장하고, 코인의 시작 위치를 더해준다.

⭐ 계속

    1. new Vector3() 을 해서 새로운 위치를 만들고, 인자로 Random.Range() 이용해서 얻은 결과를 offset에 저장한다. 그리고 저장한 offset에 코인의 시작 위치를 더해준다.
    1. 코인이 생성되고 나서, 코인의 위치를 22번에서 했던 위치로 변경한다.
  • 실행 시 , 한 뭉탱이로 움직이는 것이 아닌 여러 군데에서 움직이고 있다.

🤔하지만, 코인이 최종 목적지에 도달했을 때 Destroy를 해주지 않아 계속 쌓이고 있다. 어떻게 해야 할까?

⭐ 계속

    1. 먼저, 코인의 초기 사이즈(localScale)을 설정하고, 코인이 움직일 때 초기 사이즈에서 1,1,1 의 크기만큼 이동하도록 한다.
  • 즉, 1,1,1 에서 코인이 움직일 때 delay을 줘서 1,1,1으로 최종 목적지에 도달 할 수 있게 끔한다.
    1. DOTween에 애니메이션이 완료되었을 때 호출되는 함수인 OnComplete 메서드를 이용한다.

  • 실행되었을 때 괄호 안에 람다식을 사용해서 실행할 내용들을 작성한다. 즉, 이 코드는 애니메이션이 완료 되었을 때 코인을 비활성화 하는 코드이다.

  • 실행 시, 코인이 최종 목적지에 도달하면 코인 ui가 비활성화 되는 것을 볼 수 있다.

🤔 하지만 버튼을 누를 때마다 계속 생성된다. 즉, 재사용성이 없다. 어떻게 하면 좋을까?

⭐ 마무리

    1. 기존에 PoolManager에서 오브젝트 풀링을 구현했었다. (PoolManager 내용 참고) 코인 프리펩에 Poolable 스크립트를 추가한다.
    1. 위에서 애니메이션이 완료되었을 때 호출되는 함수인 OnComplete 메서드에서 Manager.Resource.Destroy( 코인프리펩 )을 한다.
  • 실행 시, 오브젝트 풀링을 통해 재사용성을 높여서 효율적으로 관리하고 있다.

0개의 댓글