내가 발견하지도, 해결하지도 않은 문제이지만 그래도 팀원분의 코드에 감명을 받아서 적어보았다.
카드 두 장을 비교하여 두 카드가 틀릴 경우, 카드가 다시 뒤집어지는 동안 다른 카드를 광클하면 그 카드가 한번에 첫 번째와 두 번째 카드에 입력되어 같은 카드 판정으로 인해 사라져버리는 문제였다.
내가 확인해본 바로는 카드를 뒤집을 때 애니메이션을 적용하기 위해 Invoke를 사용했는데, 이 Invoke가 되는 시간동안 광클을 하면 문제가 발생했다.
Invoke를 없애면 될 문제였지만 애니메이션을 위해서는 필요했기 때문에 고민을 하던 찰나, 팀원분이 코드를 수정하셨다.
public void openCard() { // 카드가 2장 뒤집혀 있는 동안 다른 카드들 클릭 막기 if (GameManager.I.cardCounter > 1) return; if (GameManager.I.firstCard == null) { openEffect(); GameManager.I.firstCard = gameObject; // 첫 번째 카드가 뒤집힌 시간 저장하기 check_time = GameManager.I.gameTime; } else { // 첫번째카드오브젝트가 다를때만 if(GameManager.I.firstCard != gameObject) { openEffect(); GameManager.I.secondCard = gameObject; GameManager.I.isMatched(); } } }
바로 if(GameManager.I.firstCard != gameObejct)
의 조건식을 넣은 것이다.
gameObject는 현재 선택되어 C# Script를 호출한 gameObject를 가리킨다.
즉, if문의 조건을 풀어쓰면 "현재 선택된 gameObject가 firstCard의 Object와 같지 않을 때에 secondCard가 선택되는 것이고, gameObject와 firstCard가 같은 카드일 경우에는 if문에 들어가지 않는 것이다.
어떤 gameObject가 C# Script를 호출하면, 해당 Object는 그 C# Script에서 gameObject를 통해 부를 수 있다.
gameManager와 마찬가지로 audioManager 또한 싱글톤시켜서 사용할 수 있다.
오늘 사용했던 경우는, 게임에서 일시정지 버튼을 누르면 게임의 BGM 또한 일시정지 되도록 만들 때 사용했다.
// audioManager.cs public static audioManager I; public AudioClip bgmusic; public AudioSource audioSource; private void Awake() { I = this; } void Start() { audioSource.Clip = bgmusic; audioSource.Play(); } ...
이렇게 audioManager를 싱글톤시키면 외부에서 audioManager.I.audioSource를 통해 외부에서도 호출할 수 있다.
public class stopGame : MonoBehaviour { //stopPanel 호출 public GameObject stopPanel; // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } public void stopgame() { audioManager.I.audioSource.Pause(); stopPanel.SetActive(true); Time.timeScale = 0; } }
평소 화면 ▼
일시정지 화면 ▼
일시 정지 화면 Object에 하위 Object로 UI → Panel을 추가하고 색을 (0, 0, 0, 100)으로 주었다.
일시 정지를 할 때, stopPanel과 함께 호출되기 때문에 뒷배경을 어둡게 만들 수 있었다.