내일배움캠프 2일차
2일차예요.
피곤해요.
그래도 코딩하러 가봅시다.
어제는 개인씬들을 만들어서 각자 기능들을 구현했는데 어제 본인이 구현 했던 기능들에 대해서 서로 설명을 해주며 통합하는 과정을 먼저 거쳤어요.
그리고나서 통합한 씬에 기능구현을 하는 것으로 작업방식을 바꿨습니다.
다른 분들의 설명들을 들으면서 제가 그 기능을 구현한다고 했을 때 떠올렸던 방식들과는 다른 방법으로 접근하신 것들을 보고 배워가는 부분들이 많은 것 같아요.
오늘 제가 작업한 내용은 스테이지별 해당 스테이지에 맞는 카드들이 나오는 기능과 잘못된 카드를 골랐을 때 실패 이펙트가 나오는 기능을 구현했어요.
실패 이펙트 구현
우선 어제 만들었던 경고 기능과 비슷하게 애니메이션을 추가해주고 애니메이터에서 트리거를 만들어서 설정해 줬어요.
크기가 커지면서 나타나고 작아지면서 사라지는데 로테이션 값을 건드려서 좌우로 흔들리면서 나타나게 했습니다.
이 기능은 어제 했던 기능과 동일한 방식이라 간단히 설명할게요.
스크립트에서 트리거를 작동시키는 함수를 만들어 줍니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Fail : MonoBehaviour
{
private Animator anim;
private void Awake()
{
if (!TryGetComponent(out anim))
{
Debug.Log("Alert.cs - Awake() - anim 참조 실패");
}
}
public void MatchFail()
{
anim.SetTrigger("Fail");
}
}
GameManager 스크립트에서 카드를 비교하는 함수인 Matched 함수에서 카드 매칭에 실패 했을 시에 트리거를 작동시키는 함수를 호출해 줍니다.
public void Matched()
{
// 매칭 횟수가 짝을 맞출 수 있는 최대 횟수 초과할 때마다 2.5점 감소
getScore -= _matchCount / (float)MaxTimes * 2.5f;
if (getScore < 0.0f)
{
getScore = 0.0f;
}
if (firstCard.idx == secondCard.idx)
{
MatchTimeOver();
_audioSource.PlayOneShot(clip);
firstCard.DestroyCard();
secondCard.DestroyCard();
GetScore();
cardCount -= 2;
if (cardCount == 0)
{
GameOver();
}
}
// 카드 매칭 실패 시
else
{
MatchTimeOver();
_audioSource.PlayOneShot(unMatch);
Instantiate(hudTimeDecreaseTxt,
GameObject.FindGameObjectWithTag("Canvas").transform); // 시간 감소 효과 텍스트 생성
// 제한시간 2초 감소
if (time >= 2.0f)
{
time -= 2.0f;
}
else
{
time = 0.0f;
}
_fail.MatchFail();
firstCard.CloseCard();
secondCard.CloseCard();
}
_matchCount++;
firstCard = null;
secondCard = null;
}
실행을 해보면
다른 카드를 골랐을 경우에 카드 상단에 FAIL 이미지가 나오는게 잘 보이네요.
스테이지별 해당 스테이지에 맞는 카드 배치하기
저희 조는 팀원 별로 스테이지를 만들어서 본인을 나타낼 수 있는 카드들을 집어넣기로 했어요.
이렇게 되면 한 개의 씬에서만 정해진 카드를 배치하던 기존의 방식을 각 씬에 따라 다른 카드들을 배치할 수 있도록 스크립트를 변경해줘야 해요.
public void Setting(int number)
{
idx = number;
frontImage.sprite = Resources.Load<Sprite>($"rtan{idx}");
}

배열의 인덱스 값을 준비한 이미지 이름과 맞춰서 값에 따라 스프라이트가 들어가도록 된 기존 코드를 보면서 어떻게 변경을 해야 할지 고민하다가 씬별로 고유넘버를 부여한 뒤 이미지 이름을
(인덱스 값 + 씬 고유넘버)의 값으로 맞춰서 설정하면 씬 별로 다른 사진이 들어가지 않을까 해서 한 번 시도해보기로 했습니다.
private void Awake()
{
if (SceneManager.GetActiveScene().name == "SeungHyeonScene") _stageNumber = 0;
else if (SceneManager.GetActiveScene().name == "ChihoonScene") _stageNumber = 10;
else if (SceneManager.GetActiveScene().name == "MoojinScene") _stageNumber = 20;
else if (SceneManager.GetActiveScene().name == "NakwonScene") _stageNumber = 30;
else if (SceneManager.GetActiveScene().name == "TaeilScene") _stageNumber = 40;
}
먼저 현재 활성화 된 씬에 씬 고유넘버를 부여해 줬어요.
GetActiveScene은 현재 활성화 된 씬의 정보를 확인하기 위한 함수에요.
public void Setting(int number)
{
idx = number;
frontImage.sprite = Resources.Load<Sprite>($"rtan{idx + _stageNumber}");
}

그런 다음 스프라이트가 (인덱스 값 + 씬 고유넘버)로 들어가도록 이름과 코드를 맞춰주고
실행을 해봤더니!

씬별로 다른 그림이 나오는 것에 성공했습니다!
생각했던게 바로 성공해서 기분이 좋습니다.
마무리
오늘도 이렇게 2가지 기능을 구현하면서 마무리 했습니다.
내일은 같은 그림을 맞췄을 때 그림에 대한 주제가 화면에 텍스트로 나오도록 하는 작업과 제한시간이 얼마 남지 않았을때 BGM이 변경되는 작업을 진행할 예정이에요.
내일도 화이팅 하겠습니닷!