[Unity Editor Scripting] EditorStyles null Reference
EditorStyles null Reference문제점Editor를 상속받은 클래스의 OnEnable에서 GUIStyle을 사용하려면 NullReference가 발생한다. 무조건은 아니지만, 다시 리로드되는 타이밍에는 직렬화 되지 않은 데이터는 초기화되므로 무조건 다시 NullReference가 발생하는 것 같다.private void OnEnable(){ Init(); //SOManagers.instance.hexGridGenerator = new HexGridGenerator(_hCGeneration.HexPrefab);}private void Init(){ _mainHeaderStyle = new GUIStyle(EditorStyles.boldLabel) { fon..
2024.12.06
no image
[Unity] 유니티의 직렬화(serialization)와 재귀 문제 회피
스크립트 직렬화직렬화는 자료 구조(data structure) 또는 게임 오브젝트의 상태를 유니티가 저장할 수 있고 추후 Reconstruct 할 수 있는 포맷으로 자동 변환하는 프로세스이다. 유니티 프로젝트에서 데이터를 구성하는 방식은 데이터를 직렬화 하는 방식에 영향을 미치며, 이는 프로젝트 성능에 큰 영향을 미칠 수 있다. 직렬화 규칙Unity의 Serializer는 런타임에 효율적으로 동작하도록 디자인되었다. 이는 유니티의 직렬화가 다른 프로그래밍 환경의 직렬화와 다르게 동작하기 때문이다. Unity의 직렬화는 프로퍼티가 아닌 C# 클래스의 필드에서 직접 동작하기에 유니티는 특정 조건을 충족할 때만 직렬화를 수행한다. 필드 직렬화를 하는 방법public으로 선언 또는 SerializeField a..
2024.11.09
[Unity] Renderer.materials, Renderer.sharedMaterials
Renderer.SharedMaterial인스펙터에서 보는 매터리얼은 Renderer의 SharedMaterial에 저장되어 있다고 함. sharedMaterial을 수정하면 해당 매터리얼을 사용하는 모든 오브젝트의 모양이 변경되고, 프로젝트에 저장된 매터리얼 설정도 변경된다. sharedMaterial이 반환한 material은 수정하지 않는 것이 좋다. renderer의 material을 수정하려면 그냥 Renderer.material 를 사용하는 것을 추천한다. Unity에서는 Render.material에 접근하는 순간 sharedMaterial의 사본을 만들게 된다. 따라서 sharedMaterial과 독자적으로 동작하는 material의 인스턴스가 생성되고 이는 기존 매터리얼이 아닌 별도의 매..
2024.11.08
no image
[Unity Editor Scripting] Editor관련 함수 정리
EditorWindowScriptableObject를 상속받아 구현된 클래스이며 UnityEditor의 네임스페이스에 속한다. 이 클래스를 사용하여 유니티 에디터의 기본 창과 유사하게 독립적으로 띄울 수있거나 탭에 부착 가능한 Editor window를 만들 수 있다.  다음 다이어그램은 에디터 윈도우의 실행 순서이다.OnEnable: 스크립트가 로드되거나 오브젝트가 활성화될 때 호출된다.EditorApplication.isUpdating: true라면, 에디터는 현재 AssetDatabase를 새로고침 중이다.CreateGUI: 에디터가 업데이트 중이 아니라면 GUI를 생성한다.Update: 프레임당 한 번 호되어 스크립트의 로직을 업데이트 한다.OnGUI: GUI 이벤트를 렌더링하고 핸들링하기 위해 ..
2024.10.25
[Unity] TransformDirection()
TransformDirection()Transform.TransformDirection은 local space의 `direction`을 world space의 direction으로 변환한다. 해당 연산은 scale이나 position에 영향을 받지는 않는다. 반환된 벡터의 길이는 `direction`과 같다.  그러나 해당 공식 문서의 설명만으로는 헷갈리는 감이 있어, 아래에 첨부한 참고자료를 살펴보고, 직접 사용해보며 내린 결론을 정리해서 다음과 같이 부연 설명을 덧붙인다. `TransformDirection()`함수를 사용할 때는 인자로 넘겨준 direction을 로컬 좌표계로 취급하는데, 이는 TransformDirection()을 호출한 gameobject의 로컬 좌표계를 기준으로 잡는다.Vect..
2024.10.09
[유니티 미세 팁] 연산 순서
연산 순서transform.Translate(Vector3.forward * Time.deltaTime * _speed);유니티에서 코드를 작성하다보면, 위의 코드처럼 이동을 작성할 때가 있다. 그러나 이 방식은, 요소값을 3개 가진 Vector3에 대해 deltatTime곱셈을 시도하고, 추가적으로 Speed 상수를 또 연산해놓은 3개의 값에 곱셈을 하기에 총 6번의 연산이 이루어진다. 그러나 deltaTime과 speed를 먼저 계산한다면, 총 4번의 연산 횟수만에 값이 구해진다. 사실 큰 최적화는 아니지만, Rider 사용 시 에러가 신경쓰여 알아보았다.  참고자료https://stackoverflow.com/questions/57933831/unity-rider-order-of-multiplica..
2024.09.04
no image
[Unity, Git] Git으로 유니티 프로젝트를 관리하는 방법
대용량 파일이 있는 유니티 프로젝트를 어떻게 버전 컨트롤로 관리하나https://www.reddit.com/r/Unity3D/comments/19a6o8i/how_to_version_control_large_projects_with_big/ 해당 글에 따르면, Git LFS 사용 또는 PlasticSCM 사용을 권장하는 사람이 많이 보인다. Git을 사용한다면 게임 리포지토리는 정말 커질 수 있기에 꼭 필요한 것만 저장소에 보관하는 것이 좋다고 한다. 예를 들어 에셋 팩에서 에셋을 가져올 때는 프로젝트에 실제로 필요한 것만 가져와야 한다. LFS를 사용할 예정이라면, 모든 바이너리 파일 형식(이미지, 모델, 바이너리, 오디오 등)을 캡처할 수 있도록 LFS 속성을 제대로 설정하는 것이 중요하다.  그럼 ..
2024.08.29
[Unity, Git] .log 파일에 대한 gitignore
.log 파일은 gitignore에 등록하여도 되는가?github의 gitignore를 참조하면 일반적으론 .log 파일은 등록하는 것 같다. 그러나 해당 글의 kurt-Dekker 분의 답변에 따르면 .log 파일은 버전 컨트롤에 등록하지 않는다고 한다. 로그에 흥미로운 데이터가 있을 수 있지만, 본인은 실제로 포렌식 버그 추적에 도움이 되었던 적은 거 없었던 것 같다.  .log 파일 제외하기프로젝트 처음 시작 시 gitignore를 적용한다면, 바로 .log 파일을 제외하도록 만들면 되지만, git은 과거에 추적된 파일은 무시하지 않기 때문에 gitignore에 .log가 처음부터 적용되어 있지 않았다면 해당 방법을 사용하여 git의 캐쉬를 정리한 뒤 다시 gitignore를 적용하면 된다.  참고..
2024.08.18
[Unity, Git] 유니티 깃 커밋시 "Unlink of file'Logs/AssetImportWorker0.log' failed." 발생
"Unlink of file'Logs/AssetImportWorker0.log' failed." 발생유니티 엔진이 켜져있을 때 커밋을 하려하면, Unity에서 EditorLog가 자동으로 실행중이므로 "Unlink offile'Logs/AssetImportWorker0.log' failed." 해당 에러를 볼 수 있으니, 커밋을 하고자 하면 프로젝트 종료 후 커밋을 진행하도록 하자.
2024.08.18
no image
[Unity] 3D Project에서 2D Scene 생성
3D Project에서 2D Scene 생성Edit → Project Settings → Editor 탭으로 이동 → Default Behaviour Mode 설정을 2D로 변경 Basic 2D (Built-in)을 선택하여 2D Scene 생성 (또는 Project 탭에서 우클릭을 통해 Scene 생성을 하면 자동으로 2D Scene이 생성된다)      참고자료- 티스토리 블로그
2024.08.14
no image
[Unity] Time 클래스의 프로퍼티들
Time.time Time.time은 프로젝트 재생이 시작된 이후의 시간을 반환한다. Time.deltaTime delta는 값의 차이를 뜻하는데, 현재 프레임의 시작시간과 이전 프레임의 시작시간과의 차이이다. 이는 지난 프레임이 완료되는 데까지 걸린 시간 차이를 의미하는 것과 동일한 의미이다. 즉, 한 프레임을 진행하는데 걸린 시간을 뜻한다. ※ FixedUpdate에서 Time.deltaTime이 호출되면, Time.fixedDeltaTime을 반환하게 된다. 30 프레임, 60 프레임에서의 deltaTime 보통 30프레임 기준에서는 Time.deltaTIme이 0.033초 정도가 나오고, 60프레임 기준의 게임에서는 0.016초정도가 나온다. 이동관련 코드에서 deltaTime을 사용하지 않을 경..
2022.01.28
no image
[Unity] 인스펙터에 요소들 카테고리로 묶어서 표출하기
코드 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class InspectorFieldTest : MonoBehaviour { [System.Serializable] public class InspectorComponent { public Button createButton; public Image backgroundImage; } public InspectorComponent inspectorComponent; } 결과이미지 위 처럼 코드를 짰을 때, 관련있는 요소들끼리 묶어서 인스펙터에 보여줄 수 있도록 만들 수 있다.
2021.11.14