지원 시스템

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

우리는 다음 시스템을 사용하여 기본 게임 시스템 과 주요 디자인 요구 사항 의 모든 목표를 지원했습니다..

사용 관리자

UseManager 는 간단한 API를 제공하여 캡처된 개체를 옷 조각처럼 마네킹에 적용했습니다.이 API의 주요 기능은 (태그, 대상 개체, 거리, onSuccess, onNothingEquipped, onWrongEquipped, 추가 데이터)로, 태그 집합을 대상 개체 에 바인딩합니다.플레이어가 태그 중 하나와 함께 개체를 가지고 있고 대상 개체를 클릭하면 성공 콜백 함수가 호출됩니다.다른 호출 기능을 사용하면 플레이어에게 클릭하지만 잡은 아이템이 없거나 잘못된 유형의 아이템으로 클릭하는 경우 추가 시각적 정보를 표시할 수 있습니다.

미션이 완료되거나 특정 아이템이 "사용"되었을 때 일반적으로 도움이 되는 "사용"을 UseManager.RemoveUse로 제거할 수 있었습니다.또한, AddUseTargetsRemoveUseTargets 로 대상을 추가하거나 제거할 수 있습니다.

하이라이트

플레이어가 해양 생물과 같은 관심 항목 근처에 있을 때, 해당 항목이 주변 환경과 돋보이게 하고 싶었습니다.이를 구현하기 위해 우리는 플레이어 주위의 구체를 중심으로 하는 LocalScript 라는 이름의 하이라이트 아이템 을 만들어 다른 메쉬와 터치를 감지하고 연결하는 TouchedTouchEnded 이벤트에 연결했습니다.getHighlight 함수는 터치된 메시 또는 부모의 여러 태그를 GetTaggedObjectUpHierarchy 도우미 함수를 사용하여 확인합니다.어떤 하이라이트도 필요하지 않다면, 하이라이트 없음 태그를 사용하여 강제로 제거할 수 있습니다.그러나 다양한 다른 태그에 맞지 않지만 필요한 경우 중요 태그를 사용하여 강제로 적용할 수 있습니다.

LocalScript 새로운 엔진 기능 Highlight 을 사용하여 개체의 개요를 그리거나 개체의 내부를 정의된 색으로 채우는 기능을 사용하여 자세한 정보는 참조하십시오 개체 강조 표시 .Highlights 및 마우스 커서 OnItemIndicator 시스템은 함께 작동하므로 Highlights 메쉬에 하이라이트가 필요한지 여부를 결정하는 것뿐만 아니라 메쉬 유형도 제공합니다 OnItemIndicator 에 대해.

HighlightItemsFunc는 다른 클라이언트 시스템과 통신하는 데 사용됩니다.예를 들어, 이벤트 관리자는 특정 컷신에서 활성화 명령을 사용하여 활성화하거나 비활성화하기 위해 그것을 사용하며, Highlight에 대해 조사하기 위해 GetType를 사용합니다.부패한 방이 파괴될 때와 같이 아이템이 더 이상 존재하지 않는지 감지하려면 CollectionService.GetInstanceRemovedSignal에 연결합니다.

로어 및 생각 거품

로어생각 거품 은 2개의 유사한 시스템입니다.로어는 화면에서 UI 컨테이너로 를 사용하여 자녀의 크기 조정과 크기 조정을 제어하고, 로어는 플레이어가 화면의 어딘가를 클릭하여 제거하기를 기다립니다.마찬가지로, 생각 거품은 자식 BillboardGui 을 사용하여 비로어 개체에 대해 TextLabel 를 3D 공간에 표시하고, 텍스트가 전체 화면을 차지하지 않고 지정된 기간과 쿨다운 기간 동안 개체 근처에서 대화를 표시합니다.이러한 시스템의 디자인에 대한 자세한 정보는 로어생각 거품을 참조하십시오.

지식은 LoreManger 에 구현됩니다. LocalScript .클릭하거나 터치하면 도우미 함수 utils.RaycastAlongPointingDir 를 사용하여 레이캐스트를 발사하고 그룹 NoPlayerCollision 을 사용합니다.클릭 아래 또는 부모 중 하나의 메시에 로어 또는 생각 거품 태그가 있으면 UI를 표시합니다.텍스트, 캡션 및 이미지는 개체의 LoreText, LoreCaption 및 LoreImage 특성에 의해 정의됩니다.

터치하지 않거나 터치하는지 여부에 따라 레이를 생성하기 위해 Camera.ViewportPointToRay 또는 Camera.ScreenPointToRay 를 사용한다는 점에 유의하십시오.좌표가 약간 다른 좌표 시스템에 있습니다.마우스의 경우, MouseButton1에 대해 Class.UserInputService.InputEnded``:Connect에서 가져오고, 터치 장치의 경우 Class.UserInputService.TouchTapInWorld``:Connect에서 가져옵니다.

생각 거품은 전체적으로 비슷하며, 레이캐스트를 사용하여 메쉬 또는 부모가 생각 거품 태그를 가지고 있는지 확인합니다.또한 텍스트에는 생각 텍스트 특성을 사용하고, 세계에서 UI를 배치하는 데 사용되는 자리 표시자 개체를 가리키는 생각 거품 태그를 사용합니다.동일한 위치 개체를 사용하지만 텍스트가 다른 생각 거품은 다른 쿨다운 시간을 가집니다.

특별 사례

로어에는 특별한 경우가 몇 가지 있는데, 그 중 하나가 손상된 물범입니다.플레이어가 손상된 인장을 클릭하면 유물 인터페이스가 표시되고 클릭을 기다려 게임 흐름에 영향을 미치는 미션을 시작합니다.이는 바인더블 을 사용하여 로어 UI를 요청하는 에 의해 처리됩니다.Lore 시스템에 플레이어가 Lore를 "닫을" 때를 알기 위해 GameStateClient에서 콜백이 제공됩니다.또 다른 특별한 경우는 생각 거품지식 태그가 동일한 개체에 있을 때입니다.이 경우 지식과 생각 거품 텍스트의 겹치기를 피하기 위해 지식이 닫힌 후에 생각 거품을 실행합니다. LoreManager 는 플레이어가 방의 봉인을 열 때까지 비활성화된 문을 클릭하면 작은 컷신을 표시하는 특별한 경우도 처리합니다.

아이템 표시기 OnItemIndicator

플레이어가 특정 관심 항목을 보고 있을 때 화면 중앙에 다른 아이콘을 표시하고 싶습니다.클라이언트 스크립트 OnItemindicator는 카메라 길을 따라 레이캐스트를 수행하고 결과를 분석합니다.결과에 따라 OnItemIndicator2 ScreenGui

관심 항목이 없을 때 기본 아이콘은 작은 점입니다.We could set any icon by adding an OnItemIndicator string attribute to a specific mesh, using the names from onItemIndicatorImages , such as Hand, Eye, or DoorCurrentlyLocked.특성은 드문 경우에만 필요하며, 대부분의 시간 다른 기존 태그나 시스템이 아이콘의 유형을 제공합니다.자세한 내용은 Update 함수를 참조하십시오.

우선 순위 순서에서 일부 형식 검사를 수행합니다.OnItemIndicator 재정의 후, 우리는 utils.CanGrabModel(model) 또는 utils.GetTaggedObjectUpHierarchy("Drawer2", model) 을 통해 "손" 아이콘을 잡을 수 있는지 또는 서랍인지 확인합니다.그 후, 하이라이트 상태, 아이템 유형 및 사용할 아이콘을 결정하는 를 호출합니다.예를 들어:


highlightItemsFunc:Invoke({"GetType", curInst})

Lore 및 ThoughtBubble 태그는 태그를 확인하여 나중에 확인됩니다.문의 경우, 2개의 다른 아이콘이 있습니다: DoorCurrentlyClosedDoorAlwaysLocked .DoorManager > 은 열거나 닫을 수 있는 문에 대한 true 또는 false DoorEnabled 특성을 설정하고, 특성의 존재와 값을 사용합니다.문처럼 보이지만 열리지 않는 개체에는 DoorLocked 태그가 있습니다.

도어 관리자

문 관리자 는 문 태그와 문 닫기를 사용하여 문을 열고 닫도록 관리합니다.문에는 터치하고 touchEnded 이벤트로 연결하는 앞쪽과 뒷면 트리거가 있습니다.십대를 만들어 앞과 뒤 측면에서 문을 열고 닫았습니다.우리는 플레이어 가까이 맵 (플레이어가 트리거를 만지는 것, 앞과 뒤에 각각 별도로)을 유지합니다.

각 문에는 간단한 상태 시스템이 있습니다, DoorState (닫힘, 열림, 열림, 닫힘), 십대가 전환에 사용됩니다.외부 시스템에서 문을 열거나 닫을 수 있는 기능을 활성화하거나 비활성화하려면 DoorManager.EnableDoor를 호출하여 DoorEnabled 특성을 설정할 수 있습니다.

주 애니메이터

마스터 애니메이터(MasterAnimator)는 TV 화면을 애니메이션화하기 위해 사용하는 애니메이션 이미지(텍스처 아트라스)를 재생합니다.이미지를 스크롤하려면 행 및 열 수, 총 프레임, 기간, 이미지 크기 및 이미지 ID 집합을 알아야 했습니다.시스템은 여러 이미지에 걸쳐 애니메이션을 허용하며, 각각 부분 이미지의 행과 열로 분할될 수 있습니다.특성이나 값을 통해 이 데이터를 제공할 수 있지만, 이 경험에서는 도우미 스크립트를 사용했습니다.UpdateImageAnimations(dT) 시간과 매개변수를 사용하여 표시해야 하는 이미지나 하위 이미지를 계산합니다.새 이미지로 변경해야 하는 경우 Image를 설정합니다.하위 이미지를 변경해야 하는 경우 ImageRectOffset 을 설정합니다.

Animated SurfaceGui 가 있는 개체에는 Animator ModuleScript 가 있으며, 주요 목적은 모든 매개변수를 반환하는 Animator.GetParams 함수를 제공하는 것입니다.이것은 이미지 애니메이션 태그와 및 을 사용하는 마스터 애니메이터가 이러한 개체를 수집하고 애니메이터 아래에서 찾도록 도와줍니다.그런 다음 pcall을 사용하여 애니메이터 ModuleScript 를 요구하고 그에 대해 호출 GetParams 합니다.

로컬 공간 애니메이션

LocalSpaceAnimations 은 X, Y 또는 Z축 주변에서 회전 속도와 지연이 주어진 주로 "미용" 개체를 회전하기 위해 LocalSpaceRotation 태그를 사용합니다.플레이어가 상호작용하지 않을 먼 개체 또는 시뮬레이션에 큰 영향을 주지 않는 작은 개체에 이것을 사용했습니다.Speed , DelayAxis 값을 통해 정의된 매개변수.구현 세부 정보는 클라우드 메쉬 회전을 참조하십시오.

헤드램프 매니저

헤드램프 매니저 사용자가 화면에서 스포트라이트를 켜거나 끄기 위해 선택하면, 헤드램프 이벤트를 사용하여 서버에 코멘트를 발사하고, 스위치 사운드를 켜고 끄는 플레이트를 처리합니다.캐릭터가 추가되거나 그들의 가 변경될 때, 함수는 템플릿헤드램프 램프를 복제하고, 얼굴 앞면 부착물의 일부 오프셋과 회전을 사용하여 램프의 위치를 변경합니다.

시트 관리자

플레이어가 앉을 수 있는 개체 근처에 있을 때 자동으로 앉도록 하지 않습니다.대신, 사용자가 앉기 위해 의자 근처를 클릭하도록 요구하고 싶습니다.SeatManager 스크립트는 Seat 태그를 기반으로 추가 및 클릭 시 호출 합니다.방의 정상 상태와 부패 상태 사이에서 플레이어를 순간이동할 때, CFrame 좌표 변경이 작동할 수 없으므로 플레이어가 앉아 있을 수 없으므로 SeatManager 에는 순간이전 몇 초 전과 후에 좌석을 비활성화하거나 활성화할 수 있는 기능이 있습니다.

서랍 관리자

서랍 관리자 스크립트는 서랍2 태그와 를 사용하여 서랍을 클릭하여 열거나 닫고, 해당 오디오를 재생하도록 처리합니다.열기 및 닫기 작업은 PrismaticConstraint 에 대한 대상 위치를 설정하여 수행됩니다.

킬 볼륨

주요 게임 플레이 영역의 일부 영역(전기 스파크 및 집으로 가는 길의 초반에 있는 물)에서는 플레이어가 Humanoid.Health 설정을 0 로 변경할 수 있으며, 킬볼륨 태그로 볼륨에 들어갈 때 플레이어의 설정이 변경될 수 있습니다. 킬볼륨 스크립트는 플레이어가 볼륨에 들어갈 때를 결정하기 위해 Touched:Connect 를 사용하고 그들의 체력을 0 으로 줄입니다.

플레이어 미션 리스폰

플레이어 미션 재생성 스크립트는 RespawnVolume 태그와 를 사용하여 플레이어가 만질 때 재생성되는 볼륨을 처리합니다.많은 미션에서 플레이어가 떨어질 수 있는 공백이나 이동 플랫폼이 있기 때문에 이러한 볼륨을 부패한 방에 배치했습니다.터치되면 스크립트는 작은 텔레포트_점프 컷씬을 재생하고 명령으로 호출합니다.

처리할 때 GameEvents.PlayerRespawn , 스크립트는 미션 구성이 제공하는 경우 RespawnPositions 를 사용할 수 있습니다.그렇지 않으면 특정 임무에 대해 TeleportPositions를 사용합니다.우리는 "검문소" 시스템을 가지고 있지 않으므로 는 플레이어가 타격한 리스폰 또는 텔레포트 지점 중 가장 가까운 것을 선택합니다, 단일 수평 및 "2D" 거리를 사용하여.

작은 도우미 시스템

피아노 매니저

피아노 관리자 스크립트는 피아노 태그와 을 사용하여 키보드를 클릭할 때 추가 플레이 및 피아노 소리 중 하나를 재생합니다.

의식 지원

플레이어가 정의된 위치에 배치하는 마다 변경되는 복잡한 장비가 있는 로비가 있습니다. The foyer where players place seals has a complicated contraption that undergoes changes as each seal is placed in its defined location.예를 들어, 배치된 물범의 수에 따라 특정 이벤트가 플레이되어 조명과 광선을 활성화하거나 비활성화하고, 특정 개체의 투명도를 변경하는 등합니다. 의식 지원 은 특정 인장에 따라 재생할 "루트 개체"를 제공하는 작은 래퍼로, 이벤트에 매개변수를 제공하여 해당 이벤트를 호출합니다.

복원 가능한 관리자

일부 가져올 수 있는 개체는 물범과 같이 게임 플레이중요하며, 플레이어가 어딘가에 떨어뜨렸을 경우 길을 잃지 않도록 하고 싶었습니다.개체에 복원 가능 태그가 있으면, 복원 관리자 스크립트는 복원 시스템에 추가될 때 변환을 기억합니다.플레이어가 그러한 개체를 드롭할 때, 획득 시스템은 restorableManager.StartTracking를 호출합니다.개체가 5초 후에 다시 선택되지 않으면 RestorableManger 스크립트가 원래 변환에 배치하고 추적 시간을 재설정합니다.

포털

몇 가지 임무에서 우리는 회전 플랫폼에서 떨어지는 플레이어 재생성과 같은 임무 내에서 플레이어를 짧은 거리로 순간이동합니다.스크립트에서 "포털"이라고 하는 이러한 유형의 순간 이동 설정을 간소화하기 위해, ProcessPortal에 있는 도우미 함수 **** 가 사용됩니다.예를 들어, P1이 초기 트리거를 정의하는 부품이고 P2가 대상 플레이어 변환을 정의하는 부품이면 다음 코드 스니펫이 해당 포털 기능을 정의할 수 있습니다.


P1.Touched:Connect(function(otherPart) utils.ProcessPortal(otherPart, P2) end)

프로세스 포털 은 다른 파트가 인간인지 확인하고, 플레이어를 CFrame 좌표 변경을 통해 순간이동하고, Teleport_Jump 이벤트를 사용하여 전환을 숨기기 위한 소규모 컷신을 호출합니다. 이벤트 관리자에서.

구성 스크립트

여러 구성, 데이터 정의 및 일반 기능 스크립트가 있습니다: DemoConfig . 미션의 정의. 게임 상태에 대한 열거형, 클라이언트-서버 통신에 대한 이벤트. DemoGlobalSettings 입니다.하나의 장소에서 개발하지만, 다른 플레이스릴리스(및 플레이테스트)합니다.스크립트는 placeID를 확인하고 다양한 치트와 디버깅 기능을 활성화/비활성화합니다. 데모 도구 .다양한 유틸리티 기능.변환 처리.가시성 설정, 고정 또는 기타 속성.상자에서 지점을 확인하는 중.도트 이름으로 계층에서 개체 찾기.임시 저장소(일시적으로 모델을 "멀리 어딘가"로 이동하고 나중에 되돌릴 수 있음)를 관리하는 작업(Managing TempStorage (that can be used to temporarily move models "somewhere far" and bring back later))클릭 탐지기 도우미를 클릭합니다.지원 잡기.태그 확인(특히 계층 아래로)을 지원합니다.트리거를 이벤트 관리자에 연결하는 중. AudioUtils . 설정무게 있는 랜덤 소리를 재생하는 몇 가지 함수. GrabUtil . 잡기를 위한 도우미 함수.