---
title: 创建一个Zepeto角色
slug: world-sdk-guide-ch/x_uq-zepeto
docTags: 
createdAt: 2024-09-02T08:34:13.136Z
---

## 步骤 1 : 向场景添加基础

- 在层级窗口中，点击 3D 对象 → 平面。

::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-j5rQy5z3Bmb8ourQPZECC-20240904-102412.png" size="54" width="301" height="371" position="center" showCaption="false"}

- 将平面的位置设置为 X: 0, Y: 0, Z: 0，并将大小设置为 X: 10, Y: 1, Z: 10。

::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-zlBL0jPUiiB-e_nYD5lIL-20240904-102412.png" size="40" width="389" height="180" position="center" showCaption="false"}

:::hint{type="success"}
**👍 提示**

- 平面是用于测试的最基本地面。
- 只要是带有碰撞体的对象，使用什么都无所谓。
- 随着你对世界创建的熟悉，你可以制作一个酷炫的地图来替代地面。
- 没有平台，角色一创建就会掉落并且不可见。
:::



## 步骤 2 : 添加 ZEPETO 玩家组件

在层级窗口中，选择 ZEPETO → ZepetoPlayers 标签。

::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-qcHtp5uBzcW5VHQGrCgky-20240904-102412.png" size="44" width="321" height="473" position="center" showCaption="false"}

一个名为 ZepetoPlayers 的对象将会自动创建，如下所示。 &#x20;

ZepetoPlayers 是一个管理世界中角色控制器模块的组件。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-usnnWMFdB2dBaFRcthtw9-20240904-102412.png)



可以在检查器窗口中设置角色控制和相关功能的值。

- 通常可以设置 ZEPETO 相机设置、角色移动速度、跳跃高度等。
- 在这个例子中，我们将使用默认值。

:::hint{type="info"}
**📘&#x20;**&#x6709;关详细设置，请参阅 ZEPETO 角色控制器指南。[ZEPETO角色控制器](docId\:lXJO49ZHlF_mkcxBO2BuC)&#x20;
:::



## 步骤 3 : 加载角色

要加载角色，您需要创建一个新的 ZEPETOScript 文件。

1\) 在 \[项目] 面板中，选择左上角的 \[+] 菜单或选择资产 → 创建 → ZEPETO → TypeScript。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-cltTzMzv0pPE7DvCuKBPi-20240904-102412.png)



2\) 创建ZEPETOScript文件时，请输入名称CharacterLoader。将创建一个如下所示的脚本文件。

::Image[]{src="https://api.archbee.com/api/optimize/xv-TGeWVTX2GDZMFGOf1Y/DykIf_HYe4O9GwWHEKQaV_image.png" size="66" width="2880" height="1520" position="center" showCaption="false"}



3\) 在Hierarchy→\[+] 菜单→运行Create Empty菜单。

::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-QyiUep5E4kvP6g35JLYNZ-20240904-102412.png" size="64" width="311" height="276" position="center" showCaption="false"}



4\) 创建空的 GameObject 时，写入 CharacterLoader。将创建一个如下所示的 GameObject。

::Image[]{src="https://api.archbee.com/api/optimize/xv-TGeWVTX2GDZMFGOf1Y/i78pMoFETMuNHms6xPgOC_image.png" size="48" width="2880" height="1454" position="center" showCaption="false"}



5\) 在Hierarchy中选择CharacterLoader GameObject，然后单击Inspector中的Add Component按钮。

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



6\) 在Add Component窗口中，添加Zepeto script组件。

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



7) 单击Zepeto Script组件上的Attach Zepeto Script按钮。

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



8\) 在Attach Zepeto Script窗口中选择您之前创建的CharacterLoader ZEPETO Script文件。

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



9\) 按如下方式配置 CharacterLoader GameObject。

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

:::hint{type="danger"}
- ZEPETOScript 不会运行，除非它作为组件添加到场景中的 GameObject。
:::



10\) 接下来，输入你的 ZEPETO ID，将角色加载到场景中。
打开 CharacterLoader 的 ZEPETOScript 文件，运行脚本编辑器程序。
然后应用下面的示例脚本。

- 请在 \[ZEPETO\_ID] 的位置输入您的 ZEPETO ID。
- 如果您的 ZEPETO ID 是 'abcd'，您应该输入为 `ZepetoPlayers.instance.CreatePlayerWithZepetoId("", "abcd", new SpawnInfo(), true)`



### 用于加载具有特定 ZEPETO ID 的 ZEPETO 角色的脚本

:::CodeblockTabs
用于加载具有特定 ZEPETO ID 的 ZEPETO 角色的脚本

```typescript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { SpawnInfo, ZepetoPlayers, LocalPlayer } from 'ZEPETO.Character.Controller';

export default class CharacterLoader extends ZepetoScriptBehaviour {

    Start() {
        ZepetoPlayers.instance.CreatePlayerWithZepetoId("", "[ZEPETO_ID]", new SpawnInfo(), true);
        ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {
            const player: LocalPlayer = ZepetoPlayers.instance.LocalPlayer;
        });
    }
}
```
:::



11\) 保存脚本后，请返回 Unity 编辑器。

- 请继续执行步骤 4。

:::hint{type="danger"}
* 如果您使用此代码，您将只能使用特定 ZEPETO ID 的头像进行游戏。
* 当您启动您的世界时，您需要修改代码，以基于访问您世界的用户的 ZEPETO ID，而不是您在代码中输入的 ZEPETO ID。请使用下面的脚本。
:::



### 加载已登录ID的角色的脚本

:::CodeblockTabs
加载已登录ID的角色的脚本

```typescript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { SpawnInfo, ZepetoPlayers, LocalPlayer, ZepetoCharacter } from 'ZEPETO.Character.Controller';
import { WorldService } from 'ZEPETO.World'; 
 
export default class CharacterLoader extends ZepetoScriptBehaviour {   
 
    Start() {       
        // Grab the user id specified from logging into zepeto through the editor.
        ZepetoPlayers.instance.CreatePlayerWithUserId(WorldService.userId, new SpawnInfo(), true);            
        ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {           
            const player: LocalPlayer = ZepetoPlayers.instance.LocalPlayer;       
        });   
    }
}
```
:::

- 此脚本根据已登录的ID创建一个ZEPETO角色，并不接受特定的ZEPETO ID，因此请确保在测试之前先登录Unity编辑器。
- 保存脚本后，请返回Unity编辑器。
- 请继续执行第4步。

:::hint{type="danger"}
* 请确保客户端脚本中只有一个本地玩家创建代码。
* 如果创建了多个相同的玩家，可能是CreatePlayerWithUserId()脚本在其他地方被调用。
* 一个常见的错误是应用多人示例代码，同时保留本指南中的角色创建代码不变，导致角色被创建两次。请通过注释掉一方来管理此问题。
:::



## 步骤 4 : 运行

使用屏幕中央的 \[▶︎(播放)] 按钮检查 CharacterLoader 是否正常工作。

加载的角色被称为本地玩家的角色，这意味着用户可以直接在自己的设备上控制的 ZEPETO 角色。

CharacterLoader 为每个输入事件提供了一个通用的角色控制键映射，适用于不同的设备（PC/移动设备）。因此，加载的角色可以在场景中进行控制，而不受平台的限制。

在 PC 上，角色和相机可以通过鼠标操作。在移动设备上，角色和相机可以通过下面截图所示的虚拟摇杆操作。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-8SVLdCW6nNQ1LMI56pknJ-20240904-102412.gif)

:::hint{type="success"}
**👍 以下输入接口支持角色控制：**
**PC**

- 移动：键盘箭头，WASD
- 跳跃：空格
- 双重跳跃：（左）Shift
- 缩放：鼠标滚轮
- 旋转：屏幕拖动

**移动设备**

- 移动：（左下角屏幕）虚拟摇杆
- 跳跃：（右下角屏幕）虚拟摇杆按钮
- 缩放：（两根手指）屏幕拖动
- 旋转：（一根手指）屏幕拖动
:::



如果ZEPETO角色创建功能不正常，请前往 `Unity菜单 > 项目设置 > 编辑器 > 进入播放模式设置`。

- 将进入播放模式选项设置为关闭。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-Tx-wTd76glhN_dTqIHHIs-20240904-102412.png)



## 步骤 5：更改 ZEPETO 角色的起始位置

ZEPETO 角色的起始位置在 UnityEngine.Vector3(0,0,0) 创建，除非另行设置。

旋转值也在 UnityEngine.Quaternion.Euler(0,0,0) 的角度生成。

角色生成位置和旋转值使用 `ZepetoPlayers.instance.CreatePlayerWithUserId(WorldService.userId, new SpawnInfo(), true); `函数的参数 SpawnInfo() 将被生成。

因此，您可以在调用角色创建函数之前设置 SpawnInfo() 的期望值，以确保它在特定位置生成。

我们已经在地图上的位置 (0,0,0) 预放置了一个 3D 对象 > 立方体。

如果您将角色的生成位置值更改为以下内容，它将生成在立方体上方。

:::CodeblockTabs
CharacterLoader

```typescript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { SpawnInfo, ZepetoPlayers, LocalPlayer, ZepetoCharacter } from 'ZEPETO.Character.Controller';
import { WorldService } from 'ZEPETO.World';
import { Quaternion, Vector3 } from 'UnityEngine';

export default class CharacterLoader extends ZepetoScriptBehaviour {

    Start() {
        // 设置角色生成位置
        const spawnInfo = new SpawnInfo();
        spawnInfo.position = new Vector3(0,2,0);
        // 设置角色生成旋转
        spawnInfo.rotation = Quaternion.Euler(0,0,0);

        // 从通过编辑器登录zepeto获取指定的用户id。
        ZepetoPlayers.instance.CreatePlayerWithUserId(WorldService.userId, spawnInfo, true);
        ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {
            const player: LocalPlayer = ZepetoPlayers.instance.LocalPlayer;
        });
    }
}
```
:::



使用屏幕中央的播放按钮检查角色的创建。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-SnH-VRscD0asbLuAkFAHn-20240904-102412.png)



如果你改变位置和方向值，你也可以创建一个躺着的角色。

:::CodeblockTabs
SpawnInfo 示例

```typescript
// 设置角色生成位置
const spawnInfo = new SpawnInfo();
spawnInfo.position = new Vector3(2,1,2);
// 设置角色生成旋转
spawnInfo.rotation = Quaternion.Euler(90,0,0);
```
:::

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-LEhj8lwHs8EU4xF5zKhOu-20240904-102412.png)

