카드 뒤집기 게임을 개발하면서 CallBack함수를 사용해야하는 일이 발생했다.
CallBack함수가 사용되는 이유는, 처음에 게임을 시작했을 때 모든 카드를 보여준 다음 게임이 시작되도록 만들기 위해서이다. CallBack함수는 다른 함수를 매개변수로 받아 실행되는 함수인데, 다른 함수가 종료되기까지 기다렸다가 실행되므로 나의 목적과 딱 맞게 사용할 수 있어서 이 방식을 채택하게 되었다.
그렇게 해서 작성된 코드를 일부 발췌하면 다음과 같다.
GameManager.cs
Board.board.BoardSetting(()=>StartFlip(DifficultSetting.Instance.Getting()));
Board.cs
public void BoardSetting(Action callback)
{
int[] arr = { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10 };
arr = arr.OrderBy(x => UnityEngine.Random.Range(0f, 10f)).ToArray();
raw = 4;
cardNum = 20;
GameManager.Instance.cardNum = cardNum;
for (int i = 0; i < cardNum; i++)
{
float x = (i % raw) * 1.2f + 0.25f;
float y = (i / raw) * 1.2f + 1.2f;
GameObject go = Instantiate(card, this.transform);
go.transform.position = new Vector2(go.transform.position.x + x, go.transform.position.y + y);
cardScript = go.GetComponent<Card>();
cardScript.Setting(arr[i]);
}
callback?.Invoke();
}
원래는 BoardSetting함수는 존재하지않는 함수였고, 저 함수의 기능 그대로 Start()함수에서 동작하였다.
그러나 CallBack함수 동작을 위해서 이를 BoardSetting함수로 따로 만들었고, 이를 GameManager에서 CallBack으로 동작하게 만들었다. 그런데, 컴파일러 상으로는 아무런 문제가 발생하지 않았었는데 유니티 동작에서 자꾸만 NullReference 에러가 발생하였다.
문제를 해결하기 위해 꽤 오랜시간을 사용했는데, 문제의 원인은 Card 게임오브젝트에 붙어있는 AudioSource 컴포넌트에 의해 발생했다.
문제가 되었던 Card.cs에는 AudioSource를 GetComponet로 받아오는 코드가 Start()에 있었는데, 아마 GetComponent가 실행되기 전, SelectCard함수가 동작하면서 Card오브젝트에 붙어있던 Flip AudioClip을 Play하는 코드와 만나서 NullReference에러가 발생한 듯 싶다.
따라서 GetComponet코드를 Awake()쪽으로 옮겨서, 더 빠르게 GetComponent를 수행할 수 있도록 만들어주었다.