Metaverse/Unity 18

Crescendor - Scene Loading 구현

맨 처음 실행했을 때, Main Scene을 로딩하는 화면을 구현했다. 로딩은 각각 처음 실행 시, 연습 모드 진입 시, 실전 모드 진입 시에 구현할 예정이다. 각각 로딩 화면을 다르게 할거라 리팩토링이 필요할거다. 디자인을 하면서 기능 구현을 동시에 진행 중이다. 우리 팀은 UI/UX 관련 피드백을 주로 받았기 때문에 더 신경을 쓸 예정이다. 로딩이 90% 이상 진행되면 투명도를 올린다던가 로딩 바 아래에 텍스트를 추가하여 진행률을 보여준다던가 등의 작업을 하려고 한다. [SerializeField] Slider progressBar; private void Start() { StartCoroutine(Loading()); } IEnumerator Loading() { yield return null;..

Metaverse/Unity 2024.04.13

OVRInput - 제스처 인식

진짜 어이없게도... 컨트롤러 인풋을 넣으려고 테스팅을 하다가 발견하고 냅다 노선을 변경했다. 우리 시스템은 컨트롤러가 필요없는 더 편리한^^ 시스템이 될 것 같다. private void Update() { if (OVRInput.GetDown(OVRInput.Button.Three)) { LeftHandPosition(); } } private void Update() { if (OVRInput.GetDown(OVRInput.Button.One)) { RightHandPosition(); } } Button.One은 컨트롤러의 A버튼, Button.Three은 컨트롤러의 X버튼에 해당된다. 그런데 이게 각 양손의 pinch gesture에 해당하기도 하더라.. 그래서 다른 제스처도 해당되는게 있나 찾..

Metaverse/Unity 2024.03.10

Crescendor - HandTracking Transform API

이벤트가 발생하면, 사용자의 손의 위치를 반환하여 해당 위치로 오브젝트의 위치를 변경하려고 한다. 그러면 Hand 관련 API에서 Transform 정보를 받아와야했고, 그 정보는 OVRHand의 PointerPose였다. 또한, PointerPose에 사용자의 Hand Data를 대입하기 위해 OVRHand에 Tracked Pose Driver라는 컴포넌트가 필요했다. Tracked Pose Driver는 트래킹 대상 객체의 정보를 전달해주는 컴포넌트이다. OVRPlugin과 OVRCommon에는 각각 HandState와 FromFlippedZVector3f() 가 명시되어 있다. 간단한 테스팅을 위해 다음과 같이 함수를 작성하여 UI 버튼 클릭 이벤트 발생 시 Note의 위치를 바꿔주었다. using..

Metaverse/Unity 2024.01.17

Crescendor - Android Build 관련 삽질

학기 중에 졸업작품 제안서를 쓰면서 테스팅을 진행하는데, 나를 계속 괴롭혔던 오류이다. android build support가 설치되지 않고, sdk / ndk / jdk를 따로 설치하니 계속 오류가 떠서 결국 빌드를 못해보고 다른 팀원에게 넘기게 되었다. 이제 oculus build는 거의 내가 담당할 예정이라 기기도 내가 가지고 있고, apk 빌드를 꼭 해내야만 하는 상황이어서 밤새 붙잡고 있어봤다.... 나는 unity에서 jdk, sdk, ndk의 경로를 직접 설정했다. unity editor에 내장된 모듈은 설치가 안되고 (아마 유니티 허브와 에디터의 버전이 안맞아서인 듯한데, 우리가 맞추기로 한 버전은 더이상 허브에서 설치할 수 없는 버전이었다.) android studio의 sdk mana..

Metaverse/Unity 2024.01.04

RPG Project - Event

퀘스트를 구현하던 팀원이 넘겨줘서 몬스터 Die마다 monsterID를 넘겨주는 코드를 짜달라고 했는데, 내가 이벤트 핸들러를 구현해서 새로운 이벤트를 만들고 Invoke해야 하는 줄 알고.. 잘못 해갔다가 회의하면서 노션에 정리해둔 내용 보여줬는데 팀원이 당황했다...ㅎㅎ 그냥 구현되어 있는 Action에 매개변수만 넘기면 되는거였어서... 정말.. 바보였다... 다음부턴 커뮤니케이션을 잘 하기로 했고 덕분에 소통의 중요성을 깨달았다.. int MonsterID(object sender, EventArgs e) { if (this.CompareTag("Ork")) { monsterID = 2000; } else if (this.CompareTag("Golem")) { monsterID = 2005; }..

Metaverse/Unity 2023.09.16

Event

Win API 동작구조 WinMain() 함수를 통해 윈도우 응용 프로그램이 시작됨 사용자 입력 이벤트는 모두 메세지로 전환됨 윈도우 운영체제는 이벤트에 따른 메세지를 메세지 큐에 추가 메인 메세지 루프는 메세지 큐에서 메세지를 꺼내서 처리 (FIFO 구조) 윈도우 종료 메세지를 처리하면 메인 메세지 루프가 종료되고 응용 프로그램도 종료됨 C#에서 이벤트 작성 과정 이벤트 발생 시 처리해줄 메서드 작성 (이벤트 핸들러) 이벤트 핸들러의 형태와 일치하는 델리게이트 선언 (System.EventHandler 델리게이트를 사용하면 이 과정 생략됨) 이벤트 선언 (미리 정의된 이벤트인 경우 이 과정 생략됨) 이벤트에 이벤트 처리기 등록 이벤트 발생 이벤트와 대리자의 차이점 : 이벤트는 외부에서 직접 사용할 수 ..

Metaverse/Unity 2023.08.31

RPG Project 오류 일지 - Respawn

오브젝트 풀에 10개의 오브젝트를 할당해두고, 몬스터가 죽어도 전체 개수는 계속 10개로 유지하도록 구현했다. 구현하는 중에 오브젝트 풀을 Manager로 선언해서 싱글톤 패턴을 적용할까 싶었지만, Monster에만 관여하므로 굳이 싶었다.. (프리팹이 더 다양했으면 처음부터 Manager로 올렸을거다) 그래서 최대한 지금 상태에서 생각할 수 있는 방법을 적용하려고 머리를 굴렸다. 유니티 함수의 생명주기를 다 고려해보다가 죽은 몬스터의 인덱스를 찾는건 Update()가 가장 적절하다고 생각했고, 리스폰해주는 함수의 위치를 생각하는건 꽤 어려웠다.. 이 참에 생명 주기 함수를 모두 복습했고, 코루틴도 복습했지만 적절한 위치가 없었고, 코루틴은 메모리 낭비가 큰 것 같아 InvokeReapeating을 사용..

Metaverse/Unity 2023.08.15

Scriptable Object

Scriptable Object : 클래스 인스턴스와는 별도로 대량의 데이터를 저장하는 데 사용할 수 있는 데이터 컨테이너 유니티 오브젝트를 상속받은 클래스로 Unity Serialize 시스템을 가지고 있음 serialize: 클래스나 오브젝트를 스트링이나 일차원 배열 형태로 변환하는 것 실제 파일을 열어 보면 저장된 텍스트 내용 확인 가능 데이터 컨테이너로 데이터 공유에 사용할 수 있고, 이를 통해 메모리 사용량 줄일 수 있음 Scriptable Object는 데이터를 참조 형태로 오브젝트에서 가져올 수 있게 함으로써 메모리 할당을 최소화하고 고유한 값을 가질 수 있게 함 주요 사용 사례) 사본이 생성되는 것을 방지하여 프로젝트의 메모리 사용을 줄임 연결된 MonoBehaviour 스크립트에 변경되지..

Metaverse/Unity 2023.07.24