[Button] public void PrintMessage() { Debug.Log(message); } [Button("Reset Position")] public void ResetPosition() { transform.position = Vector3.zero; Debug.Log("Position Reset!"); } [Button("Print Custom Message")] public void PrintCustomMessage(string message) { Debug.Log($"Custom Message: {message}"); }using System;using Uni..
2박 3일동안 진행된 다크 게임잼, 고인물들이 많이 모였다고 해서 많은 기대감을 안고 게임잼을 시작했습니다.그만큼 기술적으로 뛰어난 것을 만들고 싶었고 결과도 나쁘지 않게 나와 만족스러웠습니다.먼저, 위 움짤에서 보이는 모든 부분은 팀 100% 작업물입니다.에셋은 하나도 존재하지 않습니다. 상자가 이동하는 트레일 설치부터 건물 배치까지, 모든 것은 유저가 하나하나 컨트롤 가능한 게임입니다. 게임 설명은 귀찮으니 생략...무슨 자원 수집하는 게임이라고 했는데.. 게임을 잘 모르다 보니...
02.03(월)~02.05(수) 3일간 거진고등학교에 학생들을 가르쳐 주고 왔습니다~!! 거진고등학교까지 3시간이 넘는 거리였지만..! 고등학생들을 가르쳐본 경험이 없었기에 너무 설레는 마음으로 신청했습니다 ㅎㅎ! 1월부터 수업자료 준비를 시작하여, 약 한 달간 제작해서 그런지 제 스스로 느끼기에 수업자료 퀄리티가 꽤 많이 좋았습니다. 거진고등학교 도착하니 감회가 새롭더라고요...고등학교 졸업한 지 약 7년이 다 되어가서....너무 감정이 왈칵 ㅠㅠ 그만큼 더 학생들을 열심히 가르쳐주고 싶다는 의욕이 생기더라고요!! 거진고등학교 시설도 좋고 완전 부럽!학생들을 대상으로 한 수업이기에 최대한 쉽고, 재밌게 수업을 설계하려고 노력했습니다.하지만, 평범한 수업을 가르쳐주기엔 세상엔 유튜브에 너무 좋은 자료가 ..
OvrAvatarManagerOvrAvatarManager는 SDK의 생명주기(LifeCycle)를 관리하며, 주요 API를 제공하는 싱글톤 컴포넌트로써 중앙 설정 관리 역할을 수행하며 다음 기능들을 제공합니다.아바타 로드 속도 및 동시 실행 제한 등을 제어하여 프레임 속도를 유지합니다. 네트워크 대역폭 설정으로 로드 시간을 조정합니다.-1로 설정하면 대역폭 제한이 없으며, 설정 값을 낮추면 로드 시간이 증가할 수 있습니다.아바타 로드를 빠르게 하기 위해 자산(Avatar Asset)을 미리 로드합니다.Asset Preload는 로드 속도를 높이는 대신 메모리 사용량이 증가합니다.로그 레벨 설정으로 SDK 디버깅을 지원합니다.스키닝 솔루션 및 각 LOD에 대한 품질 설정을 지원합니다.사용하지 않는 Ski..
📌 Handles.Label()란?Handles.Label()은 씬(Scene) 뷰에서 특정 위치에 텍스트를 표시할 수 있는 함수입니다. Handles.Label()은 에디터 전용 기능입니다.기본적인 Handles.Label() 사용법using UnityEngine;using UnityEditor; // Handles를 사용하기 위해 필요public class HandlesLabelExample : MonoBehaviour{ void OnDrawGizmos() { Handles.Label(transform.position, "여기가 내 위치!"); }}씬(Scene) 창에서 오브젝트의 위치에 "여기가 내 위치!"라는 텍스트가 표시됩니다.public static void La..
Unity Meta SDK를 사용할 때 음성 인식 기능을 구현하려면 Meta Voice SDK와 Wit.ai을 활용하시면 됩니다. GitHub - oculus-samples/voicesdk-samples-whisperer: Oculus Voice SDK showcase demonstrating the use of Voice SDK in Unity. ThisOculus Voice SDK showcase demonstrating the use of Voice SDK in Unity. This project contains the source code for the "Whisperer" demo available on App Lab. The Oculus SDK and other suppor...github...
게임 개발 과정에서 실사풍과 스타일라이즈드는 게임의 전체적인 비주얼과 분위기를 결정하는 중요한 스타일입니다.두 스타일은 게임의 목적, 타겟층, 기술적 요구사항에 따라 선택되며, 각각의 장단점이 뚜렷합니다. 이번 글에서는 이 두 가지 스타일의 개념과 특징을 자세히 살펴보겠습니다.실사풍 (Realistic Style)실사풍은 현실 세계를 최대한 사실적으로 재현하는 스타일입니다. 이 스타일은 고해상도의 텍스처, 자연스러운 조명, 그리고 물리적 정확성을 강조합니다. 요즘 게임은 현실보다 더 현실같은 스타일을 만들어내곤 하죠. 그래픽의 발전덕분에요.목적: 현실과 유사한 경험 제공 (실제로 있을 법한 경험을 제공하기 위해, 현실보다 더 아름다운 분위기를 연출)디자인 특징: 세밀한 디테일, 고해상도 텍스처조명: 물리..
데이터를 다룰 때 종종 중복된 값이 문제를 일으키곤 합니다. LINQ에서 제공하는 Distinct() 메서드는 이러한 중복을 쉽게 제거해줍니다. Distinct()의 사용법과 다양한 활용 예제를 살펴보겠습니다.Distinct()란?Distinct()는 컬렉션 내의 중복된 요소를 제거하고 고유한 요소만 반환하는 LINQ 메서드입니다.using System;using System.Linq;using System.Collections.Generic;class Program{ static void Main() { var numbers = new List { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4 }; var uniqueNumbers = numbers.Distinc..
StateMachineBehaviour란?StateMachineBehaviour는 특정 State에 진입하자마자, 혹은 빠져나가기 직전 등 각 State의 상황에 따라 어떠한 코드를 자동으로 실행할 수 있도록 도와주는 스크립트입니다. StateMachineBehaviour는 State 입·출력, 업데이트 이벤트 등 다양한 콜백을 제공합니다. OnStateEnter, OnStateUpdate, OnStateExit 등은 물론, Transition시점에 호출되는 이벤트도 다룹니다.더보기🔽Animator란?Unity의 Animator는 State단위로 움직임을 정의합니다. “(Transition) Condition”과 “Animation Clip”을 활용하여 각 State를 서로 연결합니다. StateM..
Meta Avatar SDK 31버전부터는 Avatars 2.0의 도입으로 인해, 3인칭 뷰에서 아바타가 다리를 가지게 되었습니다. 아바타 다리가 생김에 따라 아바타에 적절한 애니메이션이 필요하게 되었는데요. 예를 들어, 점프, 걷기, 뛰기 등.아바타를 더 생동감 있게 만들기 위해, OvrAvatarAnimationBehavior라는 새로운 컴포넌트를 사용하여 아바타에 전신 로코모션을 추가할 수 있게 되었습니다.OvrAvatarAnimationBehavior컴포넌트는 아바타가 환경에 맞게 움직일 수 있도록 하는 애니메이션 컨트롤러를 구현하며, 헤드셋의 움직임을 기반으로 애니메이션을 작동시킬 수 있습니다. 또한, 커스텀 전신 애니메이션을 사용할 수도 있습니다.전신 로코모션으로 아바타 애니메이션 활성화Ava..
C#은 null 참조 에러(null reference exception)를 방지하기 위해 널 허용 참조 타입(nullable reference type)을 도입했습니다. 이에 따라, 컴파일러는 변수가 널(null)일 가능성이 있는 경우 경고를 표시합니다. 하지만 개발자가 변수가 절대로 널이 아님을 확신하는 경우, 컴파일러의 경고를 무시하고 이를 명시적으로 나타내기 위해 널 허용 연산자(null-forgiving operator, !)를 사용할 수 있습니다.널 허용 연산자란?널 허용 연산자(!)는 C#에서 널 검사 경고를 억제하는 연산자입니다. 이를 통해 컴파일러가 "이 변수는 널일 수도 있다"고 경고하는 상황을 개발자가 강제로 무시할 수 있습니다.string? nullableString = null;//..
프로그래밍할 때 종종 사용하는 용어 중 TearDown과 Dirty는 맥락에 따라 다른 의미로 쓰이지만, 각각의 개념은 개발 과정에서 중요합니다. 이번 글에서는 이 두 용어의 의미와 사용 예를 정리해보겠습니다.TearDownTearDown은 설정된 상태를 초기화하거나 제거하는 과정을 의미합니다. 이는 특정 작업이 완료된 후 남아 있는 자원을 정리하거나, 테스트 환경을 원래 상태로 복구하는 데 사용됩니다.예시Unity의 Test Framework에서 TearDown은 테스트가 끝난 후 실행되는 메서드입니다. 테스트 중 생성된 오브젝트나 데이터를 정리해, 다음 테스트가 영향을 받지 않도록 해줍니다.using UnityEngine;using UnityEngine.TestTools;using NUnit.Fram..
플레이어가 여러 명일 경우 “어떤 순서”로 처리할지 고민이 생길 수 있습니다. 대표적으로 플레이어가 네트워크에 접속하는 순서, 혹은 특정 인덱스 기준으로 정렬하고 싶을 때가 있죠.Runner.ActivePlayers는 현재 게임(세션)에 접속해 있는 모든 플레이어 목록을 제공합니다. 여기에 OrderBy(p => p.AsIndex)를 붙이면, 플레이어를 “Index가 낮은 순”부터 정렬합니다.Index가 낮을수록 먼저 접속했거나, Fusion2 내부에서 먼저 할당된 플레이어를 의미합니다. foreach (var playerRef in Runner.ActivePlayers.OrderBy(p => p.AsIndex)){ // 인덱스 순서대로 처리하고 싶은 로직}
Meta SDK를 활용하여 프로젝트를 개발할 때, Meta 플랫폼의 유저 이름을 받아오는 기능에 대해 알아보고자 합니다. 또한 Entitlement, PlatformInfo, Platform이 무엇인지 알아보고, Oculus ID를 통해 최종적으로 유저 이름을 받아오는 방법을 공유하고자 합니다.Entitlement이란?Entitlement는 Meta 플랫폼에서 사용자의 소프트웨어 사용 권한을 확인하는 과정입니다. 사용자가 특정 애플리케이션에 접근할 권한이 있는지를 검증하는 단계로, 보안상 매우 중요한 역할을 합니다. Entitlement 검사는 일반적으로 다음과 같은 상황에서 이루어집니다.사용자가 구매한 애플리케이션에 대한 라이선스 확인애플리케이션의 불법 복제 방지Meta SDK는 이러한 과정(Entit..
Meta Avatar 움직임을 네트워크를 통해 동기화하기 위해 RecordStreamData와 ApplyStreamData 메서드, StreamLOD와 같은 기능을 제공합니다. RecordStreamDatapacket.dataByteCount = _localAvatar.RecordStreamData_AutoBuffer(lod, ref packet.data); //예시RecordStreamData 메서드는 아바타의 현재 상태(움직임과 표정 등)를 캡처하여 이진(binary) 형식으로 압축합니다. 생성된 데이터는 네트워크를 통해 전송되어 특정 시점(=스냅샷)의 아바타 상태를 나타냅니다.ApplyStreamDataavatar.ApplyStreamData(tempStreamDatas); //예시네트워크를 통해 ..
'I Am Cat' 게임은?'I Am Cat'은 플레이어가 고양이가 되어 할머니의 집을 탐험(망가트리는?ㅋㅋ)하는 게임입니다. 집안 곳곳을 돌아다니며 물건을 떨어뜨리고, 가구를 긁고, 심지어 할머니와 숨바꼭질을 할 수도 있습니다.모든 오브젝트는 물리 기반으로 이루어져 있어 몰입감과 현실감을 더해줍니다.유튜브 영상주요특징고양이의 시점에서 할머니 집을 탐험하며, 점프하고, 물건과 상호작용하며, 집안의 사소한 말썽을 부리는 등의 행동을 통해 고양이의 일상을 체험할 수 있습니다. 고양이를 키우는 주인님이 계신다면 꼭 한 번 고양이의 삶을 살아보세요... 할머니의 집에는 다양한 비밀과 퀘스트가 존재하며, 플레이어는 자유롭게 집안을 돌아다니며 다양한 상호작용을 경험할 수 있습니다. 상호작용을 통해 미니 게임이나 퍼..
Green Hell VR은?최대 4명의 친구들과 생존 기술로 야생 열대우림을 탐험하고, 사냥을 하고, 포식자들과 적대적인 부족의 위협으로부터 살아남는 생존게임입니다. Green Hell VR은 가장 정통적인 스토리 중심의 VR 서바이벌 게임으로, 현실적인 생존 기술들을 이용해야 합니다. 넓디 넓은 아마존 정글맵에 존재하는 야생 동물로부터 살아남아야하며 필요한 모든 것을 수집, 제작, 운반하여야합니다. Green Hell VR의 전체 스토리 캠페인에서 실종된 아내를 찾아 떠나는 인류학자 제이크 히긴스의 스릴 넘치는 이야기를 따라가는 내용입니다. 후기 밤과 낮이 존재하는 메커니즘, 그리고 정말 현실적인 생존 방식이 마음에 들었습니다.하지만, 텍스처가 멀미를 유발했고 VR로 오래 플레이 하기에는 불편한 점이 ..
게임 개발을 하다 보면, 배열(혹은 리스트)의 데이터를 복사해야 할 때가 종종 있습니다.그런데 C#에서 배열은 참조 타입이라 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)가 존재하여 사용할 때 혼동될 수 있습니다. Unity 프로젝트에서 발생할 수 있는 사례로 알아보겠습니다. 얕은 복사(Shallow Copy)란?“원본과 같은 데이터를 가리키는 참조만 복사한다.”즉, 배열 변수가 가리키는 메모리 주소(참조)만 복사하는 방식입니다. 원본 배열과 복사본 배열은 동일한 실체(데이터)를 공유하므로, 한쪽을 변경하면 다른 쪽에도 영향이 갑니다.void Start(){ int[] originalArray = { 1, 2, 3, 4 }; int[] shallowCopy = origin..
VR로 게임을 하다보면 UI가 선명하지 않아서 보기 불편한 적이 많으셨죠? 특히 2D UI의 경우 Text가 읽기 매우 불편한데요, 오늘 OVR Overlay 컴포넌트를 이용해서 약간 해결해보고자 합니다.OVROverlay는 Compositor Layer를 사용해서 텍스처를 애플리케이션 렌더링 경로를 거치지 않고 직접 디스플레이로 전달하므로, CPU와 GPU 리소스를 절약하면서 선명한 이미지를 제공하도록 도와주는 컴포넌트입니다.Compositor Layer란?Compositor Layer는 VR 애플리케이션의 렌더링 과정을 최적화하여 텍스처, UI, Video와 같은 요소를 효율적으로 디스플레이에 출력하는 방식입니다.Compositor Layer 방식은 Eye Buffer(전통적인 VR 렌더링 파이프라인..