스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
플러그인 및 플레이: Unity 게임 프로젝트에 Apple 프레임워크 추가
여러분의 Unity 앱 또는 게임이 Apple 플랫폼에서 더 우수한 경험을 선사할 수 있도록 도와주세요. Apple.Core, Game Center, Game Controller, Accessibility, Core Haptics 및 PHASE라는 여섯 가지 플러그인을 통해 여러분의 프로젝트에 Apple 기술을 직접 추가하는 방법을 알아보세요. 새로운 게임플레이 메커니즘을 추가하고, 게임을 더 손쉽게 이용할 수 있게 하며, 최신 Apple 기능과 서비스를 활용할 수 있는 방법을 보여드리겠습니다.
리소스
- Accessibility
- Apple Unity Plug-Ins on GitHub
- Delivering Rich App Experiences with Haptics
- Game Controller
- Human Interface Guidelines: Game Center
- PHASE
관련 비디오
WWDC23
WWDC22
WWDC21
- 오디오 햅틱 디자인 실습
- Discover geometry-aware audio with the Physical Audio Spatialization Engine (PHASE)
- Tap into virtual and physical game controllers
WWDC20
-
다운로드
♪ 부드러운 힙합 음악 ♪ ♪ 안녕하세요, Jared Marsau입니다 Apple Game Technologies 소속이죠 오늘 저는 여러분께 Apple 프레임워크를 써서 Unity 기반 게임에 새로운 기능을 추가하는 방법을 알려 드리고자 합니다 많은 분이 Unity 같은 도구를 써서 게임을 만드실 텐데요 저희의 목표는 여러분이 어떤 도구를 사용하든 최신 기능을 제공하는 것입니다 오늘부터 새로운 Unity 플러그인 집합으로 게임을 향상시키세요 플레이어 인증, 리더보드 메치메이킹과 같은 GameKit 기능을 추가하려면 Game Center 플러그인을 쓰세요 MFi 및 서드파티 컨트롤러 지원과 사용자화 및 글리프 입력에는 Game Controller 플러그인을 사용하시고요 VoiceOver와 Dynamic Type 같은 시스템 기능의 접근성을 향상하려면 Accessibility 플러그인을 사용하시면 됩니다 Apple의 풍부한 데이터 기반 햅틱 피드백 시스템을 접목하려면 Core Haptics 플러그인을 사용하세요 고급 지오메트리 인식 공간 오디오를 추가하려면 PHASE 플러그인이 필요합니다 끝으로 Apple.Core 플러그인으로 빌드 설정을 관리하고 빌드 과정을 단순화할 수 있습니다 이 초기 플러그인 집합을 사용하면 새로운 게임 역학을 추가하고 게임 접근성을 향상시키며 최신 기능과 서비스를 보다 신속하게 이용할 수 있습니다 새로운 Unity 플러그인 집합으로 여러분이 만들 놀라운 게임을 하루빨리 보고 싶군요 이제 이 프로젝트의 자세한 사항으로 넘어가죠 먼저 본 프로젝트의 설계 원리를 논의하고 그 다음엔 프로젝트의 개념과 구성을 다루겠습니다 그 후에 프로젝트 리파지토리에 상호 작용하는 핵심 포인터 몇 가지를 소개한 다음 각 플러그인을 자세히 살피면서 마무리하겠습니다 아시는 분도 있겠지만 Apple 프레임워크는 기능을 모듈 방식으로 캡슐화합니다 이렇게 하면 코드를 간결하고 효율으로 유지하면서 앱에 알맞은 기술을 고르고 선택할 수 있죠 Unity 플러그인도 비슷한 양상을 보이는데요 각 플러그인은 단일 기본 프레임워크를 매핑하죠 이를 통해 게임의 요구에 따라 사용할 플러그인 집합을 고르고 선택할 수 있습니다 각 플러그인은 C# 기반 Unity 스크립트를 표시해 기본 프레임워크에 최대한 직접적으로 매핑합니다 이렇게 하면 기본 프레임워크에 쓸 수 있는 모든 친숙성이 플러그인으로 전달되죠 개념과 여러 프레임워크 API는 직접 전달됩니다 역으로, 이는 플러그인을 익히는 것으로 자연스럽게 기본 프레임워크를 익힌다는 말도 됩니다 또 다른 중요한 사항은 이러한 플러그인이 Apple 플랫폼 네이티브 라이브러리로 구축된다는 것입니다 이러한 라이브러리는 C# 스크립트와 기본 프레임워크 API 사이의 접착제 역할을 하죠 Apple Unity 플러그인은 Unity 패키지로 구성되어 있기에 Unity Editor의 내장 Package Manager를 통해 프로젝트 통합 관리를 할 수 있습니다 때로는 플러그인에서 작업이 보다 쉽게 이루어지고 이미 익숙한 Unity 검사기 기반 워크플로와 정렬할 수 있도록 플러그인이 추가 Editor 기능을 내장하기도 합니다 물론 각 플러그인은 상세한 리드미와 샘플 관련 Apple Developer 설명서와 같은 추가 리소스 링크도 같이 딸려 있습니다 다음으로 시작하는 데 도움이 되는 주요 워크플로 개념 몇 가지를 간략히 살펴보겠습니다 첫 번째 단계는 GitHub에서 소스를 복제하는 것입니다 프로젝트 소스와 설명서는 모두 여기서 찾을 수 있죠 Apple Unity 플러그인을 사용할 경우 이 단계에서 시작하게 됩니다 리파지토리를 복제한 후에 첫 번째로 할 작업은 플러그인을 구축하는 것입니다 이 과정을 단순화하기 위해 리파지토리 루트에 build.py라는 Python 스크립트가 내장되어 있습니다 이 스크립트는 네이티브 라이브러리를 구축하고 올바른 위치에 복사하며 Unity 메타 파일 업데이트와 플러그인 패킹 플러그인 테스트 빌드를 처리합니다 아주 간단한 호출로 모든 플러그인을 구축하고 타르볼로 묶은 다음 Unity 프로젝트에 통합할 수 있게 빌드 폴더에 저장하도록 스크립트가 구성되어 있습니다 중요한 점은 플러그인을 완전히 구축하고 패킹할 때 Xcode, Python3, npm, Unity가 필요하다는 것입니다 끝으로 프로젝트 리파지토리에서 build.py를 사용하기 위한 상세한 설명서가 있습니다 이제 각 플러그인을 자세히 알아보겠습니다 각 플러그인에서 Unity 프로젝트에 추가하는 방법 포함된 기능의 간략한 개요와 키 스크립팅 개념 이들을 프로젝트에 통합하는 법을 강조하는 Unity Editor의 코드 조각 및 예제의 간략한 개요를 설명하고자 합니다 기반 플러그인인 Apple.Core부터 시작해 보죠 Apple.Core는 각 플러그인의 빌드 설정을 Unity Project Settings 윈도우의 단일 기본 설정 창으로 통합합니다 각 플러그인을 네이티브 라이브러리를 컴파일하는 에셋 프로세서가 Apple.Core에 있기 때문에 각 플러그인의 라이브러리를 가져올 때 적절한 플랫폼에서 구성되도록 합니다 프로젝트를 구축할 때 네이티브 라이브러리가 중간 Xcode 프로젝트에서 올바르게 참조되도록 빌드의 사후 프로세스로 실행되는 스크립트도 Apple.Core에 포함되어 있습니다 각 플러그인이 기본 프레임워크와 상호 작용하기 때문에 C# 스크립트와 네이티브 코드 계층 간의 데이터 전달을 용의하게 하는 런타입 인터옵 유형 일부도 Apple.Core에서 정의합니다 마지막으로 다른 모든 Apple Unity 플러그인은 Apple.Core에 종속되어 있습니다 이는 다른 플러그인보다 먼저 Apple.Core를 프로젝트로 가져와야 한다는 뜻입니다 이제 이 데모에서 Apple.Core 플러그인을 새 프로젝트로 가져오는 방법을 보여 드리고 Apple Build Settings 설정을 간략히 살펴보겠습니다 플러그인이 구축되고 패킹되면 Unity Package Manager를 통해 Apple.Core를 가져올 수 있습니다 타르볼에서 패키지를 추가하는 옵션을 선택하고 패키지된 플러그인을 검색하면 됩니다
그러면 Editor가 패키지를 불러와 스크립트를 컴파일하죠 이 과정이 끝나면 Apple.Core는 사용할 준비가 된 겁니다
Apple.Core의 주요 유저페이싱 기능은 Editor의 Project Settings 윈도우에 Apple Build Settings 탭을 추가하는 것입니다
Apple Unity 플러그인을 가져오면 사용 가능한 모든 빌드 옵션이 여기에 표시됩니다 Apple.Core에는 최소 지원 OS 버전과 같은 몇 가지 기본 구성 옵션이 기본적으로 포함되어 있죠 또한 모든 플러그인의 사후 처리 빌드 단계를 비활성화할 수 있습니다
끝으로 공통 보안 설정을 구성해 중간 Xcode 프로젝트로 전파할 수도 있습니다 Game Center 플러그인을 사용하면 Apple의 소셜 게임 네트워크인 Game Center를 통해 더 많은 재미와 연결을 제공할 수 있습니다 Game Center는 플레이어들이 Apple 플랫폼 전반에 걸쳐 계정을 만들 수 있게 하고 안전한 플레이어 보안 인증 게임 내 업적 달성 리더보드 공유 플레이어 간의 도전 멀티플레이 매치메이킹 같은 기능을 제공합니다 게임에 통합될 Game Center의 기능을 고르고 선택할 수는 있지만 모든 작업은 플레이어 인증에서 시작됩니다 Game Center 플레이어 인증을 게임에 추가하면 플레이어의 홈 화면이나 App Store의 Game Center 위젯에서 게임을 표시할 수 있습니다 플레이어 인증을 추가하려면 아주 약간의 코드만 필요하죠 첫 번째 단계는 Apple.Core와 GameKit 플러그인을 프로젝트에 추가하는 것입니다 GameKit 플러그인은 Game Center 서비스와 연결됩니다 인증이 이루어지는 동안 Game Center 서비스와 연결하고 GKLocalPlayer 객체를 초기화하죠 초기화가 끝나면 로컬 플레이어의 프로필을 기준으로 플레이어 제한을 쿼리합니다 이 제한에는 성인, 노골적인 콘텐츠에 미성년 플레이어의 접근 제한 멀티플레이어 기능 제한 게임 내 커뮤니케이션 비활성화 등이 있습니다 GKLocalPlayer 및 Game Center 서비스의 상호 작용을 간단히 관리하는 방법은 Unity 내에서 컴포넌트를 정의하는 것입니다 그 예시로 간단한 Game Manager 컴포넌트의 정의를 보여 드리죠 이 컴포넌트는 GKLocalPlayer의 참조를 포함하며 플레이어 제한 사항의 인증과 쿼리를 시작 메서드에서 모두 처리합니다 플레이어 인증은 게임 중 단 한 번만 수행하면 되죠 이건 GameManager 컴포넌트의 스크립트입니다 여기 GKLocalPlayer를 캐싱하는 필드가 있죠 컴포넌트의 시작 메서드는 GKLocalPlayer.Authenticate를 일회성 호출하며 정적 메서드는 GKLocalPlayer 인스턴스를 반환합니다 로컬 플레이어를 성공적으로 인증했다면 해당 플레이어의 제한 사항을 확인할 시간입니다 플레이어 제한 사항을 코드 내에서 확인하는 것은 일련의 불린 테스트로 해결할 수 있고 GameManager 컴포넌트 스크립트의 try 블록에 추가할 수 있습니다 여기서의 참은 로컬 플레이어가 노골적인 콘텐츠에 제한적으로 접근할 수 있음을 의미합니다 여기서의 참은 로컬 플레이어의 멀티플레이어 경험을 제한한다는 뜻이죠 마지막으로 여기서의 참은 게임 내 커뮤니케이션을 비활성화함을 의미합니다 게임에 플레이어 인증을 추가하는 데 필요한 코드 변경은 저게 전부죠 여기서부터는 Game Center를 활용하기 위해 게임에 완전히 적용하는 데 필요한 추가 단계가 둘 있습니다 첫 번째로 중간 Xcode 프로젝트에 Game Center 기능을 추가해야 합니다 이 작업은 Xcode 프로젝트 UI 내에서 수행됩니다 더 많은 정보는 Apple Developer 설명문인 "Enabling and Configuring Game Center"에서 확인하세요 그 다음은 App Store Connect로 Game Center 기능을 앱에 추가해야 합니다 App Store Connect 포털에서 더 많은 정보를 확인하세요 이러한 단계가 마무리되면 플레이어를 인증하고 안전한 게임 환경을 보장할 준비가 끝난 겁니다 Game Center Unity 플러그인에서 사용할 수 있는 기능에서 플레이어 인증은 빙산의 일각에 불과합니다 게임의 발견 가능성을 높일 방법을 자세히 알고 싶으시다면 "Reach new players with Game Center dashboard" 세션을 참고하세요 멀티플레이어와 매치메이킹을 더 자세히 알고 싶으시다면 작년 세션인 "What's new in Game Center"를 참고하시고요 컨트롤러는 플레이어가 여러분이 창조할 세계에 상호 작용하는 주요 방법입니다 Game Controller 플러그인을 통해 게임에 컨트롤러를 안정적이고 유연하게 지원할 수 있죠 Game Controller 플러그인이 제공하는 기능 중에는 플레이어가 모든 게임의 버튼을 한 곳에서 재설정할 수 있게 하는 게임 컨트롤러 사용자화나 일관적인 사용자 경험을 보장하는 버튼 글리프 MFi 컨트롤러와 Sony 및 Microsoft 등의 서드파티 컨트롤러의 지원 등이 있습니다 다른 플러그인처럼 Package Manager를 통해 Apple.Core와 Game Controller 플러그인을 프로젝트에 추가할 수 있습니다 Game Controller 플러그인을 불러왔다면 제일 먼저 GCControllerService를 초기화해야 합니다 잠시 후에 보시겠지만 이 서비스는 컨트롤러와 해당 연결 이벤트에 접근하는 방법을 다룹니다 초기화가 끝나면 현재 시스템에 연결된 모든 컨트롤러의 GCControllerService를 쿼리합니다 연결된 컨트롤러는 Game Controller 플러그인에서 GCController 객체로 나타납니다 각 GCController가 연결됐다면 갱신된 컨트롤러 상태를 폴링합니다 폴링은 게임이 요구하는 만큼 적게 또는 자주 발생할 수 있지만 Unity의 정기 업데이트 루프에서 시작하는 것이 좋습니다 컨트롤러 상태의 갱신이 끝나면 버튼이나 스틱 같은 각 컨트롤러의 개별 요소의 입력을 점검합니다 게임 중에 컨트롤러의 연결이 되고 해제되는 것을 염두에 두어야 하므로 이러한 이벤트를 처리하기 위해 콜백을 등록해야 합니다 Game Controller 플러그인을 빠르게 통합하는 방법은 간결한 입력 관리자 컴포넌트를 생성하는 것입니다 이 컴포넌트는 세 가지 핵심 요소가 있는데요 현재 연결된 모든 컨트롤러를 수용하는 컨테이너 초기화를 위한 시작 메서드 폴링과 입력 테스트를 처리하기 위한 갱신 메서드가 이에 해당합니다 우선 시작 메서드부터 자세히 살펴보죠 필요한 모든 일회성 설치 작업을 수행하기 좋은 위치죠 Game Controller 서비스의 초기화는 이곳에서 일어나야 하며 연결된 컨트롤러의 초기 점검과 연결 및 연결 해제 이벤트를 위한 콜백 등록도 마찬가지입니다 이것은 입력 관리자 컴포넌트의 스크립트입니다 모든 일회성 설치 코드는 GCControllerService.Initialize() 호출을 포함해 컴포넌트의 시작 메서드에 있습니다 GetConnectedControllers의 호출은 현재 연결된 모든 컨트롤러의 열거형 컨테이너를 가져오죠 마지막 초기화 단계는 컨트롤러의 연결 및 연결 해제 이벤트를 위한 콜백을 등록하는 것입니다 초기화가 끝나면 연결된 각 컨트롤러를 폴링해 입력 상태를 갱신하고 각 컨트롤러의 입력 상태를 처리하기 위한 갱신 메서드가 입력 관리자에 필요합니다 입력을 폴링하려면 연결된 컨트롤러 집합의 이터레이팅을 시작해야 합니다 GCController의 Poll 메서드를 호출하면 최신 상태를 수집할 수 있죠 그 뒤에 각 버튼 상태를 확인하고 그에 따라 응답합니다 Game Controller 플러그인으로 연결 컨트롤러에 어떻게 접근하고 컨트롤러 입력을 얻는지를 간략하게 살펴봤는데요 Game Controller 프레임워크를 더 자세히 알고 싶으시거나 서드파티 컨트롤러와 비표준 입력 같은 주제를 알고 싶으시다면 이전 연도 세션인 "Supporting New Game Controllers"와 "Advancements in Game Controllers"를 확인해 주세요 접근성은 모두가 사용할 수 있는 기술을 만드는 것입니다 Accessibility 플러그인을 통해 Apple의 다양한 보조 기술을 Unity 기반 게임에 통합할 수 있습니다 Accessibility 플러그인은 여러 핵심 기능을 추가할 수 있게 하는데요 프로그래밍 방식으로 태그된 콘텐츠를 읽는 VoiceOver 광범위한 보조 입력 장치를 허용하는 Switch Control 사용자 설정에 따라 게임 내 텍스트 및 UI를 쉽게 재단할 수 있는 Dynamic Type 시스템 전체의 접근성 설정에 맞추기 위한 UI 편의성 설정 등이 있습니다 Accessibility 플러그인이 관여하는 부분이 많기 때문에 Accessibility Unity 플러그인의 더 자세한 내용은 "Add accessibility to Unity games" 세션에서 확인하시기를 권합니다 해당 세션에서는 예제와 사용 사례 외에도 Apple 플랫폼의 접근성으로 무엇이 가능한지도 이해할 수 있습니다 기회가 되시는 대로 꼭 확인해 보세요 햅틱 피드백을 추가하는 것은 몰입감을 높이고 플레이 경험을 향상시키는 아주 훌륭한 방법입니다 Apple의 고급 햅틱 기능은 Core Haptics 플러그인으로 접목할 수 있습니다 Core Haptics 플러그인을 사용하면 햅틱 및 오디오 이벤트 집합에서 사용자화 햅틱 패턴을 구축할 수 있습니다 동기화된 오디오 및 햅틱을 재생할 수도 있죠 실시간으로 매개 변수를 조정해 햅틱 피드백을 프로그래밍 방식으로 정의하거나 갱신할 수도 있습니다 Apple Haptic 및 Audio Pattern 즉 AHAP 파일 포맷을 통해 패턴을 에셋으로 설계하고 저장하는 파일 기반 접근 방식을 사용할 수 있습니다 지원하는 검사기로 Unity Editor에서 Core Haptics 패턴을 조정할 수도 있습니다 Core Haptics 플러그인을 최대한 활용하려면 Core Haptics의 네 가지 기본 요소와 다른 것과의 관계를 이해해야 합니다 최상위 요소는 CHHapticEngine입니다 햅틱 엔진은 기기의 햅틱 서버 링크를 나타내며 햅틱 패턴을 재생하는 데 필요합니다 CHHapticEngine은 CHHapticPatternPlayer를 생성하며 PatternPlayer는 CHHapticPattern를 재생할 때 시작, 정지, 중지, 재개와 같은 조작을 위해 사용됩니다 CHHapticPattern은 하나 이상의 햅틱 및 오디오 이벤트로 구성된 논리적 그룹입니다 CHHapticEngine은 이 패턴으로 플레이어를 생성하죠 CHHapticEvent는 햅틱 경험을 정의할 때 사용하는 구성 요소입니다 Core Haptics는 데이터 기반 API로 프로그래밍 방식으로 스크립트에서 직접 또는 AHAP 파일을 활용해 햅틱 패턴을 정의할 수 있습니다 프로젝트에 Core Haptics를 쉽게 지원하는 방법 중 하나는 각 필수 Core Haptics 객체를 관리하는 Haptics 컴포넌트를 생성하는 것입니다 다음은 CHHapticEngine과 CHHaptic Pattern Player 그리고 AHAP 에셋을 포함하는 Haptics 컴포넌트의 예시입니다 AHAP 에셋은 사용자화 Unity 에셋으로 Core Haptics 플러그인에 의해 정의됩니다 이를 통해 패턴 생성 및 사용자화를 관리하기 위한 사용자화 에디터 확장처럼 쉽게 AHAP 파일을 가져오고 내보낼 수 있습니다 좀 더 자세히 살펴보죠 먼저 프로젝트에 Apple.Core와 Core Haptics 플러그인이 모두 설치되어 있는지 확인합니다 이들이 추가되어 있다면 햅틱으로 게임을 향상시킬 수 있죠 여기에 이전 도표를 바탕으로 만든 햅틱 컴포넌트가 있습니다 조금 있다가 구현 내용을 확인해 보겠지만 일단 지금은 비행기에 첨부하겠습니다
첨부가 완료되면 컴포넌트에 AHAP 에셋이 필요한 것이 보이지만 AHAP Assets 폴더가 비어 있군요 새롭게 만들려면 Assets > Create > Apple > CoreHaptics > AHAP으로 갑니다 생성이 완료됐으니 MyHapticPattern이라는 환상적이고 독창적인 이름을 붙이겠습니다 Core Haptics 플러그인은 에디터 확장과 함께 제공되어 새 패턴을 검사기 윈도우에서 바로 조정할 수 있습니다 여기서 재생할 수 있는 CHHapticPattern의 일부분인 CHHapticEvent를 정의할 수 있습니다 기본적으로는 일시적인 이벤트가 있지만 연속 이벤트를 쉽게 추가할 수 있습니다 UI 내에 Import, Export Reset 버튼도 있는데요 Reset은 추가한 이벤트를 모두 제거하고 패턴을 기본 상태로 되돌립니다 Import와 Export는 훌륭한 기능입니다 프로젝트를 AHAP 파일로 불러오고 저장할 수 있거든요 여기 멋진 진동 효과를 유발하는 Rumble이라는 미리 정의된 AHAP를 가져왔는데요 조정이 살짝 필요하겠네요 이제 패턴을 갱신했으니 이 개선된 햅틱 패턴을 다른 팀원과 공유하도록 새 AHAP 파일로 내보낼 수도 있습니다
이제 에셋이 생성되고 조정되었으니 비행기로 돌아가서 MyHapticPattern을 선택합니다 좋아요! 다 됐군요 햅틱 패턴을 정의하고 적절하게 참조하면 햅틱 컴포넌트에 로직을 약간 추가해 햅틱 패턴을 재생할 수 있습니다 이는 두 메서드로 나눌 수 있는데요 PrepareHaptics와 Play입니다 PrepareHaptics는 햅틱 엔진을 초기화하고 햅틱 패턴 플레이어를 생성하고요 Play는 단순히 CHHapticPatternPlayer의 시작 메서드를 호출해 재생을 시작합니다 이것이 햅틱 컴포넌트의 스크립트입니다 이 영역에서 햅틱 엔진과 햅틱 플레이어를 정의합니다 중요한 점은 AHAP 에셋을 에디터 UI에서 설정할 수 있도록 SerializeField 속성을 추가하는 것입니다 그 다음 CHHapticEngine을 생성하는 코드를 추가해 시작한 뒤 참조된 에셋에서 직접 AHAP에 접근하는 햅틱 패턴 플레이어를 생성합니다 물론 플레이어에서 Start를 호출하면 햅틱 패턴이 재생되죠 Core Haptics Unity 플러그인은 게임에 완전히 새로운 수준의 몰입감을 추가하는 데 필요한 도구를 제공합니다 Core Haptics 플러그인을 사용하여 실제처럼 보이고 들리고 느껴지는 마법 같은 게임 순간을 만들 수 있죠 Core Haptics를 깊게 파고 싶으시다면 "Introducing Core Haptics" 세션을 확인해 보세요 매력적인 햅틱 경험을 설계하는 방법을 자세히 알고 싶으시면 "Designing Audio-Haptic Experiences"와 "Practice audio haptic design"을 참고하시고요 몰입감 있는 오디오는 훌륭한 게임 경험에 있어 아주 중요한 부분이죠 PHASE Unity 플러그인이면 창의력이 넘쳐나고 게임 세계에 풍부한 사운드 환경을 구축할 수 있습니다 PHASE를 통해 복잡하고 역동적인 오디오 환경을 게임에 제공할 수 있습니다 지오메트리 인식 오디오는 씬의 메시에서 발산한 소리와 상호 작용할 수 있습니다 소리의 반향과 반사를 통해 더 사실적인 게임 내 환경을 들려주기도 하죠 또한 게임 중에 생성한 계층적 오디오 그래프로 동적 오디오 제어를 허용할 수도 있습니다 PHASE 플러그인은 게임 준비에 필요한 미리 정의된 컴포넌트 집합을 포함하고 있습니다 이들을 게임 오브젝트에 간단히 첨부하는 것만으로 코드를 전혀 작성하지 않고도 PHASE를 사용할 수 있죠 첫 컴포넌트는 PHASEListener 컴포넌트입니다 이것은 게임 씬의 "귀" 역할을 하며 위치, 방위, 반향의 프리셋에 따라 오디오를 처리합니다 다음은 PHASEOccluder 컴포넌트입니다 PHASEOccluder는 지오메트리 데이터를 게임 오브젝트에 첨부하고 씬의 소스와 청취자 사이에 오브젝트가 끼어들 경우 오디오를 줄입니다 다음은 PHASESource 컴포넌트로 게임 오브젝트에 첨부된 채로 게임 세계에서 오브젝트의 변환을 통해 소리를 위치시킵니다 이 내장 컴포넌트와 함께 PHASE 플러그인은 사용자화 에셋인 SoundEvent 에셋도 정의합니다 SoundEvent는 오디오 재생 이벤트를 설명하고 씬의 소스에서 재생되는 오디오를 정의하는 객체입니다 PHASE 플러그인을 시작하려면 우선 프로젝트에 Apple.Core와 PHASE 플러그인이 모두 있는지 확인해야 합니다 설치가 끝나고 나면 포함된 컴포넌트를 씬에 추가할 수 있습니다 이 예시 프로젝트에는 흥미로운 세 가지의 게임 오브젝트가 있는데요 카메라, 건물, 비행기입니다 우선, PHASEListener 컴포넌트를 카메라에 첨부하겠습니다 그렇게 해서 이 씬에 "귀"를 넣은 것이죠 그 다음엔 건물에 PHASEOccluder 컴포넌트를 첨부해 건물을 가림막으로 만들겠습니다
끝으로 PHASESource 컴포넌트를 비행기에 추가해 씬에 소스를 추가하겠습니다 이제 소스를 넣었으니 재생할 오디오가 필요하겠죠 그렇기에 소리 이벤트를 첨부해야 하는데 Sound Events 폴더가 비어 있군요 새롭게 만들려면 Assets > Create > Apple > PHASE > SoundEvent로 갑니다 소리 이벤트를 생성하고 나면 그 즉시 PHASE 플러그인이 PHASE Sound Event Composer 윈도우를 열 겁니다 이곳이 소리 이벤트를 구축하는 캔버스죠 윈도우의 아무 위치를 오른쪽 클릭하면 이벤트에 노드를 추가할 수 있는 메뉴가 나타납니다 여기서 클립을 재생하거나 노드 샘플을 생성할 수 있죠 정지 중인 비행기의 오디오 클립을 프로젝트에 미리 추가했기에 여기에 참조할 수 있습니다 비행기 소리가 계속 나도록 계속 루프되도록 하겠습니다 비행기 소리를 들으려면 믹서에 라우팅할 필요가 있습니다 믹서를 생성하려면 캔버스로 출력 라인을 끌어왔을 때 나타나는 믹서 생성 옵션을 사용하면 됩니다
이제 소리 이벤트가 완성되었으니 사용할 준비가 끝났습니다 소리 이벤트를 클릭하면 이벤트 설정을 검사기에서 직접 볼 수 있습니다 이를 통해 캔버스를 다시 띄우지 않고도 값을 조정할 수 있습니다 소리 이벤트가 생성됐으니 앞서 비행기에 첨부했던 PHASESource 컴포넌트를 이제 참조할 수 있습니다 이렇게 하면 씬의 오디오가 재생되도록 라우팅과 구성이 이루어집니다 PHASE Unity 플러그인은 게임 내 오디오 설계를 위한 전혀 새로운 가능성을 열어 줍니다 PHASE를 더 알고 싶고 오늘 소개한 개념을 더 깊게 파고 싶으시다면 Apple Developer 설명 사이트와 작년에 소개된 WWDC 세션 영상을 확인하세요 새로운 Apple Unity 플러그인의 개요를 이것으로 마치겠습니다 오늘 제가 많은 것을 다뤘는데요 Apple Unity 플러그인을 더 많이 알고 싶으시다면 GitHub의 리파지토리에서 시작하시는 걸 추천드립니다 거기서 각 플러그인의 소스와 자세한 설명서, 예시를 보실 수 있습니다 Unity 게임의 접근성을 통합하는 방법을 자세히 알아보시려면 "Add accessibility to Unity games" 세션을 참고하시고 게임의 가시성을 높일 방법을 알고 싶으시면 "Reach new players with Game Center dashboard"를 확인해 보시길 바랍니다 시청해 주셔서 감사합니다 ♪
-
-
9:02 - Game Center - Example game manager component - C#
using Apple.GameKit; public class GameManager : MonoBehaviour { private GKLocalPlayer _localPlayer; private async Task Start() { try { _localPlayer = await GKLocalPlayer.Authenticate(); } catch (Exception exception) { // Handle exception... } } }
-
9:23 - Game Center - Example game manager component continued - C#
try { _localPlayer = await GKLocalPlayer.Authenticate(); if (_localPlayer.IsUnderage) { // Hide explicit game content. } if (_localPlayer.IsMultiplayerGamingRestricted) { // Disable multiplayer game features. } if (_localPlayer.IsPersonalizedCommunicationRestricted) { // Disable in-game communication UI. } }
-
13:11 - Game Controller - Example input manager component - C#
using Apple.GameController; public class InputManager : MonoBehaviour { void Start() { // Initialize the Game Controller service GCControllerService.Initialize(); // Check for connected controllers var controllers = GCControllerService.GetConnectedControllers(); foreach (GCController controller in controllers) { // Handle controllers } // Set up callbacks to handle connected/disconnected controllers GCControllerService.ControllerConnected += _onControllerConnected; GCControllerService.ControllerDisconnected += _onControllerDisconnected; } }
-
13:50 - Game Controller - polling and input handling - C#
foreach (GCController controller in _myConnectedControllers) { controller.Poll(); // Check the 'South' button ('A' button on most controllers) if (controller.GetButton(GCControllerInputName.ButtonSouth)) { //Handle button pressed } // Check other controller inputs… }
-
20:30 - Core Haptics - Example haptics component - C#
using Apple.CoreHaptics; public class Haptics : MonoBehaviour { private CHHapticEngine _hapticEngine; private CHHapticPatternPlayer _hapticPlayer; [SerializeField] private AHAPAsset _hapticAsset; private void PrepareHaptics() { _hapticEngine = new CHHapticEngine(); _hapticEngine.Start(); _hapticPlayer = _hapticEngine.MakePlayer(_hapticAsset.GetPattern()); } private void Play() { _hapticPlayer.Start(); } }
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.