---
title: 캐릭터를 따라다니는 오브젝트 구현하기
slug: world-sdk-guide-kr/mxSCgT0G3S-i33aexdGFT
docTags: 
createdAt: 2024-09-02T08:34:13.135Z
---

NavMeshAgent 컴포넌트를 사용하면 제페토 캐릭터를 따라다니는 AI 오브젝트를 만들 수 있습니다.

이 가이드에서는 내 캐릭터를 따라다니는 Pet 형태의 오브젝트를 구현합니다.&#x20;

## Pet 오브젝트 구현하기

:::::WorkflowBlock
:::WorkflowBlockItem
**Navigation (Obsolete) 창을 엽니다.**

![](https://api.archbee.com/api/optimize/xv-TGeWVTX2GDZMFGOf1Y/ioeagnYkRZnNx3-Fh3DQH_image.png)

Unity 상단 메뉴에서 **Window > AI > Navigation (Obsolete)**&#xB97C; 클릭해 Navigation (Obsolete) 창을 열어주세요.
:::

::::WorkflowBlockItem
**Pet 오브젝트가 이동 가능한 영역을 정의합니다.**

::Image[]{src="https://api.archbee.com/api/optimize/xv-TGeWVTX2GDZMFGOf1Y/6Hnn9ZZKQBMr-JhQhFlt2_image.png" size="70" width="710" height="458" position="center" showCaption="false"}

Navigation (Obsolete) 창의 **Object** 탭을 클릭한 후, Hierarchy에서 NavMesh에 포함될 바닥, 벽, 장애물 등의 오브젝트를 선택해 Object에 추가해 주세요.

- Pet 오브젝트가 해당 오브젝트들을 이동 가능한 표면 또는 장애물로 인식하도록 설정하는 과정입니다.

**Navigation Static** 필드가 체크 되어 있는지도 확인해 주세요.

:::hint{type="info"}
✏️ NavMesh에 대한 자세한 내용은 다음 영상을 참고해 주세요.&#x20;

::embed[]{url="https://www.youtube.com/watch?v=mP7ulMu5UkU"}
:::
::::

:::WorkflowBlockItem
**NavMesh를 생성합니다.&#x20;**

![](https://api.archbee.com/api/optimize/xv-TGeWVTX2GDZMFGOf1Y/Q-90_MdXrB1zN3pc8dzIj_image.png)

**Bake** 탭을 클릭한 후, 하단의 **Bake** 버튼을 눌러 NavMesh를 생성합니다.
:::

::::WorkflowBlockItem
**NavMeshAgent를 생성합니다.&#x20;**

Hierarchy에서 Pet 오브젝트를 선택해주세요. 그 다음 Inspector에서 **NavMeshAgent** 컴포넌트를 추가해 주세요.

- 여기서 Agent는 NavMesh 내비게이션 시스템을 이용해 이동하는 Pet 오브젝트를 의미합니다.&#x20;

Agent의 속성 값을 조정하면, Pet의 크기, 이동 속도, 회전 속도, 가속도, 장애물로 인식하는 높이 등을 설정할 수 있습니다.

:::hint{type="info"}
✏️ NavMeshAgent에 대한 자세한 내용은 다음 [링크](https://docs.unity3d.com/kr/2021.3/Manual/class-NavMeshAgent.html)를 참고해 주세요.&#x20;
:::

![](https://api.archbee.com/api/optimize/xv-TGeWVTX2GDZMFGOf1Y/NWdi4SSnexNRcoVeE13jG_image.png)

위 예제에서는 NavMeshAgent의 Stopping Distance를 3으로 설정하여 Pet이 플레이어와의 거리 3에서 멈추도록 설정하였습니다.
::::

:::WorkflowBlockItem
**PetController 스크립트를 생성합니다.**

Project 창에서 **+ 버튼 > ZEPETO > TypeScript**를 클릭하여 새로운 제페토 스크립트를 생성한 뒤, 이름을 **PetController**로 수정합니다.

그 다음, 스크립트를 열어 아래 코드를 복사 후 붙여넣습니다.&#x20;

```typescript
import { Transform } from 'UnityEngine'
import { NavMeshAgent } from 'UnityEngine.AI';
import { ZepetoPlayers } from 'ZEPETO.Character.Controller'
import { ZepetoScriptBehaviour } from 'ZEPETO.Script'
import { WorldService } from 'ZEPETO.World';

export default class PetController extends ZepetoScriptBehaviour {

    private _target: Transform;
    private _navMeshAgent: NavMeshAgent;

    Start() {
        this._navMeshAgent = this.GetComponent<NavMeshAgent>();

        ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {
            this._target = ZepetoPlayers.instance.GetPlayer(WorldService.userId).character.transform;
        })
    }

    Update() {
        if (this._target == null) {
            return;
        }
        this._navMeshAgent.SetDestination(this._target.position);
    }
}
```

스크립트 설명

- 스크립트가 시작될 때 \_target에 내 제페토 캐릭터를 지정해 줍니다.&#x20;
- Update 함수에서 매 프레임마다 NavMeshAgent의 SetDestination 함수를 사용하여 내 제페토 캐릭터의 위치를 NavMesh의 목표 지점으로 설정합니다.&#x20;
:::

:::WorkflowBlockItem
**Pet 오브젝트에 PetController 스크립트를 적용합니다.**

Hierarchy에서 Pet 오브젝트를 선택한 후, Inspector에서 **Add Component > Zepeto Script**를 클릭한 뒤 Script 필드에 생성한 PetController 스크립트를 드래그 앤 드롭합니다.
:::

:::WorkflowBlockItem
**플레이 버튼을 눌러 실행합니다.**

![](https://api.archbee.com/api/optimize/xv-TGeWVTX2GDZMFGOf1Y/yq6fVGzeb3eN12XefOpQe_petexample.gif)

Pet 오브젝트가 내 캐릭터를 따라오면서, 벽과 같은 장애물도 잘 피해 이동하는 모습을 확인할 수 있습니다.
:::
:::::



# 캐릭터 머리 위의 Pet 만들기

캐릭터를 따라다니는 Pet이 아닌, 캐릭터의 신체 위에 올려진 Pet을 구현하고 싶다면 캐릭터에 오브젝트를 붙이는 방식을 사용해 보세요.

:::hint{type="info"}
✏️ 오브젝트 부착에 대한 자세한 내용은 [ZEPETO 캐릭터에 오브젝트 부착하기](docId\:VS9VfckvAkSHborXH3nZ_) 가이드를 참고해 주세요. 
:::



::::WorkflowBlock
:::WorkflowBlockItem
**AttachPetController 스크립트를 작성합니다.**

Project 창에서 **+ 버튼 > ZEPETO > TypeScript**를 클릭하여 새로운 제페토 스크립트를 생성한 뒤, 이름을 **AttachPetController**로 수정합니다.

그 다음, 스크립트를 열어 아래 코드를 복사 후 붙여넣습니다. 

```typescript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { ZepetoCharacter, ZepetoPlayers } from 'ZEPETO.Character.Controller';
import { Transform, Animator, GameObject, HumanBodyBones, Object } from 'UnityEngine';

export default class AttachPetController extends ZepetoScriptBehaviour {

    public Pet: GameObject;
    public bodyBone: HumanBodyBones;

    Start() {

        ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {
            const localCharacter = ZepetoPlayers.instance.LocalPlayer.zepetoPlayer.character;            
            const animator: Animator = localCharacter.ZepetoAnimator;            
            const bone: Transform = animator.GetBoneTransform(this.bodyBone);            
            Object.Instantiate(this.Pet, bone) as GameObject;          
        });
    }
}
```

스크립트 설명

- 스크립트가 시작되면 로컬 플레이어를 찾아서 캐릭터의 애니메이터를 찾게 됩니다.
- 변수 bodyBone에서 선택한 신체 부분이 캐릭터의 애니메이터에서 어느 부분인지 찾아서 위치를 파악합니다.
- 파악한 위치에 pet 오브젝트를 Intantiate 하여 생성해 줍니다. 이때 pet 오브젝트의 parent는 앞서 찾은 캐릭터 애니메이터의 신체 부분으로 지정하게 됩니다.
:::

:::WorkflowBlockItem
**새로운 오브젝트에 AttachPetController 스크립트를 적용합니다.**

Hierarchy에서 **+ 버튼 > Create Empty**를 클릭하여 새로운 오브젝트를 생성한 뒤, 이름을 **AttachPetController**로 수정합니다.

그 다음, Inspector에서 **Add Component > Zepeto Script**를 클릭한 뒤 Script 필드에 생성한 AttachPetController 스크립트를 드래그 앤 드롭합니다.

Pet 필드에는 사용할 Pet 오브젝트를 드래그 앤 드롭하고, bodyBone 필드의 드롭다운 메뉴를 열어서 Pet 오브젝트를 부착할 캐릭터의 신체 부위를 선택합니다.

![](https://api.archbee.com/api/optimize/xv-TGeWVTX2GDZMFGOf1Y/nyLMD6vjoovCAoxHTe8OC_image.png)

플레이 버튼을 눌러 실행하면 Pet 오브젝트가 선택한 신체 부위에 생성된 것을 확인할 수 있습니다.
:::
::::

