---
title: การสร้างวัตถุที่ติดตามตัวละคร
slug: world-sdk-guide-th/VAK3nqCih5anNG8LwnGb1
docTags: 
createdAt: 2024-09-02T08:34:13.135Z
---

ด้วยการใช้คอมโพเนนต์ NavMeshAgent คุณสามารถสร้างวัตถุ AI ที่ติดตามตัวละคร ZEPETO ได้

ในคู่มือนี้ เราจะสร้างวัตถุ Pet ที่ติดตามตัวละครของเรา

## การสร้างวัตถุ Pet

:::::WorkflowBlock
:::WorkflowBlockItem
**เปิดหน้าต่าง Navigation (Obsolete)**

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

ไปที่เมนูด้านบนของ Unity แล้วคลิก **Window > AI > Navigation (Obsolete)** เพื่อเปิดหน้าต่าง 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 และเพิ่มเข้าไปใน Object

- สิ่งนี้ทำให้วัตถุ Pet รับรู้พื้นที่ที่สามารถเดินได้หรือสิ่งกีดขวาง

อย่าลืมตรวจสอบให้แน่ใจว่าได้ทำเครื่องหมายที่ **Navigation Static** แล้ว

:::hint{type="info"}
✏️ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ NavMesh กรุณาดูวิดีโอด้านล่าง

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

:::WorkflowBlockItem
**สร้าง NavMesh**

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

คลิกแท็บ **Bake** แล้วกดปุ่ม **Bake** ที่ด้านล่างเพื่อสร้าง NavMesh
:::

::::WorkflowBlockItem
**เพิ่ม NavMeshAgent**

เลือกวัตถุ Pet จาก Hierarchy แล้วไปที่ Inspector เพื่อเพิ่มคอมโพเนนต์ **NavMeshAgent**

- Agent ในที่นี้หมายถึงวัตถุ Pet ที่เคลื่อนที่ด้วยระบบนำทางของ NavMesh

คุณสามารถปรับขนาด ความเร็วในการเคลื่อนที่ ความเร็วในการหมุน ความเร่ง และระดับความสูงที่ถือว่าเป็นสิ่งกีดขวางได้

:::hint{type="info"}
✏️ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ NavMeshAgent ดู[ลิงค์](https://docs.unity3d.com/kr/2021.3/Manual/class-NavMeshAgent.html)นี้
:::

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

ในตัวอย่างนี้ เราตั้งค่า Stopping Distance ของ NavMeshAgent เป็น 3 เพื่อให้ Pet หยุดเมื่ออยู่ห่างจากผู้เล่น 3 หน่วย
::::

:::WorkflowBlockItem
**สร้างสคริปต์ PetController**

ในหน้าต่าง Project ให้คลิกปุ่ม **+ > ZEPETO > TypeScript** เพื่อสร้างสคริปต์ใหม่ จากนั้นเปลี่ยนชื่อเป็น **PetController**

เปิดสคริปต์แล้วคัดลอกโค้ดด้านล่างไปวาง

```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 เป็นตัวละคร ZEPETO ของคุณ
- ในฟังก์ชัน Update จะใช้ SetDestination ของ NavMeshAgent เพื่อกำหนดตำแหน่งของตัวละครเป็นจุดหมายปลายทางในทุกเฟรม
:::

:::WorkflowBlockItem
**นำสคริปต์ PetController ไปใช้กับวัตถุ Pet**

เลือกวัตถุ Pet จาก Hierarchy ไปที่ Inspector แล้วคลิก **Add Component > Zepeto Script**

จากนั้นลากสคริปต์ PetController ที่สร้างไว้ไปวางในช่อง Script
:::

:::WorkflowBlockItem
**คลิกปุ่มเล่น**

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

ตอนนี้คุณจะเห็นวัตถุ Pet ติดตามตัวละครของคุณและหลีกเลี่ยงสิ่งกีดขวางอย่างเป็นธรรมชาติ เช่น กำแพง
:::
:::::



# การสร้าง Pet บนศีรษะตัวละคร

หากคุณต้องการให้ Pet ติดอยู่บนร่างกายของตัวละคร แทนที่จะติดตาม ก็สามารถใช้วิธีการยึดวัตถุได้

:::hint{type="info"}
✏️ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการติดวัตถุ โปรดดูคู่มือ [การแนบวัตถุกับตัวละคร ZEPETO](docId\:hoJE6kdwJoddW48r0MQb0)
:::



::::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;          
        });
    }
}
```

คำอธิบาย

- เมื่อสคริปต์เริ่มทำงาน ระบบจะค้นหา Local Player และ Animator ของตัวละคร
- จากนั้นจะระบุส่วนของร่างกายที่เลือกไว้ใน bodyBone และระบุตำแหน่ง
- วัตถุ Pet จะถูกสร้างขึ้น (Instantiate) ที่ตำแหน่งนั้น และตั้งค่า parent เป็นส่วนของร่างกายที่พบ
:::

:::WorkflowBlockItem
**นำสคริปต์ AttachPetController ไปใช้กับวัตถุใหม่**

ใน Hierarchy คลิก **+ > Create Empty** เพื่อสร้างวัตถุใหม่ และตั้งชื่อว่า **AttachPetController**

จากนั้นไปที่ Inspector คลิก **Add Component > Zepeto Script** และลากสคริปต์ไปใส่ในช่อง Script

ลากวัตถุ Pet ไปยังช่อง Pet และเลือกส่วนของร่างกายจากเมนูแบบดรอปดาวน์ของ bodyBone เพื่อให้ Pet ยึดติด

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

คลิกปุ่มเล่นเพื่อดูว่า Pet ปรากฏบนส่วนของร่างกายที่คุณเลือก
:::
::::

