위 개념대로 어떠한 배열에 랜덤한 요소들이 정렬되게끔 하기위해서
int[] rtans = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7 };
rtans.OrderBy(item => Random.Range(-1.0f, 1.0f)).ToArray();
public void destroyCard()
{
Invoke("destroyCardInvoke", 1.0f);
}
void destroyCardInvoke()
{
Destroy(gameObject);
}
public void isMached()
{
string firstCardName = firstCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
string secondCardName = SecondCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
if (firstCardName == secondCardName)
{
firstCard.GetComponent<card>().destroyCard();
SecondCard.GetComponent<card>().destroyCard();
int leftCards = GameObject.Find("cards").transform.childCount;
if (leftCards == 2)
{
endTxt.SetActive(true);
Time.timeScale = 0.0f;
}
}
else
{
firstCard.GetComponent<card>().closeCard();
SecondCard.GetComponent<card>().closeCard();
}
firstCard = null;
SecondCard = null;
}
위의 코드 leftCards에서 == 0이라고하면 컴퓨터가 계산하는 시간이 destroy에서 1초후 파괴시키는 시간 보다 더 빠르므로 해당 조건문에 걸리지 않게됨
IEnumerator 함수이름()
{
yield return // + 조건
// 함수 내용
}
컴파일 측면에서 Invoke는 런타임, 코루틴은 컴파일시 -> 만약 오류가 발생하는 코드에서
코루틴은 컴파일단계에서 해당 오류를 잡아주지만(타입 안정성) Invoke는 컴파일에서 잡아주지 않기에
데이터 손실, 디버깅 어려움, 애플리케이션 중단의 위험이 있다.
메모리 측면에서는 코루틴은 로컬변수, 상태 정보 및 스택 프레임을 관리 해당 정보를 코루틴이 실행중일때 사용 대기상태일때는 매우 낮은 메모리를 사용하여 해당 스택을 보존 (컴파일단계에서 최적화가 일어남)
Invoke는 메서드 호출과 지연 시간에 대한 정보를 추적하고 필요한 메모리를 할당
해당 메모리는 개발자가 직접 관리 불가(Unity에서 관리) 또한 Invoke는 리플렉션을 활용하기에
런타임시에 문자열을 통해 찾아내기때문에 성능적으로 코루틴보다 불리함
좋은 정보 감사합니다!