멀티플레이어 어드벤처 RPG의 체계적인 코드 구조 분석
멀티플레이어 액션 RPG의 핵심 시스템 구현 방식
K-Project의 모든 코드 파일과 각각의 기능을 체계적으로 정리
K-Project 멀티플레이어 게임의 4계층 아키텍처
주요 클래스와 메서드의 상세한 API 문서
플레이어 장비의 타입과 카테고리를 정의하는 플래그 열거형. 비트마스크를 사용하여 다양한 장비 조합을 지원합니다.
EQUIPMENT_ALL (uint)
[읽기 전용]
모든 장비 타입을 나타내는 플래그 (0xFFFFFFFF)
EQUIPMENT_WEAPON_ONEHANDED_SHORT_RANGE (uint)
[읽기 전용]
한손 단거리 무기 (0xF0000000)
EQUIPMENT_WEAPON_ONEHANDED_LARGE_RANGE (uint)
[읽기 전용]
한손 장거리 무기 (0x0F000000)
EQUIPMENT_WEAPON_TWOHANDED_SHORT_RANGE (uint)
[읽기 전용]
양손 단거리 무기 (0x00F00000)
EQUIPMENT_WEAPON_TWOHANDED_LARGE_RANGE (uint)
[읽기 전용]
양손 장거리 무기 (0x000F0000)
EQUIPMENT_ACCESSORY (uint)
[읽기 전용]
액세서리 장비 (0x0000F000)
// 장비 타입 확인
if ((equipmentType & EquipmentState.EQUIPMENT_WEAPON_ONEHANDED_SHORT_RANGE) != 0) {
// 한손 단거리 무기 장착됨
}
// 장비 조합 설정
EquipmentState combined = EquipmentState.EQUIPMENT_WEAPON_ONEHANDED_SHORT_RANGE | EquipmentState.EQUIPMENT_ACCESSORY;
온라인 멀티플레이어 환경에서 다른 플레이어의 상태를 관리하는 클래스. 네트워크를 통한 애니메이션 및 스프라이트 동기화를 담당합니다.
void Start()
애니메이터와 스프라이트 렌더러 컴포넌트를 초기화합니다.
void Update()
서버 데이터를 기반으로 스프라이트 방향과 애니메이션을 동기화합니다.
void SetPlayerAnimation()
서버에서 받은 애니메이션 데이터를 플레이어에게 적용합니다.
onlinePlayer.SetPlayerAnimation();
playerName (string)
온라인 플레이어의 이름
// 온라인 플레이어 이름 설정
onlinePlayer.playerName = "Player123";
// 애니메이션 동기화
onlinePlayer.SetPlayerAnimation();
플레이어의 상태 정보를 저장하는 ScriptableObject 클래스. 레벨, 체력, 경험치, 장비 상태 등을 동적으로 관리합니다.
void Awake()
리플렉션을 사용하여 모든 공개 필드를 동적으로 딕셔너리에 저장합니다.
nickName (string)
플레이어의 닉네임
level (int)
플레이어의 현재 레벨
maxHP (int)
플레이어의 최대 체력
currentHp (int)
플레이어의 현재 체력
currentExp (int)
플레이어의 현재 경험치
damage (int)
플레이어의 공격력
defense (int)
플레이어의 방어력
critical (float)
크리티컬 확률
moveSpeed (float)
플레이어의 이동 속도
jumpPower (float)
플레이어의 점프력
jumpCount (int)
현재 점프 횟수
maxJump (int)
최대 점프 횟수
dashDamage (float)
대시 공격 데미지
strong (int)
강인함 수치
criticalDamage (float)
크리티컬 데미지 배율
attackSpeed (float)
공격 속도
fixedDamage (int)
고정 추가 데미지
defensePersent (float)
방어 확률 (백분율)
avoidPersent (float)
회피 확률 (백분율)
reloadTime (float)
재장전 시간
dashBarCount (int)
대시 바 개수
food (int)
음식 수치
money (int)
플레이어 보유 금액
// 플레이어 상태 수정
state.currentHp = 100;
state.level = 5;
// 상태 정보 확인
if (state.currentHp <= 0) {
// 플레이어 사망 처리
}
UI 이미지의 페이드 인/아웃 효과를 관리하는 클래스. 부드러운 알파 전환 애니메이션을 제공합니다.
IEnumerator FadeOut()
이미지를 점진적으로 불투명하게 만드는 페이드 아웃 코루틴입니다.
StartCoroutine(fadeEffect.FadeOut());
IEnumerator FadeIn()
이미지를 점진적으로 투명하게 만드는 페이드 인 코루틴입니다.
StartCoroutine(fadeEffect.FadeIn());
imageToFade (Image)
페이드 효과를 적용할 UI 이미지
fadeDuration (float)
페이드 애니메이션 지속 시간 (초, 기본값: 1.0f)
isFadeOut (bool)
현재 페이드 아웃 상태인지 여부
// 페이드 아웃 실행
StartCoroutine(fadeEffect.FadeOut());
// 페이드 지속 시간 설정
fadeEffect.fadeDuration = 2.0f;
조명 오브젝트의 부드러운 진동 움직임을 관리하는 클래스. 사인파를 이용한 자연스러운 흔들림 효과를 제공합니다.
void Start()
시작 시간을 초기화합니다.
void Update()
사인파를 이용한 위치 및 회전 업데이트를 수행합니다.
speed (float)
움직임의 속도 (기본값: 1.0f)
amplitude (float)
사인파의 진폭 크기 (기본값: 0.15f)
rotationSpeed (float)
회전 움직임의 속도 (기본값: 15.0f)
// 조명 움직임 설정
lightMoving.speed = 2.0f;
lightMoving.amplitude = 0.3f;
// 회전 속도 조정
lightMoving.rotationSpeed = 20.0f;
램프 오브젝트의 흔들림 회전 움직임을 관리하는 클래스. 사인파를 이용한 자연스러운 좌우 흔들림을 제공합니다.
void Start()
시작 시간을 초기화합니다.
void Update()
사인파를 이용한 Z축 회전 업데이트를 수행합니다.
speed (float)
회전 움직임의 속도 (기본값: 5.0f)
amplitude (float)
회전 사인파의 진폭 크기 (기본값: 5.0f)
// 램프 흔들림 설정
lampMoving.speed = 3.0f;
lampMoving.amplitude = 8.0f;
// 부드러운 흔들림으로 설정
lampMoving.speed = 1.0f;
lampMoving.amplitude = 2.0f;
멀티플레이어 시스템의 핵심 관리 클래스. 네트워크 통신, 플레이어 동기화, 서버 연결을 담당합니다.
void ConnectToServer()
서버에 TCP 연결을 설정합니다.
multiPlay.ConnectToServer();
void Disconnect()
서버 연결을 해제하고 모든 클라이언트 데이터를 정리합니다.
multiPlay.Disconnect();
void UpdateClientCharacterPositions()
다른 클라이언트들의 캐릭터 위치를 업데이트합니다.
multiPlay.UpdateClientCharacterPositions();
void UpdateClientCharacterFlip()
다른 클라이언트들의 캐릭터 스프라이트 방향을 업데이트합니다.
multiPlay.UpdateClientCharacterFlip();
void UpdateClientAnimationName()
다른 클라이언트들의 애니메이션 상태를 동기화합니다.
multiPlay.UpdateClientAnimationName();
bool IsCorrectData(string data)
받은 네트워크 데이터의 유효성을 검증합니다.
data
(string)
- 검증할 네트워크 데이터
bool isValid = multiPlay.IsCorrectData(networkData);
isConnected (bool)
[읽기 전용]
서버 연결 상태 (static)
clients (Dictionary<string, ClientData>)
[읽기 전용]
연결된 클라이언트들의 데이터 딕셔너리 (static)
currentClientSpriteFlip (List<string>)
현재 클라이언트들의 스프라이트 플립 상태 리스트 (static)
currentClientAnimationName (Dictionary<string, AnimatorClientData>)
현재 클라이언트들의 애니메이션 데이터 딕셔너리 (static)
currentServerFrame (int)
현재 서버 프레임 번호 (static)
// 스프라이트 플립 상태 확인
if (MultiPlay.currentClientSpriteFlip.IndexOf(playerName) != -1) {
// 플레이어 스프라이트가 플립된 상태
}
// 애니메이션 데이터 확인
if (MultiPlay.currentClientAnimationName.ContainsKey(playerName)) {
var animData = MultiPlay.currentClientAnimationName[playerName];
}
플레이어의 인벤토리 시스템을 관리하는 UI 클래스. 아이템 추가, 제거, 정렬 기능을 제공합니다.
void UpdateCoin()
현재 플레이어 보유 금액을 UI에 업데이트합니다.
inventory.UpdateCoin();
Sprite GetCurrentWeaphonSprite()
현재 장착된 무기의 스프라이트를 반환합니다.
Sprite weaponSprite = inventory.GetCurrentWeaphonSprite();
void EquidSlotStateUpdate()
장비 슬롯 상태를 업데이트하고 플레이어 능력치를 재계산합니다.
inventory.EquidSlotStateUpdate();
inventory (GameObject)
인벤토리 UI 게임오브젝트
coinText (Text)
플레이어 보유 금액을 표시하는 UI 텍스트
slots (Transform)
장비 슬롯들의 부모 트랜스폼
inventorySlotItem (Dictionary<Transform, GameObject>)
인벤토리 슬롯과 아이템의 매핑 딕셔너리
isLeft (bool)
현재 왼쪽 무기 슬롯 활성화 상태
// 인벤토리 금액 업데이트
inventory.UpdateCoin();
// 장비 슬롯 상태 갱신
inventory.EquidSlotStateUpdate();
// 현재 무기 스프라이트 가져오기
Sprite currentWeapon = inventory.GetCurrentWeaphonSprite();
플레이어와 보스의 체력바 및 레벨 UI를 관리하는 클래스. 실시간으로 체력과 보호막 상태를 표시합니다.
void UpdatePlayerHP()
플레이어의 체력바와 보호막 UI를 업데이트합니다.
hpLevelManager.UpdatePlayerHP();
void BossSliderReset()
보스의 체력바 UI를 업데이트합니다.
hpLevelManager.BossSliderReset();
void SetLevel(int level)
레벨 텍스트를 설정합니다.
level
(int)
- 설정할 레벨 값
hpLevelManager.SetLevel(5);
maxHpText (TextMeshProUGUI)
최대 체력을 표시하는 텍스트 UI
currentHpText (TextMeshProUGUI)
현재 체력을 표시하는 텍스트 UI
hpSlider (Slider)
체력바 슬라이더 UI
ShieldSlider (Slider)
보호막 슬라이더 UI
// 플레이어 체력 UI 업데이트
hpLevelManager.UpdatePlayerHP();
// 보스 체력 UI 업데이트
hpLevelManager.BossSliderReset();
// 레벨 설정
hpLevelManager.SetLevel(10);
게임의 로딩 화면을 관리하는 클래스. 씬 전환 시 로딩 상태를 표시하고 관리합니다.
void StartLoading()
로딩 화면을 시작하고 초기화합니다.
loading.StartLoading();
void UpdateProgress(float progress)
로딩 진행률을 업데이트합니다.
progress
(float)
- 로딩 진행률 (0.0f ~ 1.0f)
loading.UpdateProgress(0.5f);
void CompleteLoading()
로딩을 완료하고 다음 씬으로 전환합니다.
loading.CompleteLoading();
loadingSlider (Slider)
로딩 진행률을 표시하는 슬라이더
loadingText (Text)
로딩 상태를 표시하는 텍스트
// 로딩 시작
loading.StartLoading();
// 진행률 업데이트
loading.UpdateProgress(0.75f);
// 로딩 완료
loading.CompleteLoading();
게임의 자동 저장 기능을 관리하는 유틸리티 클래스. 정기적으로 게임 상태를 저장합니다.
void SaveCurrentScene(PlayModeStateChange state)
현재 활성 씬을 자동으로 저장합니다. (Unity Editor 전용, static)
state
(PlayModeStateChange)
- 플레이 모드 상태 변경 정보
// Unity Editor에서 자동으로 호출됨
// EditorApplication.playModeStateChanged += AutoSave.SaveCurrentScene;
// Unity Editor에서 플레이 모드 변경 시 자동 저장
// 개발자가 직접 호출할 필요 없음
// Debug 로그: '[씬이름] 에 자동 저장 완료!'
배경음악과 효과음을 관리하는 오디오 시스템 클래스. 사운드 재생, 볼륨 조절, 페이드 효과를 지원합니다.
void StartBackground()
배경음악을 시작합니다. (static)
BackgroundSound.StartBackground();
void StartBossClip()
보스 스테이지 음악으로 전환합니다. (static)
BackgroundSound.StartBossClip();
void NoBossClip()
보스 스테이지 음악에서 일반 음악으로 복귀합니다. (static)
BackgroundSound.NoBossClip();
void StartOtherCilp()
다른 음악 재생 시 현재 배경음악을 중지합니다. (static)
BackgroundSound.StartOtherCilp();
void StopOtherCilp()
다른 음악 재생 종료 후 원래 배경음악을 재개합니다. (static)
BackgroundSound.StopOtherCilp();
startClip (AudioClip)
일반 스테이지 시작 음악 클립
whileClip (AudioClip)
일반 스테이지 진행 중 음악 클립
startBossClip (AudioClip)
보스 스테이지 시작 음악 클립
whileBossClip (AudioClip)
보스 스테이지 진행 중 음악 클립
isBossStage (bool)
현재 보스 스테이지인지 여부 (static)
isOtherSound (bool)
다른 배경음악 재생 중인지 여부 (static)
// 게임 시작 시 배경음 재생
BackgroundSound.StartBackground();
// 보스전 시작
BackgroundSound.StartBossClip();
// 보스전 종료
BackgroundSound.NoBossClip();
// 컷씬 등 특별한 음악 재생
BackgroundSound.StartOtherCilp();
타이틀 화면의 배경 스크롤 효과를 관리하는 클래스. 무한 스크롤링 배경을 제공합니다.
void Start()
배경 스크롤 시스템을 초기화합니다.
void Update()
배경 스크롤 위치를 업데이트합니다.
void SetScrollSpeed(float speed)
스크롤 속도를 설정합니다.
speed
(float)
- 스크롤 속도
backgroundScroll.SetScrollSpeed(2.0f);
scrollSpeed (float)
배경 스크롤 속도
backgroundImages (Transform[])
스크롤할 배경 이미지들
// 스크롤 속도 설정
backgroundScroll.scrollSpeed = 1.5f;
// 스크롤 시작
backgroundScroll.SetScrollSpeed(2.0f);
텍스트의 깜빡임 효과를 관리하는 클래스. 메뉴나 프롬프트에서 사용되는 시각적 효과를 제공합니다.
void StartBlink()
텍스트 깜빡임 효과를 시작합니다.
blinkText.StartBlink();
void StopBlink()
텍스트 깜빡임 효과를 중지합니다.
blinkText.StopBlink();
void SetBlinkSpeed(float speed)
깜빡임 속도를 설정합니다.
speed
(float)
- 깜빡임 간격 (초)
blinkText.SetBlinkSpeed(0.5f);
targetText (Text)
깜빡임 효과를 적용할 텍스트
blinkInterval (float)
깜빡임 간격 (기본값: 1.0f)
isBlinking (bool)
[읽기 전용]
현재 깜빡이고 있는지 여부
// 깜빡임 시작
blinkText.StartBlink();
// 깜빡임 속도 설정
blinkText.SetBlinkSpeed(0.3f);
// 깜빡임 중지
blinkText.StopBlink();
게임 시작과 초기화를 관리하는 클래스. 타이틀 화면에서 메인 게임으로의 전환을 담당합니다.
void Update()
사용자 입력을 감지하여 로그인 화면을 활성화합니다.
loginObject (GameObject)
로그인 UI 게임오브젝트 (직렬화된 비공개 필드)
// 아무 키나 누르면 로그인 화면 활성화
// Input.anyKeyDown 감지 시 loginObject.SetActive(true)
// 로그인 프로세스 시작
// Login.GameLogin() 자동 호출