자료실

Fusion Impostor 게임 개발 가이드
작성자 | admin 2023-04-28  |    조회수 : 1000  


본 블로그는 2023년 3월 24일에 공개된 Fusion Impostor 遊戲開發導讀를 번역했습니다.


Fusion SDK 개발 규칙 및 아키텍처 지침 이해

본 블로그에서는 Fusion SDK로 만든 매우 인기 있는 소셜 추리 게임인 Fusion Impostor를 소개합니다. 해당 예제는 호스트 모드 토폴로지를 사용하여 10명의 플레이어를 수용할 수 있는 게임을 개발하고 Photon Voice SDK를 사용하여 대화하는 방법을 보여줍니다. 예제는 음성 통신, 네트워크로 연결된 게임 상태 머신, 사용자가 커스터마이징 가능한 게임 설정 등을 포함하여 풍부한 기능을 제공합니다. 일반적으로 방 설정과 플레이어 참여 방법이 단순할수록 게임 플레이가 더 쉬워지므로 본 예제에서도 간단한 설계 방법을 채택했으며 네트워크 설계의 핵심으로 접할 수 있습니다. 게임 개발에서는 네트워크 상태 머신을 사용하여 게임 로직을 동기화하고 제어하는 ​​것이 매우 중요하므로 샘플에는 모듈형 인터랙티브 시스템에서 다양한 미니 게임의 크루 작업도 포함됩니다. 이로써 개발하려는 프로젝트에 더 많은 상상의 발휘할 여지를 늘릴 수도 있습니다.



주요 하이라이트


● 게임 로비 및 게임의 음성 통신
● 게임 전, 게임 플레이, 회의 및 게임 결과를 다루는 완전히 네트워크화된 게임 상태 머신 및 시스템
● 미션 스테이션 및 크루 시체와 같은 공유(동기화) 인터랙티브 지점
● 사용자 지정 가능한 게임 설정(임포스터 수, 이동 속도, 플레이어 충돌 등)
● 다음과 같은 세계의 객체 상태 동기화: 문의 상태
● 모듈형 인터랙티브 시스템 기반의 다양한 크루 태스크(Task, Mini Game)
● Photon Voice로 다양한 음성 통신 타입 처리
● 코드(Room code)를 사용하여 방을 설정하여 플레이어가 입력한 후 바로 입장
● 로캘, 닉네임 및 마이크 선택

본 문서는 고급 온라인 게임 개발자를 위한 간결한 가이드를 제공하고 예제를 통해 게임 개발의 재미를 느껴보시길 바랍니다. 그럼 다운로드 하시고 사용하세요!!

샘플 다운로드


https://doc.photonengine.com/ko-kr/fusion/current/game-samples/fusion-impostor#a2l3ygzuhdfilvb6



・ ・ ・


주요 기능 소개



플레이어


플레이어의 동작은 각각 고유한 목적을 가진 세 가지 컴포넌트를 사용합니다.

PlayerObject는 방 인덱스, 닉네임 및 선택한 색상을 포함하여오브젝트와 연결된 PlayerRef에 대한 참조를 저장합니다.
PlayerMovement는 플레이어 이동 및 입력은 물론 게임에서 요구하는 데이터 및 메서드를 담당합니다.
PlayerData는 주로 재료, 애니메이션 속성 설정 및 닉네임 UI 인스턴스화를 처리합니다.

플레이어 레지스트리(PlayerRegistry)


방에 있는 각 플레이어에 대한 참조를 저장하고 플레이어를 선택하고 조작하기 위한 유틸리티 방법을 제공합니다.

게임 상태 GameState


게임 로직의 흐름과 동작은 GameState NetworkBehaviour에 의해 제어됩니다.

게임에 참여


사용자는 방 ID를 사용하여 방에 참여하거나 방을 호스트(호스트)할 수 있습니다.

게임 전


방에 들어간 후 게임이 공식적으로 시작되기 전에 플레이어는 색상을 선택하고 마이크를 설정할 수 있으며 호스트는 게임 설정을 사용자 정의하고 게임 시작을 담당할 수 있습니다.

입력 처리


네트워크로 연결된 입력은 PlayerInputBehaviour.cs에서 확인하고 여기에서 입력 식별을 분류하기 위해 입력 스크리닝을 수행합니다. 이후 PlayerMovement.cs에서 서버(호스트 입력) 확인을 한 후 입력 작업을 진행합니다.

키보드와 마우스


WASD 키로 걷기, E 키로 상호작용, Enter 키로 게임 시작(게임 전 단계의 호스트만 가능), 왼쪽 키로 걷기, UI에서 버튼을 클릭하여 조작합니다.

인터렉티브 오브젝트


게임에는 색상 선택기, 설정 기계, 비상 버튼, 미션 및 시체와 같은 여러 인터랙티브 오브젝트가 있습니다.

미션


지도에는 14개의 미션 스테이션이 있으며 5개의 독특한 미션 미니 게임, 서모 스탯 조정, 슬라이더 슬라이드, 패턴 매칭, 번호 주문, 파일 다운로드 등 있습니다.

음성 채팅


Fusion Impostor 게임 예제는 Photon Voice SDK v2를 사용하여 FusionVoiceNetwork 및 VoiceNetworkObject의 두 프로그램 사용을 포함하여 음성 통신 기능을 제공합니다.
(참고) 게임 예제는 Unity 2021.3 버전을 사용하여 개발되었습니다.
위 내용은 Fusion Impostor 게임 예제의 테마 기능에 대한 소개입니다.

・ ・ ・


다음으로 몇 가지 주요 프로젝트에 대해 설명하겠습니다.

폴더 구조


기본 스크립트 폴더 /Scripts 에는 예제의 기본 네트워킹 구현 및 네트워크 상태 시스템이 포함된 Networking 이라는 하위 폴더가 있습니다 . PlayerManagers 와 같은 다른 하위 폴더 에는 각각 게임 동작 및 관리 로직이 포함되어 있습니다.

게임 참여


사용자는 방 코드를 사용하여 방에 참여하거나 방을 생성할 수 있으며, 방 생성을 선택하면 방 코드를 입력할 수 있습니다. 방에 들어가면 화면 하단에 참여를 위한 코드네임이 나타납니다. 방 코드 runner.SessionInfo.Name으로 얻을 수 있고 NetworkStartBridge는 NetworkDebugStart에 대한 중간 인터페이스 역할을 합니다. 특정 방 코드가 지정되지 않은 경우 StartHost()는 RoomCode에서 임의의 4자 문자열을 가져옵니다. RoomCode의 작동 방식을 살펴보겠습니다.

RoomCode.cs


RoomCode라는 정적 클래스는 게임 룸 코드를 생성하기 위해 정의됩니다. 이 카테고리에는 선택적 매개 변수 길이(코드 길이)를 기본값 4로 허용하는 정적 메서드 Create()가 있습니다.

  1. 1. Create() 메서드는 방 코드를 생성하는 데 사용되는 문자를 포함하는 문자 그룹 chars를 내부적으로 정의합니다.
    특히 문자 그룹에 혼동을 주는 문자(예: I, O, 1, 0 등)가 포함되어 있지 않습니다.
  2. 2. 생성된 방 코드를 저장하는 데 사용되는 빈 문자열 str도 메서드 내에서 정의됩니다.
  3. 3. 다음으로 for 루프를 사용하여 방 코드를 생성합니다. 루프는 0부터 시작하며 실행 횟수는 길이(코드 길이)와 같습니다.
  4. 4. 각 루프에서 문자는 chars 그룹에서 임의로 선택되어 str 문자열에 추가됩니다. Random.Range(0, chars.Length) 함수는 0(포함)과 chars.Length(제외) 사이의 임의 정수를 생성하는 데 사용됩니다.
  5. 5. 마지막으로 루프가 끝나면 생성된 방 코드(str 문자열)를 반환합니다.

이 간단한 클래스를 사용하여 플레이어가 할당된 게임 룸에 쉽게 참여할 수 있도록 게임에서 고유하고 혼란스럽지 않은 룸 코드를 생성하는 데 사용할 수 있습니다.

게임 상태



게임 로직의 흐름과 동작은 GameState NetworkBehaviour에 의해 제어됩니다.
GameState는 네트워크로 연결된 StateMachine이 상태로 사용하는 게임 단계에 대한 열거를 정의합니다.
StateMachine은 onEnter, onExit 및 onUpdate의 3단계로 StateHooks 클래스를 정의합니다.
StateMachine 클래스를 사용할 때 열거된 각 상태에는 진입, 종료 및 업데이트될 때 발생하는 상황을 정의하는 StateHook가 있을 수 있습니다.






GameState.cs


이 코드의 주요 목적은 멀티플레이어 게임에서 게임의 다양한 상태를 관리하는 것 입니다 . 이 GameState클래스는 NetworkBehaviour를 상속하고 게임의 상태 전환을 제어합니다.

먼저 코드는 게임 전 (Pregame), 게임중 (Play), 회의 (Meeting), 투표 결과 (VoteResults), 크루 윈 (CrewWin), 임포스터 윈 (ImpostorWin)과 같은 게임의 다양한 상태를 나타내는 EGameState열거형을 정의합니다.

다음으로 현재 상태, 이전 상태, 지연 타이머 및 지연 상태를 포함하여 일부 변수가 클래스에 정의됩니다.

StateMachine 상태 전환을 관리하는 데 사용되는 인스턴스입니다. Spawned()함수에서 서로 다른 상태 사이를 전환할 때 동작이 설정됩니다. 예를 들어 Pregame 상태에 진입하면 각 플레이어의 위치와 상태가 초기화되고, Play 상태에 진입하면 플레이어는 임의의 초기 위치에 할당되고 임포스터(킬러)에게 작업이 할당되는 등이 있습니다.

FixedUpdateNetwork()기능은 각 네트워크에서 상태를 업데이트해야 하는지 여부를 확인하는 데 사용됩니다. 만약 서버이고 지연 타이머가 만료되면 상태가 업데이트됩니다. 클라이언트인 경우 수신한 상태 업데이트를 기반으로 로컬 상태를 업데이트만 하면 됩니다.

Server_SetState() 가능은 서버에서 새 상태를 설정하는 데 사용되며 Server_DelaySetState()이 함수는 지정된 지연 후 새 상태를 설정하는 데 사용됩니다. 이렇게 하면 투표가 발표된 후와 같이 게임의 중요한 순간에 플레이어가 다음 상태로 이동하기 전에 반응할 수 있는 충분한 시간이 주어집니다. 전반적으로 이 코드는 게임의 상태 전환을 관리하고 상태 변경에 따라 게임 세계를 업데이트하여 멀티플레이어 게임을 동기화 상태로 유지하는 데 사용됩니다.


프로세스 입력


PlayerInputBehaviour.cs 스크립트에서 네트워크 입력은 지속적으로 폴링되고 전송됩니다. 네이티브가 아닌 플레이어 입력을 제외하기 위해 입력 차단 및 필터링도 여기에서 수행되어 네이티브 플레이어 입력만 사용되도록 합니다. 또한 PlayerMovement.cs는 입력을 실행하기 전에 서버 측 검사를 수행합니다. 로컬 입력 폴링은 FixedInput.cs 클래스를 사용하여 수행됩니다.

PlayerInputBehaviour.cs

Fusion.Behaviour에서 상속하고 INetworkRunnerCallbacks 인터페이스를 구현하는 PlayerInputBehaviour의 카테고리를 정의합니다. 이 클래스는 플레이어 입력을 처리하고 게임의 네트워크 계층에 동기화하는 데 사용됩니다.

  1. 1. OnInput(NetworkRunner runner, NetworkInput input) 메서드는 플레이어에 입력이 있을 때 호출됩니다. 플레이어의 현재 상태와 게임 상태를 확인하고 키 상태를 기반으로 frameworkInput의 버튼 값을 설정합니다. 마지막으로 버튼 값을 입력에 다시 저장합니다.
  2. 2. OnInputMissing(NetworkRunner runner, PlayerRef player, NetworkInput 입력)은INetworkRunnerCallbacks 인터페이스를 구현하는 빈 메서드입니다.
  3. 3. 이하 나머지 메서드도 INetworkRunnerCallbacks 인터페이스에 필요한 빈 메서드이며 플레이어가 게임에 참여하거나 게임을 떠나거나 서버에 연결하거나 연결을 끊는 등의 특정 이벤트가 발생할 때 호출됩니다.
  4. 4. 카테고리에서 이러한 빈 메서드는 실제 작업 없이 인터페이스를 구현하는 데 주로 사용됩니다. 일반적으로 공식 게임은 필요에 따라 해당 문제를 처리하기 위해 적절한 프로그램을 추가합니다.

PlayerInputBehaviour 클래스는 플레이어 입력을 처리하고 게임의 네트워크 계층에 동기화하는 데 사용됩니다. INetworkRunnerCallbacks 인터페이스를 구현하면 특정 이벤트가 발생할 때 호출할 수 있습니다. 그러나 이 클래스에서는 플레이어 입력을 처리하는 데만 초점을 맞추고 있으므로 직접 empty 메소드를 사용하십시오.



플레이어


플레이어 동작은 PlayerObject, PlayerMovement, PlayerData의 세 가지 컴포넌트로 정의됩니다.

PlayerObject


이는 NetworkBehaviour에서 상속되는 PlayerObject 클래스이며 오브젝트와 연결된 PlayerRef에 대한 참조, 방에 있는 플레이어의 인덱스, 닉네임 및 선택한 색상을 포함하여 게임에서 플레이어를 나타내는 데 사용됩니다. PlayerObject는 Rpc_Kill 메서드를 호출하기 위한 진입점이기도 합니다.

  1. 1. PlayerObject 클래스 내에서 몇 가지 변수가 정의됩니다.
    로컬: 로컬 플레이어를 나타냅니다.
    Ref, Index, Nickname 및 ColorIndex: 플레이어의 기본 정보를 저장하고 Networked 속성을 사용하여 네트워크 동기화를 달성하는 데 사용됩니다.
    Controller, VoiceObject 및 KillRadiusTrigger: 플레이어 오브젝트에 필요한 컴포넌트 참조입니다.
  2. 2. Server_Init() 메서드: 이 메서드는 플레이어의 PlayerRef, 인덱스 및 색상을 설정하여 서버에서 플레이어 오브젝트를 초기화합니다.
  3. 3. Spawned() 메서드: 이 메서드는 플레이어 오브젝트가 생성될 때 호출됩니다. 먼저 기본 Spawned() 메서드를 호출한 다음 오브젝트의 StateAuthority 및 InputAuthority에 따라 플레이어 오브젝트를 설정합니다.
  4. 4. Rpc_SetNickname() 및 Rpc_SetColor() 메서드: 이 두 메서드는 플레이어가 네트워크에서 자신의 닉네임과 색상을 설정할 수 있도록 하는 원격 호출(RPC) 메서드입니다.
  5. 5. Rpc_Kill() 메서드: 플레이어 간의 살인 행동을 처리하는 데 사용되는 RPC 메서드입니다. 거리에 따라 죽일 수 있는지 여부를 판단하고, 그렇다면 죽은 플레이어를 죽은 상태로 설정하고 게임 장면에서 "죽은 플레이어 오브젝트"를 생성합니다.
    또한 킬에 대한 킬 타이머가 설정됩니다.
  6. 6. NicknameChanged() 및 ColorChanged() 메서드: 이 두 메서드는 Networked 변수에 대한 OnChanged 이벤트 핸들러입니다. 플레이어의 닉네임이나 색상이 변경되면 플레이어 오브젝트의 표시가 업데이트됩니다.

플레이어 이동


플레이어 이동 및 입력을 담당합니다. 또한 게임에 필요한 데이터 및 메서드, 특히 IsDead(죽음 여부), IsSuspect(의심 여부) 및 EmergencyMeetingUses(긴급 회의 사용) 속성이 포함되어 있습니다.

PlayerData


플레이어의 시각적 컴포넌트입니다. 주로 재질 처리, 속성 애니메이션 및 닉네임 UI 인스턴스화를 담당합니다.

인터렉티브 오브젝트


게임의 인터렉티브 오브젝트는 플레이어가 게임의 다양한 활동에 인터랙티브하고 참여할 수 있도록 도와줍니다.

Interactable.cs
NetworkBehaviour에서 상속되는 Interactable의 추상 카테고리를 정의합니다. 게임에서 플레이어와 인터랙티브할 수 있는 오브젝트를 정의하는 데 사용되는 기본 클래스입니다. 죽은 플레이어나 다른 게임 오브젝트와 같은 모든 대화형 오브젝트는 이 클래스에서 상속됩니다.

  1. 1. 두 개의 bool 변수인 InteractionInstant 및 isGhostAccessible이 정의됩니다. isInteractionInstant는 인터랙티브가 즉시 적용되는지 여부를 표시하는 데 사용되며
    isGhostAccessible은 고스트 플레이어가 오브젝트에 액세스할 수 있는지 여부를 표시하는 데 사용됩니다.
  2. 2. 플레이어가 오브젝트와 인터랙티브할 수 있는지 여부를 결정하는 데 사용되는 부울 변수인 추상 속성 CanInteract가 정의됩니다. 이 속성은 파생 클래스에서 구현되어야 합니다.
  3. 3. 오브젝트와 플레이어 간의 인터랙티브를 실현하는 데 사용되는 추상 메서드 Interact()가 정의됩니다. 이 메서드는 파생 클래스에서 구현해야 합니다.

Interactable 클래스는 플레이어와 인터랙티브해야 하는 게임의 오브젝트에 대한 통합 인터페이스를 제공하는 기본 클래스입니다. 개발자는 Interactable 카테고리를 상속하여 특정 오브젝트의 대화형 기능을 구현할 수 있습니다. Interactable은 추상 클래스이므로 개발자는오브젝트가 플레이어와 제대로 인터랙티브할 수 있도록 파생 클래스에서 CanInteract 속성과 Interact() 메서드를 구현해야 합니다.

컬러 선택:


대기실 룸 중앙의 테이블에 있습니다. 플레이어는 미리 설정된 12가지 색상 중에서 다른 플레이어가 선택하지 않은 색상을 선택할 수 있습니다.




설정 선택:


대기실 룸 상단에 있고 방주인이 게임 설정을 선택하고 플레이를 시작할 수 있습니다.

비상 버튼:


비상 버튼을 라운드할 때마다 제한된 횟수만큼 눌러 회의를 소집할 수 있습니다.

EmergencyButton.cs
이전에 정의된 Interactable 카테고리에서 상속되는 EmergencyButton 카테고리를 가리킵니다. EmergencyButton 클래스는 플레이어가 긴급 회의를 소집하기 위해 인터랙티브할 수 있는 게임 내 긴급 버튼을 나타냅니다.

  1. 1. Interactable 카테고리의 추상 속성 CanInteract가 구현됩니다. 이 클래스에서 조건은 로컬 플레이어가 살아 있어야 하고(PlayerMovement.Local.IsDead가 false임) 긴급 회의 수가 있어야 한다는 것입니다
    (PlayerMovement.Local.EmergencyMeetingUses > 0).
  2. 2. Interactable 카테고리에서 추상 메서드 Interact()를 구현했습니다. 이 클래스에서 플레이어가 비상 버튼과 인터랙티브할 때 Runner.LocalPlayer 및 null을 매개 변수로 전달하여 GameManager 인스턴스의 Rpc_CallMeeting() 메서드를 호출합니다. 이 null 변수는 특정 인터랙티브 오브젝트가 없지만 비상 버튼으로 시작된 회의임을 나타냅니다.

EmergencyButton 클래스는 게임에서 비상 버튼 기능을 구현하는 데 사용됩니다. Interactable 클래스를 상속받아 플레이어와의 상호작용 기능을 구현합니다. 플레이어가 비상 버튼과 인터랙티브하면 게임 내 긴급 회의가 트리거될 수 있습니다.

미션:


맵에는 14개의 미션 스테이션이 분산되어 있으며 크루가 완료할 수 있는 5개의 고유한 미션 미니 게임을 제공합니다.

시체:


살해당한 플레이어의 시신은 회의를 소집하는 크루나 흔적을 숨기려는 사기꾼이 자유롭게 신고할 수 있습니다.

DeadPlayer.cs
Interactable에서 상속된 DeadPlayer라는 카테고리를 정의합니다.
이 클래스는 게임에서 죽은 플레이어 오브젝트를 나타내며 죽은 플레이어와의 인터랙티브를 처리하는 데 사용됩니다.

  1. 1. 카테고리내에서 Renderer 유형의 배열 modelMeshes가 정의되며 죽은 플레이어 오브젝트의 색상을 저장하는 데 사용됩니다.
  2. 2. Networked 속성을 사용하여 PlayerRef를 동기화하고 OnRefChanged 이벤트 핸들러에서 Ref 변경 사항을 처리합니다.
  3. 3. Spawned() 메서드: 이 메서드는 오브젝트가 생성될 때 호출됩니다. 먼저 기본 클래스의 Spawned() 메서드를 호출한 다음 GameManager의 관리에 오브젝트를 추가합니다.
  4. 4. SetColour() 메서드: 이 메서드는 죽은 플레이어 오브젝트의 색상을 설정하는 데 사용됩니다. 새 재료를 인스턴스화하고 색상을 설정한 다음 modelMeshes의 모든 렌더러를 순회하고 색상을 해당 재료에 적용합니다.
  5. 5. OnRefChanged() 메서드: PlayerRef가 변경된 시점을 처리하는 정적 메서드입니다. PlayerRef가 변경되면 죽은 플레이어의 색상을 살아남은 플레이어와 동일하게 설정합니다.
  6. 6. Interact() 메서드: 죽은 플레이어 오브젝트와의 인터랙티브를 처리하기 위해 재정의된 메서드입니다. 플레이어가 죽은 플레이어와 인터랙티브할 때 GameManager 인스턴스의 Rpc_CallMeeting() 메서드를 호출합니다.
  7. 7. CanInteract 속성: 플레이어가 죽은 플레이어 오브젝트와 인터랙티브할 수 있는지 여부를 결정하는 재정의된 속성입니다. 로컬 플레이어가 살아있는 경우에만 죽은 플레이어 오브젝트와 인터랙티브합니다(IsDead는 false임).

이 클래스는 주로 게임에서 죽은 플레이어 오브젝트를 나타내는 데 사용되며 해당 오브젝트와의 인터랙티브를 처리합니다. Interactable 클래스를 상속받아 플레이어와의 상호작용 기능을 구현합니다. 플레이어가 죽은 플레이어 오브젝트와 인터랙티브하면 긴급 회의와 같은 게임의 해당 이벤트가 트리거될 수 있습니다.

・ ・ ・


미션(Task) 종류


지도에서 다양한 미션 스테이션을 찾을 수 있습니다. 크루는 범위 내에 있는 동안 인터랙티브할 수 있습니다.

온도 조정( TemperatureTask.cs )


위쪽 및 아래쪽 화살표를 눌러 두 숫자를 같게 만듭니다.

슬라이더( SlidersTask.cs )


각 슬라이더를 드래그하여 빨간색 윤곽선에 맞춥니다. 올바르게 배치되면 슬라이더가 잠깁니다.

패턴 일치( PatternMatchTask.cs )


오른쪽 패널의 버튼을 눌러 왼쪽 패널의 깜박이는 표시등 순서와 일치시킵니다.




번호 순서( NumberSequenceTask.cs )


최소에서 최대 번호 순서(1~10).






파일 다운로드( DownloadTask.cs )


다운로드 버튼을 누르고 진행 표시줄이 채워질 때까지 기다리면 작업이 완료됩니다.

미션 설명: 패턴 매칭 미니게임


지면 제약으로 인해 5가지 미니 게임 중 하나인 패턴 매칭을 예로 들어 설명하겠습니다. 다른 프로그램의 작성 구조도 비슷할 것입니다.

"Pattern Match"라는 게임의 작업인 PatternMatchTask.cs 프로그램을 직접 살펴보겠습니다. 이 작업에서는 플레이어가 표시된 패턴(색상 및 톤 조합)으로 버튼을 반복해야 합니다. 아래는 각 부분에 대한 자세한 설명입니다.

클래스 선언:


이 코드는 TaskBase를 상속하여 게임 내 작업임을 나타내는 PatternMatchTask라는 클래스를 정의합니다.

변수 및 속성:


● pitches: 합계 9의 피치의 값을 나타내는 부동 소수점수의 배열.
● Name: 기본 클래스의 속성을 재정의하고 "패턴 일치"인 작업 이름을 반환
● patternStageLights, patternSquares, matchStageLights와 같은 UI 관련 변수는 matchButtonsUI를 저장하고 제어하는 ​​데 사용
● stageLightOff, stageLightOn, patternSquareOff, patternSquareOn와 같은 색상 변수는 patternSquareWrong색상을 설정하는 데 사용
● pattern및 match: 모드 및 플레이어의 입력을 저장하는 데 사용

방법: (달성하기 위해 다양한 Coroutine 이 사용됨)


● ResetTask(): 작업을 재설정하고 모든 UI 요소와 변수를 초기 상태로 복원하고 적절한 경우 디스플레이 모달 코루틴을 시작합니다.
● OnEnable(): 객체가 활성화되면 디스플레이 모드 코루틴을 시작합니다.
● ShowPattern(): 표시 모드에 사용되는 코루틴. 표시 중에 임의의 숫자가 패턴에 추가되고 해당 표시 요소 색상 및 톤이 재생됩니다. 표시가 완료되면 버튼을 활성화하여 플레이어 입력을 허용합니다.
● PressMatch(int index): 플레이어가 버튼을 누를 때 호출되는 메서드입니다. 플레이어의 입력을 match목록 하고 입력이 올바른지 또는 작업이 완료되었는지에 따라 해당 코루틴을 시작합니다.
● WrongInput(): 플레이어 입력 오류를 처리하는 데 사용되는 코루틴. 오류 메시지가 끝나면 미션을 재설정하십시오.
● DelayCompleted(): 작업이 완료된 후 지연하는 데 사용되는 코루틴. 지연 시간이 지나면 Completed()메서드를 호출합니다.

따라서 이 PatternMatchTask클래스는 "패턴 일치" 라는 작업을 구현합니다 . 플레이어는 게임에서 표시되는 패턴(색상 및 톤 조합)에 따라 버튼을 눌러야 합니다. 이 클래스에는 게임 작업 및 UI 인터랙티브의 논리를 실현하기 위한 일련의 변수, 속성 및 메서드가 포함되어 있습니다.

패턴매칭( 태스크 미니게임) 과정은 다음과 같습니다.


  1. 1. 게임 표시 패턴: 게임은 임의의 패턴을 생성하여 플레이어에게 표시합니다. 패턴은 색상과 톤으로 구성됩니다.
  2. 2. 플레이어 입력: 패턴이 표시되면 플레이어는 표시된 패턴에 따라 버튼을 눌러야 합니다.
  3. 3. 입력 확인: 게임은 플레이어의 입력이 패턴과 일치하는지 확인합니다. 그렇지 않으면 게임에 오류 메시지가 표시되고 미션이 다시 시작됩니다. 동일하면 게임은 지정된 길이(이 경우 5)에 도달할 때까지 새 패턴을 계속 표시합니다.

지정된 길이에 도달하면 게임은 작업이 완료된 것으로 간주하고 DelayCompleted()코루틴을 하고 마지막으로 Completed()메서드를 호출합니다.

이 클래스는 게임 미션의 주요 로직을 다루고 Unity 및 Fusion 관련 UI 요소와 인터랙티브하여 플레이어에게 시간 제한이 있는 도전적이고 흥미로운 게임 경험을 제공합니다.

그리고 이러한 상태는 다른 플레이어와 동기화할 필요가 없기 때문에 로컬에서만 실행되므로 코루틴을 직접 사용하는 것이 매우 편리하고 효과적입니다.


・ ・ ・



음성:


Fusion Impostor는 Photon Voice SDK v2에서 제공하는 두 가지 프로그램을 사용하여 음성 기능을 구현하며 사용법은 다음과 같습니다.

FusionVoiceNetwork를 PrototypeRunner.prefab에 추가합니다 .
● 플레이어 프리팹( Player.prefab )의 VoiceNetworkObject를 지정된 프리팹의 자식으로 스피커와 함께 사용합니다.


VoiceNetworkObject.cs 설명:


Fusion.NetworkBehaviour 에서 상속된 VoiceNetworkObject카테고리를 정의합니다.

클래스는 Recorder및Speaker 컴포넌트 (각 플레이어 음성 녹음 및 재생을 처리함)와 같은 게임에서 Photon Voice 관련 컴포넌트를 설정하고 관리하는 데 사용됩니다 . 이 카테고리를 통해 게임 내 플레이어는 음성 채팅 기능을 사용할 수 있습니다.


이 예제에서와 같이 게임을 개발하는 동안 개발자는 VoiceNetworkObject를 음성 기능이 필요한 게임 오브젝트에 직접 추가하고 필요에 따라 해당 Recorder 및 Speaker 그룹을 구성할 수 있습니다. 이런 방식으로 플레이어는 게임 내 음성 채팅 기능을 사용하여 다른 플레이어와 실시간으로 통신할 수 있어 인터랙티브성과 게임에 대한 몰입감이 향상됩니다.


・ ・ ・



요약


이 기사에서는 Fusion Impostor 게임 예제를 소개 하고 몇 가지 중요한 핵심 아키텍처와 간단한 응용 사례를 설명했습니다. 온라인 프로그래밍의 고급 사용자라면 이 예제에 익숙해지는 과정에서 온라인 게임 개발을 위한 Fusion SDK 사용에 대해 더 깊이 이해하게 될 것이라고 믿습니다.

이 예제는 Fusion SDK 및 Photon Voice SDK를 소개하고 있고 Photon 제품에 익숙하지 않은 개발자에게는 약간의 혼란이 있을 수도 있지만 가이드 및 기술문서와 함께 읽는 것을 권장합니다.



출처 : Hu씨의 Photon 블로그 이야기(대만)