오늘은 알고리즘 강의와 여러 알고리즘 문제들을 풀면서 공부하는 시간을 가졌다. 아직 많이 모자라고 부족한 점도 많지만 문제를 분석하고 정리해둔 후 코드로 바꾼다는 접근법을 알게된 것만으로 많이 배웠다고 생각한다. 알고리즘 풀 때는 비슷한 유형의 문제들을 연속적으로 풀어서 그 유형에 익숙해지도록 해야겠다.
강의 과제로 문제들을 풀면서 힌트도 보고 했는데 내일은 힌트를 보지 않고 강의에 나온 문제들을 다시 복습하는 시간을 가져야겠다. 내일도 파이팅!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectPooler : MonoBehaviour
{
public static ObjectPooler I;
[Header("Pools")]
public ObjectPool<TouchParticle> touchPool;
public ObjectPool<Explosion> explosionPool;
void Awake()
{
I = this;
// 터치 이펙트 풀
TouchParticle touchPrefab = Resources.Load<TouchParticle>("TouchParticle");
touchPool = new ObjectPool<TouchParticle>(touchPrefab, transform, 10);
// 카드 폭발 풀
// 폭발은 그냥 생성 파괴 해도 될 수도? - 갯수가 얼마 없음
Explosion explosionPrefab = Resources.Load<Explosion>("Explosion");
explosionPool = new ObjectPool<Explosion>(explosionPrefab, transform, 4);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool<T> where T : MonoBehaviour, IPoolable<T>
{
[Header("풀링 프리펩")]
T tPrefab;
[Header("스택 풀")]
Stack<T> objectPool = new Stack<T>();
Transform parentTrans;
public ObjectPool(T t, Transform trans, int initCount)
{
tPrefab = t;
parentTrans = trans;
for (int i = 0; i < initCount; i++)
{
CreateNewObject();
}
}
public T GetObject()
{
T t = null;
if (objectPool.Count > 0)
{
t = objectPool.Pop();
t.gameObject.SetActive(true);
}
else
{
t = CreateNewObject();
}
return t;
}
void ReturnObject(T t)
{
objectPool.Push(t);
}
T CreateNewObject()
{
T t = Object.Instantiate(tPrefab, parentTrans);
t.SetReturnObject(ReturnObject);
t.gameObject.SetActive(false);
return t;
}
}
Resources.LoadAll로 Sprite를 다 부른 후 특정 스프라이트 기준으로 스케일을 세팅하였다.
void Start()
{
Time.timeScale = 1f;
int[] teams = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };
teams = teams.OrderBy(item => Random.Range(-1.0f, 1.0f)).ToArray();
// 폴더의 스프라이트 모두 부르기
Sprite[] sprites = Resources.LoadAll<Sprite>(CARD_PATH);
for (int i = 0; i < 16; i++)
{
GameObject newCard = Instantiate(card);
// newCard를 cards 안으로 옮겨줘
newCard.transform.parent = GameObject.Find("cards").transform;
float x = (i / 4) * 1.4f - 2.1f;
float y = (i % 4) * 1.4f - 3.0f;
newCard.transform.position = new Vector3(x, y, 0);
Transform frontTrans = newCard.transform.Find("front");
SpriteRenderer cardRenderer = frontTrans.GetComponent<SpriteRenderer>();
cardRenderer.sprite = sprites[teams[i]];
// 스케일 세팅
Vector3 tempScale = frontTrans.transform.localScale;
tempScale.x *= rtanSpriteSize / cardRenderer.sprite.rect.width;
tempScale.y *= rtanSpriteSize / cardRenderer.sprite.rect.height;
frontTrans.localScale = tempScale;
}
}
맞췄을 때와 아닐 때 구분하기
정해진 시간을 기준으로 맞췄을 때와 아닐 때를 구분하였다.
private IEnumerator CoVerifyMatching(string cardName, bool isCorrect = false)
{
// 맞췄을 때
if (isCorrect)
{
matchText.text = cardName.Split('_')[0];
matchText.color = correctColor;
}
// 아닐 때
else
{
matchText.text = unCorrectMessage;
matchText.color = unCorrectColor;
}
matchText.gameObject.SetActive(true);
yield return new WaitForSeconds(matchTextTime);
matchText.gameObject.SetActive(false);
}
플레이 장면
느낀 점
나는 게임 개발자로서 성장하기 위해 이번 부트캠프에 도전하게 되었다. 꾸준함과 노력은 결과를 배신하지 않는다고 믿고있다. 단순히 시간을 버리는 것이 아닌 주어진 시간에 집중하여 내 자신을 가꿔 한 발 더 성장하는 시간이 되었으면 좋겠다. 오늘 보다 나은 내일의 내가 될 것을 다짐하며 오늘 하루를 보냈다. 게으름과 싸워 지지말자 파이팅!
Project Settings - Services General Settings에 계정 연결하기
Organizations 선택 후 Create project ID
13세 이하 광고 - NO
Window - General - Services
Advertisement 설치
만약 이게 안 뜰 시 에디터 껐다 키기
Leran More - Unity Monetize 대시보드 이동
광고 세팅
끝 버튼 누르면 광고를 보여주고 광고를 다 봐야만 재시작을 할 수 있도록 함
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class endTxt : MonoBehaviour
{
public void ReGame()
{
adsManager.I.ShowRewardAd();
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Advertisements;
public class adsManager : MonoBehaviour, IUnityAdsShowListener, IUnityAdsInitializationListener, IUnityAdsLoadListener
{
public static adsManager I;
string adType;
string gameId;
void Awake()
{
I = this;
if (Application.platform == RuntimePlatform.IPhonePlayer)
{
adType = "Rewarded_iOS";
gameId = "5369710";
}
else
{
adType = "Rewarded_Android";
gameId = "5369711";
}
Advertisement.Initialize(gameId, true, this);
}
public void ShowRewardAd()
{
if (Advertisement.isSupported)
{
Advertisement.Show(adType, this);
}
}
/*void ResultAds(ShowResult result)
{
switch (result)
{
case ShowResult.Failed:
Debug.LogError("광고 보기에 실패했습니다.");
break;
case ShowResult.Skipped:
Debug.Log("광고를 스킵했습니다.");
break;
case ShowResult.Finished:
// 광고 보기 보상 기능
Debug.Log("광고 보기를 완료했습니다.");
break;
}
}*/
public void OnUnityAdsShowFailure(string placementId, UnityAdsShowError error, string message)
{
Debug.LogError("광고 보기에 실패했습니다.");
}
public void OnUnityAdsShowStart(string placementId)
{
Debug.Log("광고 보기를 시작했습니다.");
}
public void OnUnityAdsShowClick(string placementId)
{
Debug.Log("광고 보기를 클릭했습니다.");
}
public void OnUnityAdsShowComplete(string placementId, UnityAdsShowCompletionState showCompletionState)
{
Debug.Log("광고 보기를 완료했습니다.");
gameManager.I.retryGame();
}
public void OnInitializationComplete()
{
Debug.Log("Init Success");
}
public void OnInitializationFailed(UnityAdsInitializationError error, string message)
{
Debug.Log($"Init Failed: [{error}]: {message}");
}
public void OnUnityAdsAdLoaded(string placementId)
{
Debug.Log($"Load Success: {placementId}");
}
public void OnUnityAdsFailedToLoad(string placementId, UnityAdsLoadError error, string message)
{
Debug.Log($"Load Failed: [{error}:{placementId}] {message}");
}
}