유니티 엔진 - 게임 프로젝트/Photon을 사용한 멀티 플레이어 게임

서버 연결 - 개선) 오브젝트 관리 + 컴포넌트 참조 개선

monstro 2026. 3. 23. 12:24
728x90
반응형

- 개요

게임에 존재하는 특정한 오브젝트를 관리하는 매니저 클래스를 추가하여 

게임 전체를 탐색하는 것이 아닌 매니저 클래스를 통해 오브젝트에 접근할 수 있도록 개선한다

또, 컴포넌트 참조 방식을 수정하여 안전하게 컴포넌트에 접근할 수 있도록 구조를 변경한다

 

- 애셋 작업

1) CinemachineCamera 오브젝트

 

플레이어를 따라다니는 CinemachineCamera 오브젝트에 Tag를 추가하여 Tag를 통해 접근할 수 있도록 한다

 

2) 조준선 오브젝트

 

씬에 존재하는 조준선 오브젝트에도 Tag를 추가하여 Tag를 통해 접근한다

 

- 스크립트 작업

1) 컴포넌트 참조 방식 수정

1 -1) Util 클래스

 

GetOrAddComponent 함수를 추가하여 컴포넌트를 안전하게 참조한다

 

 

FindChild 함수를 추가하여 자식 오브젝트에서 원하는 컴포넌트를 찾을 수 있도록 한다

불리언 인자를 설정하여 재귀적으로 탐색할 수 있으며

오버로드된 버전을 사용하여 자식 GameObject를 찾을 수도 있다

 

 

FindParent 함수를 추가하여 부모 오브젝트에서 원하는 컴포넌트를 찾을 수 있도록 한다

불리언 인자를 설정하여 자기자신부터 탐색할지 결정할 수 있다

오버로드된 버전을 사용하여 부모 GameObject를 찾을 수도 있다

 

1 - 2) Extension 클래스

 

위와 같이 익스텐션 클래스를 정의하여 기존의 코드를 수정하지 않고 새로운 메서드를 사용할 수 있도록 설계한다

Util 클래스의 GetOrAddComponent 함수 GameObject가 유효한지 판단하는 IsValid 함수를 추가하였다

 

2) 오브젝트 관리 방식 수정

 

딕셔너리를 사용하여 특정한 오브젝트를 관리하도록 수정한다

오브젝트의 이름에 따라 오브젝트를 저장하며 관리 방식을 추후에 변경할 수도 있다

 

 

Register 함수를 사용하여 딕셔너리에 오브젝트를 저장하고, Unregister 함수를 사용하여 딕셔너리에서 제거한다

Get 함수를 사용하여 딕셔너리로부터 오브젝트를 가져온다

 

3) 기존의 코드 수정

3 - 1) WeaponPickup 클래스

Awake 함수를 위와 같이 구성하여 ObjectManager에 해당 무기를 저장한다

 

 

기존에 사용하던 GetComponent 방식을 GetOrAddComponent 방식으로 수정한다

 

3 - 2) SpawnCharacter 클래스

 

Awake 함수를 새로 구성하여 ObjectManager에 캐릭터 스포너를 저장한다

 

3 - 3) SpawnWeapon 클래스

 

동일하게 Awake 함수를 구성하여 ObjectManager에 무기 스포너를 저장한다

 

3 - 4) PlayerWeaponChange 클래스

 

테스트 코드에서 ObjectManager를 사용하여 오브젝트에 접근하고

GetOrAddComponent 함수를 사용하여 컴포넌트를 안전하게 참조한다

 

3 - 5) PlayerController 클래스

 

GetOrAddComponent 함수를 호출하여 컴포넌트를 참조하고

Tag를 사용하여 CinemachineCamera 오브젝트에 접근한다

또, 매번 PhotonView 컴포넌트에 접근하지 않고 캐싱된 컴포넌트를 사용한다

 

3 - 6) PlayerLookAimRef 클래스

 

씬에 존재하는 조준선 오브젝트Tag를 통해 접근하는 방식으로 수정하고

Util 클래스의 FindParent 함수를 호출하여 부모 오브젝트PhotonView 컴포넌트를 참조한다

 

- 최종 실행 결과

728x90
반응형