쓰리디아이 / 2020
Helliscape VR
VR 총기 조작과 반응하는 NPC 전투
PROJECT IN ACTION
실행 화면과 시연


Helliscape VR · 시연 1
OVERVIEW
프로젝트와 나의 역할
VR 격발·재장전 튜토리얼, 좀비·병사 FSM 초기 설계, 2인 네트워크 플레이의 초기 구조를 구현했습니다.
- VR 튜토리얼 Stage 개발
- 좀비, 병사 FSM 초기 디자인 구현
- 2인 네트워크 플레이를 위한 네트워크 초기 디자인 구현
- 팀원 일정 관리
ENGINEERING NOTES
기능별 구현과 문제 해결
담당 기능의 배경부터 구현 방식과 선택한 범위까지 정리했습니다.
VR 격발·재장전 튜토리얼
배경과 과제
Oculus Rift 컨트롤러 입력을 게임 속 총기 조작과 연결해야 했습니다.
내가 구현한 방식
장비 연동과 총기 격발·재장전을 익히는 튜토리얼 스테이지를 개발했습니다.
선택의 이유와 범위
담당한 튜토리얼 및 입력 연동 범위를 중심으로 설명합니다.
2026 / RECONSTRUCTED EXAMPLE
순서가 있는 VR 조작 튜토리얼
잡기·작동·재장전 입력을 순서대로 확인하는 작은 상태 모델입니다.
- 입력 이벤트
- 현재 단계 확인
- 순서 검증
- 다음 단계
설명용 개념도 · 실제 제품 화면이나 전체 시스템 설계도가 아닙니다.
사용 방법과 적용 범위
장비 입력 어댑터에서 Accept(TutorialStep)를 호출합니다.
특정 XR SDK 입력 바인딩, 총기 물리, 실제 애니메이션은 포함하지 않습니다.
예제 코드 펼치기포트폴리오용 재구성 코드 · 실제 업무 소스 아님
// 2026 portfolio reconstruction. Not original production source. Input-agnostic interaction model.
using System;
namespace PortfolioExamples
{
public enum TutorialStep { Grab, Activate, Reload, Complete }
public sealed class TutorialSequence
{
public TutorialStep Step { get; private set; } = TutorialStep.Grab;
public bool Accept(TutorialStep performed)
{
if (Step == TutorialStep.Complete || performed != Step) return false;
Step = (TutorialStep)((int)Step + 1); return true;
}
public void Reset() => Step = TutorialStep.Grab;
}
}
적을 보고 동료와 정보를 공유하는 NPC
배경과 과제
좀비와 병사가 교전하는 상황에서 시야, 장애물, 주변 아군의 정보를 반영해야 했습니다.
내가 구현한 방식
Waypoint 기반 FSM을 초기 설계했습니다. FOV와 장애물 검사로 적을 탐지하고, 발견·공격 정보를 일정 범위의 아군에게 전달하도록 구성했습니다.
선택의 이유와 범위
담당 범위는 NPC 초기 설계와 교전 테스트입니다. 탐지 조건과 정보 전달 구조를 중심으로 설명합니다.
2026 / RECONSTRUCTED EXAMPLE
시야와 정보 기억을 나누는 NPC 판단
거리·시야각·가림 여부로 탐지를 판단하고, 아군 신호와 기억 시간으로 상태를 선택합니다.
- 거리·각도·가림
- 탐지 여부
- 신호 기억
- 상태 선택
설명용 개념도 · 실제 제품 화면이나 전체 시스템 설계도가 아닙니다.
사용 방법과 적용 범위
InView에 월드 위치·방향과 외부 raycast 결과를 전달하고 Decide로 상태를 선택합니다.
Raycast, 실제 전투, 경로 이동, 동료 통신은 별도 계층입니다.
예제 코드 펼치기포트폴리오용 재구성 코드 · 실제 업무 소스 아님
// 2026 portfolio reconstruction. Not original production source.
using UnityEngine;
namespace PortfolioExamples
{
public enum Awareness { Patrol, Investigate, Engage }
public static class PerceptionRules
{
// Occlusion is supplied by a caller's raycast. This function does not perform physics queries.
public static bool InView(Vector3 eye, Vector3 forward, Vector3 target, float range, float fov, bool occluded)
{
Vector3 delta = target - eye;
if (occluded || range < 0 || delta.sqrMagnitude > range * range || forward.sqrMagnitude < 0.0001f) return false;
return delta.sqrMagnitude < 0.0001f || Vector3.Angle(forward, delta) <= Mathf.Clamp(fov, 0, 360) * 0.5f;
}
public static Awareness Decide(bool seesTarget, bool heardAlly, float secondsSinceLastSignal, float memorySeconds)
{
if (seesTarget) return Awareness.Engage;
if (heardAlly || secondsSinceLastSignal < Mathf.Max(0, memorySeconds)) return Awareness.Investigate;
return Awareness.Patrol;
}
}
}
2인 플레이의 초기 네트워크 구조
배경과 과제
두 클라이언트 중 데이터를 관리할 서버 역할을 정해야 했습니다.
내가 구현한 방식
패킷 기반 UDP 통신과 Alive 메시지를 사용했습니다. 외부 파일에 정의한 클라이언트 Index를 확인해 서버 역할을 구분하는 초기 구조를 구현했습니다.
선택의 이유와 범위
2인 환경을 위한 초기 역할 구분 구조입니다. 대규모 확장, 장애 복구, 보안 검증은 포함하지 않습니다.
2026 / RECONSTRUCTED EXAMPLE
참가자 목록에서 조정 역할 선택
동일한 참가자 목록에서 가장 작은 ID를 선택하는 결정적 예시입니다.
- 참가자 목록
- ID 규칙
- 역할 선택
- 통신 어댑터
설명용 개념도 · 실제 제품 화면이나 전체 시스템 설계도가 아닙니다.
사용 방법과 적용 범위
SelectCoordinator에 현재 참가자 ID 목록을 전달합니다.
새로 작성한 일반 예제이며 당시 프로토콜이 아닙니다. 합의·장애 복구·분할 네트워크는 해결하지 않습니다.
예제 코드 펼치기포트폴리오용 재구성 코드 · 실제 업무 소스 아님
// 2026 portfolio reconstruction. Not original production source or a transport protocol.
using System;
using System.Collections.Generic;
namespace PortfolioExamples
{
public static class SessionRoleSelector
{
// Deterministic demonstration using one complete participant list.
// Not consensus: inconsistent peer lists can produce split-brain results.
public static int SelectCoordinator(IEnumerable<int> participantIds)
{
if (participantIds == null) throw new ArgumentNullException(nameof(participantIds));
int smallest=int.MaxValue; bool any=false;
foreach(int id in participantIds) { if(id<0)throw new ArgumentException("IDs must be nonnegative."); smallest=Math.Min(smallest,id); any=true; }
if(!any)throw new ArgumentException("No participants."); return smallest;
}
}
}
주간 리뷰로 코드 이해도 맞추기
배경과 과제
신규 팀원과 함께 진행하면서 Unity·C# 이해도에 따른 일정 관리가 필요했습니다.
내가 구현한 방식
주간 코드 리뷰에서 팀원이 작성한 코드와 문제점을 설명하게 하고, 질문과 논의를 통해 해결 방향을 정리했습니다.
선택의 이유와 범위
개발 구현과 함께 3인 팀의 업무·일정 관리를 담당했습니다.
MORE SCREENS
추가 실행 화면
CODE & VALIDATION
코드와 검증 범위
기존 코드 발췌와 2026년 포트폴리오용 재구성 코드를 구분해 제공합니다. 재구성 코드는 실제 제품 소스가 아니며, 일반 원리를 설명하기 위해 새로 작성했습니다.
Unity 6000.0.23f1 컴파일 및 Editor 검증 56개 통과. 실제 장비 연동과 제품 통합은 검증 범위에 포함하지 않습니다.
예제별 사용법과 검증 내용 ↗

