오브젝트가 파괴되었는데 참조하려고한다.. 오류
·
Unity/2D
문제원인게임이 오버되고 재시작하여 플레이어 오브젝트를 파괴하고 재생성을 했다.이후 장애물과 부딪혔더니 플레이어의 스크립트에 충돌과 관련된 기능을 담당하는 코루틴 부분에서 오류가 발생했다.  오브젝트가 파괴되면 원래 실행중인 코루틴은 자동으로 종료가 된다.또한 PlayerHitCorutine은 실행될때마다 새롭게 할당을 하기 때문에 이해가 가지않았다.오브젝트가 파괴되었어도 새롭게 생성후 다시 코루틴 변수 할당을 해주는데 해당 오류가 뜬 원인이 무엇일까.  해결방안해당 문제의 원인을 마이크로소프트의 프로그래밍 가이드에서 알수 있었다.https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/events/how-to-subscribe-to-and-un..
유니티 버튼 누르자마자 동작하기 (EventTrigger 스크립트 연결)
·
Unity
1. 발생 문제유니티에서 UI Button은 클릭 후 마우스를 때야지만 동작하게 되어있습니다. 이는 위와 같이 버튼을 누르자마자 플레이어가 점프를 해야하는 게임에서는 치명적일 수 있습니다. 2. 해결 방안- 해결 방법은 크게 2가지가 있습니다.1. IPointerClickHandler, IPointerDownHandler, IPointerUpHandler 등의 포인터 입력을 감지하는 인터페이스를 활용한다.2. EventTrigger를 사용하여 포인터 입력에 따라 함수를 호출한다. 저는 2번 방법 EventTrriger를 사용하여 포인터 입력을 감지한 뒤 점프 함수를 호출해서 문제를 해결해 보겠습니다.  - 해결 방법은 아래와 같습니다.1. EventTrigger 컴포넌트를 선언 후 인터페이스에서 Even..
유니티 여러곳에서 참조되는 데이터 관리
·
Unity
문제점씬의 이름, 프리팹의 주소등, 여러 곳에서 참조되는 데이터들이 존재한다.작업 도중에 해당 데이터들의 이름이 수정될 경우, 참조했던 곳에서 전부 이름을 수정해줘야하는 번거로움이 생긴다. 해결방안아래 처럼, 새로운 nameSpace인 Constants를 만들어 게임내에서 여러곳에서 참조되고, 쉽게 변하지 않는 데이터들을 묶어 놓자.이렇게 해놓을 경우 도중에 씬이름이나, 동적으로 생성되야할 오브젝트들의 경로가 수정되었을 때,해당 스크립트만 수정하여 관리하면 되기 때문에 훨씬 유지보수에 유리하다.  사용 예시
Debug 최적화
·
Unity
문제점기존에 사용하는 Debug.Log의 경우 에디터에서 동작하고, 빌드된 프로그램에서도 동작한다.이는 성능 저하로 이어지기 때문에, 빌드전의 해당 Debug Log들을 주석처리 혹은 지워주는 것이 좋다. 해결방안using UnityEngine;public static class Logger{ [System.Diagnostics.Conditional("ENABLE_LOG")] public static void Log(object message_) { Debug.Log(message_); } [System.Diagnostics.Conditional("ENABLE_LOG")] public static void Log(object message, Object con..
유니티 2단점프 구현
·
Unity
Rigidbody.AddForce(Vector3, Mode)의 경우 리지드 바디에 힘을 줘서 움직이기 위한 함수다.같은 힘과 방향을 주더라도 Mode에 따라 다른 결과를 가져오는데, ForceMode2D.Impulse는 충격량을 리지드 바디의 주는 형식으로 주로 타격이나, 폭발처럼 순간적인 힘을 나타내는 데이용된다. 충격량이랑 힘의 크기와 주는 시간을 곱하는 계산이 들어간다. 2단 점프를 구현할때 핵심은 리지드 바디의 Velocity를 Zero로 초기화 해주는 작업이다.같은 힘이라도 내려오는 중에 힘을 받으면 적게 뛰고, 올라가는 중에 힘을 받으면 상대적으로 높게 뛰게 된다.따라서, 2번째 점프를 하는 시점에 Velocity를 0으로 초기화 해주는 코드를 한줄 추가하여 구현하였다.
유니티 머티리얼 Emission 활성화, 비활성화
·
Unity
Emission이 활성화 되어있는 머티리얼의 접근을 해야합니다. MeshRenderer에 있는 material에 접근해서 Keyward 매서드를 통해 Emission을 활성화 비활성화 할 수 있습니다. 위 코드는 제가 구현한 일정주기로 Light와 Emission을 활성화 비활성화 해주는 스크립트입니다. DisableKeyword("_EMISSION"); 을 통해 이미션을 비활성화 할 수 있습니다. EnableKeyword("_EMISSION"); 을 통해 이미션을 활성화 할 수 있습니다.
유니티 스크립트가 부착이 안될경우
·
Unity
유니티에서 스크립트가 부착이 안되는 경우는 스크립트의 이름과 클래스명이 다른 경우에 생기는게 보편적입니다. 하지만 유니티 자체 오류로 인해 스크립트가 부착이 안될 수 있습니다. 그럴 경우 위처럼 Reimport All을 통해 해결할 수 있습니다. 혹은 문제가 되는 스크립트만 따로 Reimport하는 것으로 해결이 될 수도 있습니다.
유니티 로딩 씬 구현
·
Unity
기능 구현의 핵심요소 SceneManager.LoadSceneAsync() 씬이 로드될때까지 동작을 못하는 SceneManager.Load와 달리 씬을 불러오는 도중에 다른 작업이 가능합니다 AsyncOperation 현재 로드 되고있는 씬의 정보를 가지고있는 클래스입니다. 코드 SceneLoad 매서드를 static으로 만들어서, 어디에서든지 접근할 수 있게 설정합니다. 이후 LoadingSceneController가 생성될때(LoadingScene에서) LoadSceneProcess 함수를 실행시켜 씬이 작동하는 것과 별개로(비동기) 다음에 로드될 씬을 준비합니다. 사용된 AsycOperation의 프로퍼티 목록 - isDone : 로딩이 완료되었는지 - progress : 로딩 진행률 0% ~ 10..