TIL(2024,08,02)최종 프로젝트 1차구현 하나씩 만들기

김보근·2024년 8월 2일

Unity

목록 보기
58/113
post-thumbnail

유니티에서 광고 쿨타임 기능 구현

목표
오늘의 목표는 유니티 게임에서 광고 쿨타임 기능을 구현하는 것이었습니다. 광고를 성공적으로 본 후 모든 스킬의 쿨타임을 초기화하고, 광고 버튼이 사용된 후 일정 시간(30분) 동안 쿨타임 상태가 되도록 하는 것이 주요 과제였습니다.

작업 과정
환경 설정:

유니티 프로젝트에 Google Mobile Ads SDK를 초기화했습니다.
광고 기능과 쿨타임을 관리하기 위해 ADSkillManager라는 스크립트를 작성했습니다.

스크립트 구현:
ADSkillManager 클래스에 필요한 필드를 정의했습니다:
allSkills: 모든 스킬 객체를 담는 배열.
adCooldownFillImage: 광고 쿨타임을 표시할 이미지.
adCooldownText: 광고 쿨타임을 표시할 텍스트.
adButton: 광고 버튼.
adOnCooldown: 광고 쿨타임 상태를 나타내는 부울 값.
adCooldownRemaining: 광고 쿨타임 남은 시간.
adCooldownTime: 광고 쿨타임 전체 시간(1800초, 즉 30분).

광고 쿨타임 로직 구현:
Start 메서드에서 모든 스킬 객체를 초기화하고 광고 버튼에 클릭 리스너를 추가했습니다.
OnShowAdButtonClicked 메서드를 통해 광고 버튼 클릭 시 광고를 보여주고, 광고가 성공적으로 표시된 후 쿨타임을 설정하도록 했습니다.
SetAdCooldown 메서드에서 광고 버튼 쿨타임을 설정하고, 쿨타임 동안 버튼을 클릭해도 광고가 다시 표시되지 않도록 했습니다.
UpdateAdCooldownUI 코루틴을 사용해 쿨타임 동안 UI를 업데이트하고, 쿨타임이 끝나면 광고 버튼을 다시 활성화했습니다.
UpdateAdCooldownUIElements 메서드에서 쿨타임 동안 이미지와 텍스트 UI를 업데이트했습니다.

using GoogleMobileAds.Api;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using System.Collections;

public class ADSkillManager : MonoBehaviour
{
    public Skill[] allSkills;
    public Image adCooldownFillImage; // 광고 스킬 쿨타임을 표시할 이미지
    public TextMeshProUGUI adCooldownText; // 광고 스킬 쿨타임을 표시할 텍스트
    public Button adButton; // 광고 버튼

    private bool adOnCooldown = false;
    private float adCooldownRemaining;
    private float adCooldownTime = 1800f; // 30분

    void Start()
    {
        // 모든 스킬을 초기화합니다.
        allSkills = FindObjectsOfType<Skill>();
        adButton.onClick.AddListener(OnShowAdButtonClicked); // 클릭 이벤트 리스너 추가
    }

    public void ResetAllSkillCooldowns()
    {
        foreach (var skill in allSkills)
        {
            skill.ResetCooldown();
        }
    }

    public void OnShowAdButtonClicked()
    {
        if (!adOnCooldown)
        {
            // 광고를 보고 난 후 모든 스킬의 쿨타임을 초기화하고, SkillManager의 쿨타임을 30분으로 설정합니다.
            RewardedAdExample.Instance.ShowRewardedAd((Reward reward) =>
            {
                // 광고가 성공적으로 표시된 후 실행되는 콜백
                ResetAllSkillCooldowns();
                SetAdCooldown(adCooldownTime); // 광고 스킬 쿨타임을 30분으로 설정
            });
        }
        else
        {
            Debug.Log("Ad button is on cooldown.");
        }
    }

    private void SetAdCooldown(float cooldownTime)
    {
        adOnCooldown = true;
        adCooldownRemaining = cooldownTime;
        UpdateAdCooldownUIElements(cooldownTime, cooldownTime); // 쿨타임 시작 시 fillAmount를 0으로 설정
        StartCoroutine(UpdateAdCooldownUI());
    }

    private IEnumerator UpdateAdCooldownUI()
    {
        while (adCooldownRemaining > 0)
        {
            adCooldownRemaining -= Time.deltaTime;
            UpdateAdCooldownUIElements(adCooldownRemaining, adCooldownTime);
            yield return null;
        }
        adOnCooldown = false;
        UpdateAdCooldownUIElements(0, adCooldownTime); // 최종적으로 쿨타임이 0이 되었을 때 UI 업데이트
    }

    private void UpdateAdCooldownUIElements(float remainingTime, float cooldownTime)
    {
        if (adCooldownFillImage != null)
        {
            adCooldownFillImage.fillAmount = (cooldownTime - remainingTime) / cooldownTime;
        }

        if (adCooldownText != null)
        {
            int minutes = Mathf.FloorToInt(remainingTime / 60);
            int seconds = Mathf.CeilToInt(remainingTime % 60);
            adCooldownText.text = $"{minutes:D2}:{seconds:D2}";
        }
    }
}

트러블슈팅

문제: 광고 버튼이 쿨타임 중에도 작동하는 문제

해결 방법: adOnCooldown 상태를 확인하여 쿨타임 중일 때는 광고 버튼이 작동하지 않도록 조건문을 추가했습니다.
문제: 쿨타임 동안 광고 버튼의 fillAmount가 제대로 업데이트되지 않는 문제

해결 방법: UpdateAdCooldownUIElements 메서드에서 fillAmount를 업데이트하는 로직을 수정하여 시간이 지남에 따라 0에서 1로 증가하도록 수정했습니다.
문제: 광고가 성공적으로 표시된 후 쿨타임이 설정되지 않는 문제

해결 방법: OnShowAdButtonClicked 메서드에서 광고가 성공적으로 표시된 후 쿨타임을 설정하도록 콜백을 추가했습니다.
이를 통해 광고 버튼의 쿨타임 기능을 성공적으로 구현할 수 있었습니다.

profile
게임개발자꿈나무

0개의 댓글