유니티 22

이벤트 사용에 있어 주의 점

이벤트는 매우 편리하다 이벤트 발생 시에 구독되어있는 함수들을 한 번에 수행할 수 있기 때문이다. 하지만 동시에 주의해야할 점들이 있다. 먼저 Monobehaviour를 상속받아 오브젝트에 부착될 스크립트일 경우  구독해제에 대해 신경을 써줘야한다. 구독해제를 안한 것이 어떨 때 문제가 되냐면 오브젝트가 구독해제를 안한 상태로 파괴가 됐는데 이벤트 호출을 하면 Null 오류가 뜨게 된다.  또 하나 알아둬야할 것은 람다식의 경우 이벤트 구독 해제가 안된다.  이벤트로 람다식을 구독시키는 것은 매우 편리한 것을 알지만 구독해제가 안되니 되도록 사용하지 않거나 굳이 써야한다면 Monobehaviour를 상속받지 않는 클래스에서 사용하는 것이 좋아보인다. 이번 프로젝트에선 전역으로 사용할 수 있는 이벤트 매니..

유니티 2024.08.19

토글 그룹이 이상하게 작동해요!?

토글 그룹의 경우 보통 여러 옵션중 하나만 선택 가능하도록 하고자 많이 사용되는데 내가 마주한 문제 상황은 다음과 같다.  그래픽 옵션서 상 중 하 의 토글 중 하나만 선택가능한데 확인 버튼을 누르면 선택한 그래픽 옵션이 적용되고 취소 버튼을 누르면 어떤 토글을 골랐던 선택 이전, 즉 기존의 토글이 유지되도록 하고자하는데 문제는 종종 취소 버튼을 눌러도 기존의 토글이 유지가 안되는 문제였다. 예를 들어 기존 옵션이 High 일 때 Medium을 체크하고 취소를 눌러도 High가 유지되어야하는데 다시 설정창을 키면 Medium으로 나오는 것이다. 이 문제에 있어 핵심은 "오브젝트가 비활성화 되어있으면 토글 그룹은 정상적으로 작동하지 않는다" 는 사실이다. 해당 설정 화면은 유저가 설정 버튼을 눌러야만 나오..

유니티 2024.08.16

Action과 UnityAction의 차이

유니티에서 굳이 Action이 있는데 UnityAction을 써야하나라는 고민이 든 적이 있다. 왜냐면 Action 사용에 있어 문제를 못느꼈고 차이점에 대해 알지 못했기 때문이다.하지만 문제 상황을 겪고야 말았다. 바로 아래와 같은 문제이다.버튼에 AddListener를 통해 이벤트를 추가해주는 함수인 AddOnClickEvent를 만들었는데Action으로 이벤트를 받으니 빨간줄이 뜨면서 오류가 난다. AddListener 함수를 들여다보면 유니티 액션을 매개변수로 받고 있음을 알 수 있음 고로 UnityAction으로 수정하면 사용이 가능하다. AddListener와 같이 이벤트로 Action을 받지 못하는 함수의 경우 UnityAction을 쓰게 된다.

유니티 2024.07.28

유니티 - 블록 단위 이동 단축키

만일 어떤 함수내에 for문이 엄청나게 길다고 해보자 만일 for문 블록 맨 끝으로 이동을 하고자 하면 스크롤 하기 번거로울 수가 있다.그럴 때   for문 블록의 시작 지점에 커서를 위치시키고  단축키 Win : Ctrl + Shift + \Mac : CMD + Shift + \ 를 누르면  끝지점으로 이동한다. 반대로 끝지점서 해당 단축키를 누르면 블록의 시작부분으로 이동한다. 매우 유용하니 잘 숙지해두자 블록 단위 이동 Win : Ctrl + Shift + \Mac : CMD + Shift + \

유니티 2024.07.23

유니티 - Simulator와 아이폰 노치에 UI 대응해보기

UI 제작 연습을 위해 게임 명일방주를 역기획해서 UI를 만들어보았다. 다만 게임씬에서 보이는 게임 화면은 PC 기준으로 보여주고 있는 것이다. 물론 모바일 비율로 바꿀 수도 있지만 실제 기기에서는 어찌 적용될지 궁금함이 생긴다. 이럴 때 사용할 수 있는 것이 Simulator이다. Simulator 사용 게임씬에서 Game 대신 Simulator를 선택해주면 된다.  Simulator로 바꾸면 여러가지 기기들이 보인다.  실제 기기에서 어떤 식으로 보여지는지 알 게 된다. 아이폰의 경우 다이내믹 아일랜드나 노치로 인해 화면을 일부 영역을 가리고 갤럭시의 경우 펀치홀이 화면을 아이폰보다는 훨씬 덜하지만 화면을 조금이지만 가린다. 아이폰 12의 경우엔 노치가 상당히 큰 편인데 아이폰 12로 설정해보고 확인..

유니티 2024.07.11

유니티 - Destroy 함수 문제

Destroy 함수 설명을 보면 GameObject, component or asset으로 되어있다. 이 말은 즉슨 게임오브젝트만 Destroy를 한다는 것이 아니라 컴포넌트나 에셋까지 파괴가 가능하다는 것이다. 만일 ui 변수가 UIBase 클래스의 객체라하자  Destroy(ui); 단순이렇게 한다면 UIBase 컴포넌트를 파괴한다는 것이다. 그래서 인스팩터창에 들어가보면 UIBase 컴포넌트가 사라져있는 것을 알 수 있다. 그렇기 때문에 게임오브젝트를 파괴하는 것이 목적이였다면 Destroy(ui.gameObject); ui.gameObject 를 파괴를 해야하는 것이다.

카테고리 없음 2024.07.10

유니티 - 코루틴의 WaitForSeconds을 효율적으로

yield return new WaitForSeconds(0.2f);  이런 식으로 코루틴에서 사용하게 된다면 "new" 키워드를 쓰기에 매번 새로운 WaitForSeconds를 생성하는 것이다. 고로 필드에 선언을 해주는 것이다.private WaitForSeconds myWait = new WaitForSeconds(0.2f);IEnumerator MyCoroutine(){ yield return myWait; Debug.Log("기다렸다 코루틴");} 이런식으로 필드에 객체를 만들어 놓고 쓰면 매번 새롭게 WaitForSeconds 생성되는 것을 방지할 수 있다.

유니티 2024.07.01

유니티 - Queue의 NullReferenceException

지옥 같은 NullReferenceException 이다. 이전에도 이것 때문에 글을 작성했는데 다시 작성을 하게 됐다. 만일 리스트와 큐를 선언한다하자 public으로 선언하면 알다시피  인스팩터 창에서 넣어줄 수가 있어 별도의 초기화를 하지 않아도 된다. 이렇게  인스팩터창에서 리스트에 값을 넣어주고 아래와 같이 리스트의 값들을 큐에 넣어주는 작업을 해보자 void Start(){ for(int i = 0; i ()); }} 리스트는 GameObject라 Card 컴포넌트를 가져와 Card 타입의 큐에 넣어주고 있는 모습이다.이렇게 하면 리스트에 있는 Card 데이터를 다 큐에 담아준 것으로 보인다. 하지만 이렇게 하면 NullReferenceException를 마주하게 된다... 대체 뭘..

유니티 2024.06.23