고양이 게임 다시하기
종료할 때 꺼놨던 기능들을 다시 켜주어야 한다.
OnEnable()
OnStart가 처음 1번만 실행된다면 OnEnable()은 켜질 때마다 1번씩 실행된다.
오브젝트를 껐다 켜서, OnEnable()에서 설정해줄 것이다.
하지만 실행 순서가 Awake() → OnEnable() → Start() 이므로 OnEnable()에 무작정 코드를 넣으면 맨 처음 시작되기도 전에 OnEnable()이 켜지므로 문제가 생긴다.
따라서 Start()에서 쓰던 기능들을 Awake()로 옮기고 OnEnable()에 초기화하는 기능들을 넣어준다.
CatController
void Awake()
{
catRb = GetComponent<Rigidbody2D>();
catAnim = GetComponent<Animator>();
}
void OnEnable()
{
transform.localPosition = new Vector3(-7.9f, -1.18f, 0f);
GetComponent<CircleCollider2D>().enabled = true;
soundManager.audioSource.mute = false;
}
ItemEvent
Awake에서 초기 위치를 기억해주고 OnEnable 때마다 위치를 초기화시킨다.
private Vector3 initPos;
void Awake()
{
initPos = transform.localPosition;
}
void OnEnable()
{
SetRandomPos(initPos.x);
}
페이드 2번
FadeRoutine
기존 페이드아웃 되고 바로 엔딩 영상이 재생되던 부분을 페이드아웃 후 페이드인 되며 영상이 재생되게 수정하였다.
IEnumerator FadeRoutine(float fadeTime, Color color, bool isFadeStart)
{
float percent = 0f;
float timer = 0f; // 사용될 타이머
while (percent < 1f)
{
timer += Time.deltaTime;
percent = timer / fadeTime;
float value = isFadeStart ? percent : 1-percent;
fadePanel.color = new Color(color.r, color.g, color.b, value);
yield return null;
}
}
bool값에 따라 percent일 지 1-percent일지 바뀌는 value를 사용하여 하나의 메소드로 페이드인과 페이드 아웃을 구현한다.
EndingRoutine
기존 영상재생과 안 쓰는 오브젝트 비활성화를 담당했던 EndingRoutine에 페이드인 메소드도 넣어준다.
// 사과 10개 획득 시 해피 비디오 실행
if (GameManager.score >= 10)
{
fadeUI.SetActive(true);
fadeUI.GetComponent<FadePanel>().OnFade(3f, Color.white, true); // 페이드아웃
GetComponent<CircleCollider2D>().enabled = false;
StartCoroutine(EndingRoutine(true)); // 영상 재생 및 페이드인
}
IEnumerator EndingRoutine(bool isHappy)
{
yield return new WaitForSeconds(3.5f); // 페이드 아웃 대기
videoManager.VideoPlay(isHappy); // 영상 재생 시작
yield return new WaitForSeconds(1f);
var newColor = isHappy ? Color.white : Color.black;
fadeUI.GetComponent<FadePanel>().OnFade(3f, newColor, false); // 페이드인 실행
yield return new WaitForSeconds(3f);
fadeUI.SetActive(false);
gameOverUI.SetActive(false);
soundManager.audioSource.Stop();
transform.parent.gameObject.SetActive(false); // PLAY 오브젝트 Off
}
기존 코드에서 transform.parent.gameObject.SetActive(false); 부분이 먼저 실행되어 뒷부분 코드들이 실행되지 않는 문제가 있었는데, Script를 가지고 있는 오브젝트가 비활성화되면 스크립트 내용도 실행되지 않으므로 주의한다.
해상도 조절
기존에 빌드하면 전체화면일 경우 배경이 이렇게 되는 문제가 있었다.
Stretch Fill을 하면 픽셀이 깨지더라도 늘려서 해상도에 맞춘다.
CCTV 실습
오브젝트 배치
기즈모
인스펙터에서 아이콘 선택하면 씬에서 기즈모를 볼 수 있다.
TV 안에 RawImage 배치하고 WorldSpace 모드로 변경한다.
Render Texture 적용
- RawImage에 RenderTexture 적용한다.
- CCTV Camera Output에 RenderTexture 적용한다.
결과
미니맵
배치
Overlay 캔버스 위에 RawImage 배치
이미지와 Orthographic 카메라에 텍스쳐 적용
위치 표시
캐릭터와 TV, 코인 위에 구체를 띄워놓음
후에 레이어 처리를 통해 게임뷰 상에서는 보이지 않게 한다.
결과
로또 실습
셔플
Fisher-Yates Shuffle 알고리즘을 사용한다.
Swap
두 수의 위치 바꾸기
public int[] intArray = new int[10];
void OnEnable()
{
int ranInt1 = Random.Range(0, intArray.Length);
int ranInt2 = Random.Range(0, intArray.Length);
var temp = intArray[ranInt1];
intArray[ranInt1] = intArray[ranInt2];
intArray[ranInt2] = temp;
}
Shuffle
swap을 아주 많이 반복하면 섞인다.
public int shakeCount = 1000;
for (int i = 0; i < shakeCount; i++)
{
int ranInt1 = Random.Range(0, intArray.Length);
int ranInt2 = Random.Range(0, intArray.Length);
var temp = intArray[ranInt1];
intArray[ranInt1] = intArray[ranInt2];
intArray[ranInt2] = temp;
}
로또 번호 출력
void Awake()
{
for (int i = 1; i < 46; i++)
intList.Add(i);
}
IEnumerator Start()
{
for (int i = 0; i < shakeCount; i++)
{
int ranInt1 = Random.Range(0, intList.Count);
int ranInt2 = Random.Range(0, intList.Count);
var temp = intList[ranInt1];
intList[ranInt1] = intList[ranInt2];
intList[ranInt2] = temp;
yield return new WaitForSeconds(0.001f);
}
List<int> resultGroup = new List<int>();
for (int i = 0; i < 6; i++)
resultGroup.Add(intList[i]);
resultGroup.Sort(); // 뽑힌 번호 정렬
string resultNumber = $"이번주 로또 번호 : {resultGroup[0]} /{resultGroup[1]} / {resultGroup[2]} / {resultGroup[3]} / {resultGroup[4]} / {resultGroup[5]} / 보너스 넘버 : {intList[6]}";
Debug.Log(resultNumber);
}