[Unity] SOManagementWindow 제작 일기 Part.3
·
Unity
저번에 만들었던 기능에서 SO에 직접 넣어서 Type을 찾는 것이 불편해서 Assembly를 활용하여 Load하는 방식을 채택하였다.Assembly는 내부적으로 Dictionary로 구현되어 있어 Load가 굉장히 빠른 편이다. 때문에 Assembly를 선택하였다.그리고 이렇게 하면 ScriptableObject를 상속받는 Script가 생길 때마다. 자동으로 업로드를 해준다. 변경된 코드는 거의 없고 추가된 Script가 있다. AssemblyLoadSystem전체 코드using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Reflection;using UnityEditor;u..
[Unity] SOManagementWindow 제작 일기 Part.2
·
Unity
지난번에 발생했던 문제들을 해결하는 방법입니다.저는 이 문제를 해결하기 위해서 VisualElement로 Tab을 구현하고 ScrollView 안쪽에 넣어서 관리 했습니다. 때문에 다음과 같은 함수들이 새로 추가 되었습니다. TabVisualMake/// /// Tab의 Visual를 만드어주는 함수/// /// /// private VisualElement TabVisualMake(string name){ VisualElement tabVisual = new VisualElement(); tabVisual.AddToClassList(_tabClassName); tabVisual.name = name; tabVisual.tooltip = GUID.Generate().ToString..
[Unity] SOManagementWindow 제작 일기 Part.1
·
Unity
SO를 가져와서 정리해주는 EditorWindow를 만들어 봤습니다. 기능 소개그림을 보기 전에 글로 간단하게 소개하자면 TypeTable에 중복 되는 SO가 아닌 것을 하나씩 넣어주고 Path를 지정해준 뒤 Window를 열면 하나씩 넣어준 SO들이 전부 가져와서 정리되어 있는 것을 볼 수 있다. 그리고 그 가져온 SO들을 지워주거나 이름을 바꾸거나 값들을 수정할 수 있고 지정해준 Path로 생성을 할 수 도 있다.구현부구현 같은 경우에는 중요한 함수들을 하나씩 설명해드리겠습니다. SOTypeTable먼저 Scriptable Object 들의 Type들을 담아 주는 Table SO를 구현하였습니다.왜냐하면 Type들을 컨테이너로 담아 관리 하는 것이 편하다고 판단했기 때문입니다.using System;..
[Unity]두개의 EditorWindw 창을 Split, Dock하기
·
Unity
오늘 신기한 시도를 해봤다, 이 InspectorWindow를이런 식으로 side by side 형태으로 만들고 싶었다. 일단 타입을 가지고 오는 것은 성공했고 생각보다 쉽다. public static System.Type inspectorType = System.Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll");리플렉션을 사용해서 dll 파일에서 Type을 뜯어올 수 있다. 결론을 말하겠다 실패했다.Docking은 가능하지만 위 창 처럼 분리를 하는 것은 불가능하다(임의로 Position을 옮겨서 따라하는 것은 가능함) 내부적으로 Split하는 부분이 어딨는지 모르겠고 그에 관한 문서도 존재하지 않는다.Docking두개의 Window를 Docki..
[졸업작품, Unity] 아이작 방 생성 알고리즘 구현
·
Unity
https://www.boristhebrave.com/2020/09/12/dungeon-generation-in-binding-of-isaac/ Dungeon Generation in Binding of IsaacThe Binding of Isaac, and its remake, Binding Of Isaac: Rebirth are one of my favourite games of all time. It’s a roguelite twin stick shooter, much like Enter the Gungeon. The dungeons it ge…www.boristhebrave.com먼저 이 문서을 참고하여 제작하였음을 알립니다.  알고리즘 소개아이작의 방 생성 알고리즘을 간단하게 설명하자면 다음과 ..
[Unity]UniTask란?
·
Unity
https://github.com/Cysharp/UniTask GitHub - Cysharp/UniTask: Provides an efficient allocation free async/await integration for Unity.Provides an efficient allocation free async/await integration for Unity. - Cysharp/UniTaskgithub.comUniTask는 Async, Await를 활용한 라이브러리 중 하나이다. 비동기 작업 메서드, Task가 존재함에도 불구하고 유니테스크를 사용하는 이유는 유니테스크가 싱글 스레드를 사용하는 유니티 환경에서의 Task가 가지는 단점을 보완하여 강력한 비동기 작업을 구현할 수 있도록 제작한 라이브러..
[Unity] 2D 환경에서 점프 구현 (y축 이동이 구현되어 있을 때)
·
Unity
오늘은 점프를 구현해봤다. 평범한 2D 사이드 뷰 환경에서 점프를 하는 것은 문제가 없지만 Y축이 구현 되어 있을 때에는 문제가 된다. 왜냐하면 점프도 Y축 이동인데 이동을 Y축으로 할 수 있으니 RigidBody를 사용하는 것의 중력을 활용하는 것은 불가능 하다(방법이 있긴함) 따라서 구현 방식을 좀 다르게 접근 할 필요가 있다. 로직 이런 식으로 실제 이동하는 플레이어는 그대로 바닥에 있는 대신 Visual 부분만(body Collider도 같이) 띄워서 점프 한 것 처럼 구현 하면 된다. 만약 카메라가 문제라면 카메라의 Follow위치를 Visual이나 Visual의 자식으로 해주면 된다. 구현 방법생각보다 간단하다. 원래는 코루틴을 써서 하려고 했는데 중간에 Easing 함수를 넣어야 할 것 같아..
[졸업작품, Unity] ItemSystem 구조 수정
·
Unity
지난번에 만들었던 ItemSystem의 UseItem 부분이 마음에 안들어서 구조를 수정해보았다. 로직 변경 사항 현의 로직은 이러하다.이게 전 로직전은 너무 더럽고 가독성이 없었는데 지금 좀 Interface로 분리해서 깔끔하게 만들었다.Interface를 분리 용도도 있지만 Assemly definition 때문에 교차 참조가 일어나기 때문에 사용한 것도 있다. 그래서 Utils 라는 admf를 만들어서 서로 참조하지 않도록 하였다. 코드 부분 변경 사항using LJS.Item.Effect;using Sirenix.OdinInspector;using System;using System.Collections.Generic;using LJS.Utils;using UnityEngine;namespace ..
[졸업작품, Unity]Assembly definition를 사용하는 방법
·
Unity
유니티를 하면 한번쯤 접해본 Assembly definition을 이번 프로젝트를 하면서 사용하게 되어서 다루어 볼려고 한다.자세한 내용은 공식 문서를 참고하자!https://docs.unity3d.com/kr/2019.4/Manual/ScriptCompilationAssemblyDefinitionFiles.html 어셈블리 정의 - Unity 매뉴얼프로젝트의 스크립트를 어셈블리에 정리하기 위해 어셈블리 정의를 만들 수 있습니다. 폴더에 어셈블리 정의 에셋을 만들면 Unity는 폴더의 모든 스크립트를 이용하여 별도의 관리되는 어셈블리docs.unity3d.com  이거 뭐임?정확히는 Assembly Definition이란 용어는 그 기능에 대한 명칭이고, 사실은 파일을 Assembly Definition..
[졸업작품, Unity]아이템 시스템 수정
·
Unity
저번에 만들었던 아이템 시스템에 개편이 필요해 보여서 수정을 했다. 수정 내용은 다음과 같다. #region itemValue [Header("Effect Value")] [BoxGroup(GroupName = "EffectValue")] public float healCount; [BoxGroup(GroupName = "EffectValue")] public float damageCount; [BoxGroup(GroupName = "EffectValue")] public float defenceDecrease; [BoxGroup(GroupName = "EffectValue")] ..