밤새워 고민하던 2장 이상의 카드가 클릭되면 카드가 뒤집어지지 않게 하는 코드!!!!!!
아침 일찍부터 팀원들과 상의를 해봐도 해결되지 않아,
튜터님을 찾아갔따!!!
기존의 Card Script에 없던 if문에 return값 반환은 생각해 보지 않은 것은 아니었다.
게임 플레이를 하며, 게임매니저 인스펙터를 계속 보다 보니,
Second Card에 눈으로 식별하기 어려울 정도로 Null값 만 보였다.
그래서 그런지 아래의 If문이 제대로 동작되는지 판별하기 어려웠다.
Card Script
DestroyCard - DestroyInvokeCard
CloseCard- CloseInvokeCard
Invoke 함수가 들어가면 게임매니저 스크립트에는 즉시 null값 반환인데,
카드는 아직 삭제되는 동작과 다시 Flip 되는 동작이 0.5f초 지연상태,
null이 되는 시간도 동일하게 지연시켜 맞춰주는 게 중요함.
public void OpenCard() //OnClick
{
if (GameManager.Instance.firstCard != null && GameManager.Instance.secondCard != null)
{
return;
}
audioSource.PlayOneShot(clip);
anim.SetBool("isOpen", true);
front.SetActive(true);
back.SetActive(false);
if (GameManager.Instance.firstCard == null)
{
GameManager.Instance.firstCard = this;
}
else if (GameManager.Instance.secondCard == null)
{
GameManager.Instance.secondCard = this;
GameManager.Instance.Matched();
}
}
public void DestroyCard()
{
Destroy(gameObject);
}
public void CloseCard()
{
anim.SetBool("isOpen", false);
front.SetActive(false);
back.SetActive(true);
}
GameManager Script
기존에 else 아래쪽 firstCard = null; secondCard = null; 으로 작성되었던 것을
아래에 InvokeCardDestroy();와 InvokeCardClose();에 함께 넣어준다.
각각 상황에 맞게 Invoke("InvokeCardDestroy", 0.5f); , Invoke("InvokeCardClose", 0.5f);넣어준다
public void Matched()
{
if (firstCard.idx == secondCard.idx)
{
Correct_Card();
audioSource.PlayOneShot(clip);
Invoke("InvokeCardDestroy", 0.5f);
cardCount -= 2;
if (cardCount == 0)
{
win.gameObject.SetActive(true);
RequesteBack.gameObject.SetActive(false);//카드를 맞춰주세요 끄기
Time.timeScale = 0f;
}
}
else
{
Wrong_Card();
Invoke("InvokeCardClose", 0.5f);
}
}
public void InvokeCardDestroy() //카드 삭제후, null값으로 변경
{
firstCard.DestroyCard();
secondCard.DestroyCard();
firstCard = null;
secondCard = null;
}
public void InvokeCardClose() //카드 다시 뒤집기 후, null값으로 변경
{
firstCard.CloseCard();
secondCard.CloseCard();
firstCard = null;
secondCard = null;
}
Error_ex) Audio Manager Script BackGroundMusic이 게임 Play모드가 되면
게임 PlayMusic으로 변경해야 하는데, 변경이 안됨!
해결 : 아래의 코드로 senceName을 int형으로 가져와 사용
추가 : Start에서는 한번 실행되고 끝나는데 Secne 변경이랑 무관하게 한 번만 실행됨
씬을 변경해도 안됨 > 파괴하고 다시 만들어야 함
현재 씬 인덱스를 인하는 buildIndex 코드와 BGM코드를 동시에 구현 했는데
안되었던 이유는 BGM을 변경하는 코드는 bulildIndex를 가져오는 속도가 빠르다.
BGM은 인덱스를 가져와서 씬변경이 돼야 하는데, 씬변경은 속도가 느려서 인덱스를 못 가져옴.
인덱스를 int SceneName 을 삽입해야하는 함수를 만들어줌.
Audio Manager Script
public void ChangeBGM(int SceneName)
{
audioSource = GetComponent<AudioSource>();
int sceneIndex = SceneManager.GetActiveScene().buildIndex;
Debug.Log(sceneIndex);
if (SceneName == 0)
{
audioSource.clip = this.BackGorundMusic;
Debug.Log("if");
}
else
{
audioSource.clip = this.GamePlaySound;
Debug.Log("else");
}
audioSource.Stop();
audioSource.Play();
}
void Start()
{
ChangeBGM(0);
}
ReTry Script
public void ReMain()
{
SceneManager.LoadScene(0);
AudioManager.Instance.ChangeBGM(0);
}
public void ReEasy()
{
SceneManager.LoadScene(3);
AudioManager.Instance.ChangeBGM(3);
}
'Unity 내배캠 TIL' 카테고리의 다른 글
C# 기초 문법 - 변수, 자료형, 연산자(2주차 1일) (0) | 2024.09.23 |
---|---|
카드 뒤집기 게임 - 팀 프로젝트 협업하기(1주차 5일) (0) | 2024.09.15 |
카드 뒤집기 게임 - 팀 프로젝트 협업하기(1주차 3일) (0) | 2024.09.11 |
카드 뒤집기 게임 - 팀 프로젝트 협업하기(1주차 2일) (2) | 2024.09.10 |
깃허브_데스크탑 - 팀 프로젝트 협업하기 (1주차 1일) (0) | 2024.09.10 |