Unity/Project : Ocean Cleaner

OceanCleaner 21.08.08~21.08.09 개발일지

HappyFrog 2021. 8. 10. 04:00

08.07 개발일지 내용에 이어간다.

 


팝업구조와 광고 분기를 나누어주었으니 이제 보는 광고에 따라 차등보상을 지급할 수 있도록 구현해보자.

 

public void NoSkipTrashProcess()
    {
        UserInfo.Instance.TrashCollect(garbageAmount);
        UserInfo.Instance.SetCycle(garbageAmount);
        garbageRespawn.FindTrash();
        garbageAmount = 0;
        inGame.CurrentTrash(garbageAmount);
        inGame.CycleCheck();
        uICollection.GetCollectionRandom();        
    }

    public void SkipTrashProcess()
    {
        Debug.Log("skip");
        if(!garbageAmount.Equals(0))
        {
        	Debug.Log(popupControll.skipAdAmount);
            UserInfo.Instance.TrashCollect(garbageAmount * 5);
            UserInfo.Instance.SetCycle(garbageAmount * 5);
            garbageRespawn.FindTrash();           
            garbageAmount = 0;
            inGame.CurrentTrash(garbageAmount);
            inGame.CycleCheck();
            uICollection.GetCollectionRandom();            
        }       
    }
  • 기존 스크립트는 위와 같은 형식이었다.
  • 광고버튼을 누른다면 해당 쓰레기 양만큼 인게임재화를 추가해주고 쓰레기를 리젠시키며 쌓여있는 쓰레기 양을 초기화시켜주는 방식이었다.
  • 광고스킵버튼 또한 같은 기능을 구현하지만 보상에서 차이가 나도록 인게임 재화지급 부분에서 *5를 해주었다.

 

 

public void NoSkipTrashProcess_Front()
    {
        UserInfo.Instance.TrashCollect(garbageAmount);
        UserInfo.Instance.SetCycle(garbageAmount);
        garbageRespawn.FindTrash();
        main.SetSecondPopupAmount(garbageAmount);
        OnSetTrashAmount(garbageAmount);
        garbageAmount = 0;
        inGame.CurrentTrash(garbageAmount);
        inGame.CycleCheck();
        uICollection.GetCollectionRandom();       
    }

    public void NoSkipTrashProcess_Reward()
    {
        UserInfo.Instance.TrashCollect(garbageAmount * 7);
        UserInfo.Instance.SetCycle(garbageAmount * 7);
        garbageRespawn.FindTrash();
        main.SetSecondPopupAmount(garbageAmount * 7);
        OnSetTrashAmount(garbageAmount);
        garbageAmount = 0;
        inGame.CurrentTrash(garbageAmount);
        inGame.CycleCheck();
        uICollection.GetCollectionRandom();        
    }

    public void SkipTrashProcess()
    {
        Debug.Log("skip");
        Debug.Log(popupControll.skipAdAmount);
        if(!garbageAmount.Equals(0))
        {
            UserInfo.Instance.TrashCollect(garbageAmount * 5);
            UserInfo.Instance.SetCycle(garbageAmount * 5);
            garbageRespawn.FindTrash();
            main.SetSecondPopupAmount(garbageAmount * 5);
            OnSetTrashAmount(garbageAmount);
            garbageAmount = 0;
            inGame.CurrentTrash(garbageAmount);
            inGame.CycleCheck();
            uICollection.GetCollectionRandom(); 
    	}
    }
  •  위와 같이 전면/보상/광고스킵 버튼들의 분기를 나누어 주었으며 보상강도는 1/7/5로 설정했다.
    • =>보상광고가 30초로 꽤 긴 시간이며 광고스킵권의 과금금액이 상당히 낮은 점을 감안하여 해당 비율로 책정했다.
  • 코드 자체는 그대로 썻으며 중간에 main.SetSecondPopupAmount라는 메인의 메서드를 실행하는 코드와 OnSetTrashAmount라는 대리자가 실행되는데
    • => 그 이유는 쓰레기를 업사이클 시킬 때 애니메이션과 소리가 제대로 나지않았으며 결과창 팝업에 항상 0만큼 갈았다고 출력되는 오류를 고치기 위한 추가 코드이다.
    • 해당 오류의 원인은 garbageAmount가 0으로 초기화 된 후에 팝업의 텍스트와 애니메이션의 분기가 설정되어 각각 모두 garbageAmount가 0일때의 결과를 출력한 것이었다.
    • 따라서 garbageAmount를 0으로 초기화하기 이전에 결과창 팝업을 띄워주는 SetSecondPopupAmount메서드를 실행하고
    • 애니메이션도 0으로 초기화되기 전에 모은 양만큼 설정해주어 해당 쓰레기 양에 맞는 애니메이션을 출력하도록 했다.
  • 서순에 따라 추가구현해주니 오류가 해결되었다.

 


이번엔 쓰레기통에 쓰레기가 존재할 때 쓰레기를 업사이클 할 수 있다는 걸 알려주기위한 UI애니메이션을 구현해보자.

 

일단 조그마한 UI소스를 알맞은 위치에 배치시켜주었다.

 

  • 그리고 Animation을 생성하여 애니메이터, 애니메이션을 생성했다.
    • =>원하는 오브젝트를 선택하고 Window - Animation - Animation 또는 Ctrl + 6을 눌러주면 생성된다.
  • 생성된 애니메이션을 UI용으로 녹화해보자.

 

 

 

  • 오브젝트가 선택된 상태에서 녹화버튼을 누르고 Click문구의 배경과 텍스트의 투명도(Alpha값)을 0으로 만들어 투명하게 시작하도록 하였다.
  • 이어서 적절한 시간이 지나면 완전히 불투명해지게 했으며 해당 두가지 변화값을 복사하여 시간만 조절해주었다.
  • 서서히 나타남 - 불투명상태를 지속 - 서서히 투명해짐 상태를 실행하는 애니메이션이다.

 

실행해보면 위 짤과 같이 실행된다.

 

 

다음엔 해당 애니메이션을 Loop하도록 설정해주자.

이어서 애니메이션이 조건부로 실행될 수 있도록 Blend Tree를 통해 분기를 나눴다.

  • 애니메이션에 BlendTree를 추가해주면 Animator에 BlendTree가 Float설정과 함께 나타난다. 이름을 설정해주자.
  • 블렌더트리의 Float  Threshold설정은 애니메이션의 인덱스에 따라 결정되니 자동으로 결정된 Threshold값에 따라 재생시킬 수 있도록 한다.
  • 위 사진에서는 0인덱스 애니메이션은 0값일때 재생이므로 재생중단은 Float값을 0이 아닌값으로 설정해주면 된다.

 

그리고 조건부로 실행될 수 있도록 코딩을 하자.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Advertisements;

public class GarbageInfo : MonoBehaviour
{
    public Animator animeBtnUpcycle;
    bool isEmpty = true;

    public void FillTrashAmount()
    {
        garbageAmount += 10;
        if (!isEmpty) return;
        Play_BtnUpcycle_Blink();
    }
    
    public void NoSkipTrashProcess_Front()
    {        
        Stop_BtnUpcycle_Blink();
    }

    public void NoSkipTrashProcess_Reward()
    {        
        Stop_BtnUpcycle_Blink();
    }

    public void SkipTrashProcess()
    {        
            Stop_BtnUpcycle_Blink();       
    }

    // Upcycle버튼 애니메이션
    void Play_BtnUpcycle_Blink()
    {
        isEmpty = false;
        animeBtnUpcycle.gameObject.SetActive(true);
        animeBtnUpcycle.SetFloat("Blink", 0);
    }

    void Stop_BtnUpcycle_Blink()
    {
        animeBtnUpcycle.SetFloat("Blink", 1);
        animeBtnUpcycle.gameObject.SetActive(false);
        isEmpty = true;
    }
}
  • 이 위쪽에 구현한 차등보상 스크립트에 해당 내용들을 추가해주었다.
  • 쓰레기 양이 0에서 하나라도 추가되면 애니메이션을 재생했으며 쓰레기를 수집할 때마다 다시 재생되지 않도록 bool값을 통한 조건문을 설정해주었다.
  • 그리고 광고 또는 스킵버튼을 누르면 수집했던 쓰레기가 초기화되어 0이 되기때문에 0이된 이후에 isEmpty를 true로 만들어주고 애니메이션을 중단시켰으며 말풍선 자체도 SetActive(false)시켰다.
  • 애니메이션 재생은 블렌더트리를 사용했으므로 SetFloat을 통해 재생시켰으며 재생할때는 0, 중단할때는 1을 할당하여 조작했다.

 

  • 코딩까지 완료했다면 위와 같이 쓰레기를 수집했을 때 애니메이션이 재생되는 모습을 확인할 수 있다.
  • =>그리고 깜빡이던 애니메이션은 쓰레기 업사이클버튼을 누르면 중단되는 것을 확인할 수 있다.