Food Fusion
개요
Food Fusion은 Fusion 공유 모드를 사용하는 협력 파티 요리 게임의 샘플입니다. 플레이어는 만료되기 전에 만들어서 서빙해야 하는 일련의 주문을 받습니다. 이 샘플은 캐릭터 커스터마이제이션, 지속적인 씬 객체, 객체 인스턴스화, 권한 전송, TRSP 사용, 플레이어의 비파괴적 연결 해제 및 강력한 상호작용 및 제작 구현을 시연합니다.
시작하기 전에
샘플을 실행하려면 먼저 PhotonEngine 관리 화면에서 Fusion AppId를 생성하고 이를 Photon App 설정 (Tools/Fusion/Realtime Settings)의 App Id Fusion
필드에 붙여 넣으세요. 게임을 플레이하려면 Preloader
씬에서 게임을 시작하세요.
다운로드
버전 | 릴리즈 일자 | 다운로드 | |
---|---|---|---|
2.0.2 | Oct 23, 2024 | Food Fusion 2.0.2 Build 714 |
주요 기능
- 객체의 공유 상태 권한
- 게임 플레이 중 참여 및 이탈 가능
- 플레이어 닉네임/색상 선택
- 확장 가능한 일반 상호작용 시스템
- 확장 가능한 재료 및 레시피 구조
객체
요리 시스템은 객체와 행동 간의 관계를 설명하기 위해 스크립터블 오브젝트를 사용합니다. 이 시스템의 중심이 되는 객체 유형은 ScriptableObject 컴포넌트와 NetworkObject를 가지고 있습니다. 모든 NetworkObject는 해당하는 ScriptableObject의 대응물을 Data
라는 필드에서 참조합니다. 마찬가지로, ScriptableObjects는 해당하는 NetworkObject가 있는 프리팹을 참조합니다.
재료
재료는 시스템의 기초이며, 원형 또는 가공된 형태를 나타낼 수 있으며, 레시피의 일부일 수도 있고 아닐 수도 있습니다. 특히, 원형 토마토는 재료이지만, 유용하게 사용되기 위해서는 가공이 필요합니다. 마찬가지로, 태운 음식도 재료이지만, 과도하게 가공되어 더 이상 유용하지 않습니다.
IngredientData : ScriptableObject
UI에서 표시될 아이콘(Sprite
)을 참조합니다.
참조하는 곳: FoodProcess
, Recipe
Ingredient : NetworkObject
Ingredient는 ProcessedAmount
라는 네트워크 속성을 가지고 있습니다. 모든 재료가 이를 사용하는 것은 아니지만, 자르기 및 요리와 같은 과정에서 얼마나 진행되었는지를 추적하는 데 사용됩니다.
식품 가공기
식품 가공기는 재료 변환을 위해 필수적입니다. 캐릭터 또는 가전제품에 의해 사용됩니다. 식품 가공기의 사용 방법은 FoodProcess
자산에 정의되어 있습니다. 가전제품과 연관되는지 여부는 ApplianceData
자산에 의해 결정됩니다.
FoodProcessorData : ScriptableObject
참조하는 곳: ApplianceData
, FoodProcess
FoodProcessor : NetworkObject
가전제품
가전제품은 대응하는 식품 가공기에서 재료를 처리하는 자율 상호작용 장치입니다. 가전제품은 각 틱마다 식품 가공기와 상호작용을 시도합니다. 가전제품은 정확히 하나의 유형의 식품 가공기와 연관되어야 합니다.
ApplianceData : ScriptableObject
가전제품과 사용할 수 있는 FoodProcessorData
를 참조합니다.
Appliance : NetworkObject
식품 가공
식품 가공(FoodProcess.cs
)은 하나의 재료를 다른 재료로 변환하는 과정을 설명하는 스크립터블 오브젝트입니다. 식품 가공은 입력 재료, 출력 재료, 사용될 식품 가공기 및 과정이 완료될 때까지의 틱 수로 정의됩니다.
연관된 시스템은 ProcessGraph
입니다.
레시피
레시피는 필요한 재료와 선택적인 재료로 구성됩니다. 어떤 재료를 혼합할 수 있는지를 결정합니다. 또한 주문을 생성할 때 사용됩니다.
연관된 시스템은 IngredientGraph
와 OrderMenu
입니다.
상호작용
게임 상태를 변경하는 거의 모든 것은 상호작용 또는 상호작용 체인에서 시작됩니다. 여기에는 객체를 집고 놓기, 재료 가공, 주문 제출 등이 포함됩니다. 이러한 상호작용은 다양한 프리팹에 배치되고 Interactable
컴포넌트에 의해 참조됩니다. 이 컴포넌트는 플레이어가 제공할 수 있는 상호작용 유형을 위한 두 그룹, "Grab"과 "Use"를 가지고 있습니다. 이 목록의 순서는 우선순위를 결정합니다. 한 번에 하나의 상호작용만 트리거 되므로 우선순위가 중요합니다.
특별한 "위임" 상호작용은 자체적으로 특정 동작이 없지만, 대신 다른 객체에 상호작용 신호를 보냅니다.
시스템
게임 루프의 작동을 뒷받침하는 여러 시스템이 있습니다.
AssemblyMap
AssemblyMap은 AssemblyVisuals를 집계하고 특정 재료 세트에 대한 구성 객체 및 스프라이트를 제공합니다.
사용처: FoodContainer
, FoodOrderItemUI
IngredientGraph
IngredientGraph는 모든 레시피를 평가하고 주어진 재료가 어떤 레시피의 일부인지, 주어진 재료가 재료 세트와 호환되는지를 결정하는 메서드를 제공합니다.
사용처: FoodContainer
ProcessGraph
ProcessGraph는 FoodProcesses를 소비하고 FoodProcessor와 Ingredient가 호환되는지 여부, 결과 재료가 무엇인지 및 가공에 몇 틱이 소요되는지를 알려줍니다.
사용처: FoodProcessor
, ProcessFoodInteraction
ResourceBank
ResourceBanks는 키가 네트워크를 통해 ScriptableObjects를 식별하는 데 사용되는 상호 보완적인 키-값 및 값-키 사전 세트를 형성합니다. ResourceBank는 프로젝트의 모든 IngredientData ScriptableObjects를 참조하는 Ingredient Bank를 통해 프로젝트에 구현됩니다.
OrderMenu
OrderMenu는 사용 가능한 레시피 모음으로 초기화되며, 레시피에서 선택한 임의의 선택적 재료를 사용하여 주문을 구성하는 유효한 재료 세트를 제공합니다.
권한 관리
사용자 정의 동작인 AuthorityHandler
는 상태 권한 전송에 사용됩니다. 이는 RequestStateAuthority
호출을 래핑하고, 상태 권한을 획득할 때 제공된 콜백을 호출합니다.
컴포넌트가 있는 객체에 대한 권한을 요청할 뿐만 아니라, 모든 자식 AuthorityHandler
도 권한을 요청합니다:
C#
public void RequestAuthority(System.Action onAuthorized = null)
{
// [...]
Object.RequestStateAuthority();
foreach (var authHandler in Object.GetComponentsInChildren<AuthorityHandler>()) authHandler.Object.RequestStateAuthority();
onAuthorityChanged = onAuthorized;
}
public override void FixedUpdateNetwork()
{
if (onAuthorityChanged != null)
{
onAuthorityChanged();
onAuthorityChanged = null;
}
}
디버깅
어떤 플레이어가 어떤 객체에 대한 권한을 가지고 있는지를 확인하는 유틸리티가 포함되어 있습니다. 이는 게임 씬의 메인 카메라 게임 오브젝트에서 ViewAuthority
컴포넌트를 활성화하여 토글 할 수 있습니다.
상태 권한이 유효한 플레이어인 객체는 플레이어가 선택한 색상으로 윤곽이 표시됩니다. 상태 권한이 연결이 끊긴 플레이어인 객체는 회색으로 윤곽이 표시됩니다.
Back to top
ViewAuthority
는 화면에 명령을 그리는 역할을 하는 다른 컴포넌트인Glint
에 의존합니다.ViewAuthority
가 작동하려면Glint
가 카메라 객체에 있어야 합니다.