CREATE YOUR WORLD
Interaction with Object

오브젝트와 인터렉션하기

15min

ZEPETO 캐릭터가 객체에 접근할 때 나타나는 상호작용 버튼을 구현하세요.



Document image




1단계 : 환경 설정

  • 상호작용 샘플 및 가이드에 사용된 애니메이션과 버튼 리소스를 다음 링크에서 다운로드할 수 있습니다.

📘 ZEPETO 상호작용 샘플 Zepeto 상호작용 모듈

  • 장면에서 ZEPETO 캐릭터 생성 코드를 기본값으로 구현하세요.

📘 다음 가이드를 참조하세요. [ZEPETO Player]



단계 2 : 객체 설정

ZEPETO 캐릭터와 상호작용할 객체를 설정합니다.



1) ZEPETO 캐릭터가 상호작용할 객체를 배치합니다.

2) 계층 만들기 > 빈 객체 만들기를 선택하고 이름을 DockPoint로 변경합니다.

  • 이 지점이 ZEPETO 캐릭터가 상호작용할 지점입니다. 객체의 위치를 조정하세요.
Document image




  • 유니티 에디터 상단의 변환 기즈모 토글 버튼이 로컬인지 확인하고 Z축(파란 화살표)을 객체의 바깥쪽으로 회전시킵니다.
Document image




  • 콜라이더 컴포넌트를 추가한 후 isTrigger를 확인합니다.
  • 플레이어가 객체와 상호작용할 수 있는 범위에 맞게 콜라이더의 크기를 조정합니다.
Document image




3) 계층 구조 만들기 > DockPoint의 자식으로 빈 객체를 생성하고 이름을 IconPos로 변경합니다.

Document image




3단계 : UI 설정

1) 계층 구조 만들기 > UI > 캔버스를 ZEPETO 캐릭터가 상호작용할 객체의 자식으로 만들고 이름을 PrefIconCanvas로 변경합니다.

  • 렌더 모드를 월드 스페이스로 설정합니다.
  • 너비와 높이를 각각 1로 설정합니다.
  • Graphic Raycaster 구성 요소에서 Ignore Reversed Graphics 옵션의 선택을 해제합니다.
캔버스 설정 예시
캔버스 설정 예시




2) 계층 구조 만들기 > UI > 버튼을 PrefIconCanvas의 자식으로 만듭니다.

버튼 이미지 예시
버튼 이미지 예시




3) 설정이 완료되면, 이를 프리팹으로 만들고 계층 구조에서 나머지 PrefIconCanvas를 삭제합니다.

프리팹 구성 예시
프리팹 구성 예시




단계 4 : 스크립트 작성

단계 4 - 1 : InteractionIcon

1) 프로젝트 생성 > 생성 > ZEPETO > TypeScript로 이름을 InteractionIcon으로 변경합니다.

2) 아래와 같은 샘플 스크립트를 작성합니다.

TypeScript

  • 스크립트의 흐름은 다음과 같습니다:
    • Update()
      • UpdateIconRotation() 사용자 정의 함수를 호출하여 아이콘 캔버스를 카메라 회전과 일치하도록 회전시킵니다.
    • OnTriggerEnter(), OnTriggerExit()
      • Collider 영역에 들어가고 트리거를 감지하면 ShowIcon() 사용자 정의 함수를 호출하여 아이콘을 활성화합니다.
      • Collider 영역에서 나가면 HideIcon() 사용자 정의 함수를 호출하여 아이콘을 비활성화합니다.



3) 스크립트 생성을 완료한 후, 스크립트를 DockPoint 객체에 추가합니다.

4) 검사기에서 Pref Icon Canvas와 Icon Position을 지정합니다.



예제 스크립트 설정 화면
예제 스크립트 설정 화면




STEP 4 - 2 : GestureInteraction

1) 프로젝트 생성 > 생성 > ZEPETO > TypeScript를 선택하고 GestureInteraction으로 이름을 변경합니다.

2) 아래와 같은 샘플 스크립트를 작성하세요.

TypeScript

  • 스크립트의 흐름은 다음과 같습니다:
    • 시작()
      • 아이콘이 클릭되면 비활성화되고 DoInteraction() 사용자 정의 함수를 호출합니다.
    • DoInteraction()
      • isSnapBone이 체크되어 있으면,
        • 좌석이 비어 있으면 (allowOverlap이 체크되어 있거나 FindOtherPlayerNum() 사용자 정의 함수의 반환 값이 1보다 작음)
          • 애니메이션 클립에 할당된 제스처를 가져옵니다.
          • SnapBone() 코루틴을 시작하고 ZEPETO 캐릭터의 bodyBone을 targetTransform에 연결합니다.
          • WaitForExit() 코루틴을 시작합니다.
            • ZEPETO 캐릭터가 점프하거나 이동하거나 콜라이더 영역을 벗어날 때, 제스처를 취소하고 아이콘을 활성화합니다.
        • 좌석 수용 인원이 가득 차면 아이콘을 활성화합니다.
      • isSnapBone이 체크되어 있지 않으면,
        • 애니메이션 클립에 할당된 제스처를 가져옵니다.
        • WaitForExit() 코루틴을 시작합니다.



3) 스크립트 생성을 완료한 후, 스크립트를 DockPoint 객체에 추가합니다.

4) 검사기에서 애니메이션 클립, 스냅 본, 본체 본 및 겹침 허용을 할당합니다.

  • 애니메이션 클립을 할당합니다. 이는 상호작용 시 취할 제스처입니다.
  • 스냅 본을 확인합니다. 본체 본에 할당된 부분이 도크 포인트에 위치해 있는지 확인합니다.
  • 본체 본을 엉덩이로 설정합니다. 앉는 제스처가 될 것이므로 엉덩이가 도크 포인트에 위치해 있는지 확인합니다.
  • 겹침 허용은 여러 사람이 하나의 좌석에 앉을 수 있는지를 결정할 수 있게 해줍니다.
예제 스크립트 설정 화면
예제 스크립트 설정 화면




5단계 : 플레이

ZEPETO 캐릭터가 객체에 접근할 때 버튼이 나타나고, 멀어질 때 사라집니다.

버튼에 접근하고 상호작용할 때 설정한 제스처가 재생된다면 성공입니다.

제스처 외에도 상호작용 후 발생할 수 있는 다양한 이벤트를 구현할 수 있습니다.

다음은 상호작용 후 아이템을 생성하는 이벤트를 구현하는 예입니다.



📘 Zepeto 월드 샘플 - 3장 상호작용 샘플 https://github.com/naverz/zepeto-world-sample/tree/main/Assets/Chapter3