INTRO VR 전시 프로젝트를 진행하면서 5분 동안 유저의 이동이 없을 때 시작 Scene으로 이동하는 기능을 개발하게 되었다. 기존 Input System을 이용한다면 UnityEngine 내부에 있는 Input.anyKeyDown을 이용하면 간단히 구현할 수 있지만, XR Interaction Toolkit Package를 사용하면서 새로운 Input System에 대해서는 작동하지 않았다. 그래서 transform.position과 Coroutine을 이용하여 Input System없이 간단하게 구현해보았다. CONTENT 먼저, TimeSceneChagne.cs의 전체 코드는 아래와 같다. using System.Collections; using System.Collections.Generic;..
UnityEngine 내 Color를 사용할 때 주의해야할 점이 있다. 드로잉 월드를 제작하면서 로컬이 색깔을 선택하고 서버로 보낼 때, 선택한 색깔의 r,g,b,a 값을 number로 보냈다. 서버에서는 받은 data를 로컬을 제외한 다른 플레이어에게 보내며, 데이터를 받은 다른 플레이어들은 Color을 아래와 같이 설정했었다. Connector.Instance.DrawStartRes = (data: { sessionId: string; lineWidth: number; color_r: number; color_g: number; color_b: number; color_a: number; }) => { const line = Manager.Resource.Instantiate("Prefabs\\Lin..
유니티에서 옵저버 패턴을 사용하여 프로그래밍한 것은 매우 중요한데, 만약 두 개의 컴포넌트가 서로의 정보(변수, 메서드 등)를 공유해야하는 상황에서 서로 결합(tightly-coupled)되어있다면, 서로가 영향을 미치기에 하나의 컴포넌트를 수정하면 다른 컴포넌트에서 에러가 발생하기에 수정에 불리하다. 이는 객체지향 원칙에 걸맞지 않는 상황인 것이다. 디자인 패턴 중 옵저버 패턴(Observer Pattern)은 시스템을 확장성(Scalable), 유지성(Maintainable), 비결합성(Loosely-coupled) 모두를 충족하게 만들어준다. OOP 코드를 작성할 때, 비결합(Decoupled)으로 코드를 작성해야 에러가 날 확률도 적고 모듈화하기도 쉬우며, 디버깅하기도 쉽다. 아래 코드는 싱글톤 ..
INTRO Unity AI Navigation을 이용하여 플레이어를 추적하는 몬스터 시스템을 Tag를 이용하여 구현하던 도중, 동일한 Tag의 플레이어가 다수일 경우 몬스터는 어떤 플레이어를 우선순위로 따라갈지 궁금해졌다. 여러 테스트를 통해 우선순위 기준이 Tag라는 시스템에 있었다는 것을 알았고, 그 과정에 대해 적어보려고 한다. CONTENT 우선 몬스터 Control에 대한 기본적인 코드를 첨부하면 아래와 같다. using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class MonsterCtrl : MonoBehaviour { private Transform..
INTRO Unity3D를 학습하다보면 이동(Translate)과 회전(Rotation)을 배우게 되는데, 이 때 보간법(Interpolation)을 배우게 된다. 원하는 시작 지점과 끝 지점 사이에 원하는 함수를 사용하여 함숫값이나 근삿값을 구하는 방법이다. 가장 기초적으로 배우는 보간법은 바로 선형 보간법(Linear Interpolation), Lerp이다. 말 그대로 선형, 직선 함수를 사용하여 두 지점 사이에 함숫값을 구하는 보간법인데, 실제로 유니티에서 구현하다보면 선형으로 변하는게 아닌 곡선으로 값이 나올 때가 있다. 의도적으로 그런 효과를 원한다면 괜찮겠지만, 선형(직선) 보간법을 사용한만큼 선형적으로 변해야만 정확하게 사용한 것이다. 언제 그렇고, 어떻게 코드를 작성하면 그런지, 그리고 ..
INTRO Unity XR Interaction Toolkit을 공부하던 중 LeftHand Direct Interactor에 Kill Log나 HP 등을 표시할 UI를 부착해보기로 했습니다. 이전 제페토 월드를 제작할 때 말풍선에 사용했던 코드를 비교하면서 새로운 방법과 기존 방법과의 차이를 비교해보려고 합니다. CONTENT 미리 Prefab화 해둔 UI Offset를 Hierachy에 Instantiate하고 LeftHand Direct Interactor의 Child로 넣어주었습니다. 중요한 것은 UI의 Rotation이 플레이어의 카메라 Rotation에 맞춰 실시간으로 변해야 한다는 것이죠 제페토 프로젝트를 진행하면서 NPC의 말풍선에도 똑같은 기능을 적용시켜야 했으며, 그 당시에는 LookA..