---
title: 可编程对象
slug: world-sdk-guide-ch/7azakGCXolkvIdRbplxEu
docTags: 
createdAt: 2024-09-02T08:34:13.135Z
---

ZepetoScriptableObject 支持 Unity ScriptableObject。ZepetoScriptableObject 是一个数据容器，可以保存大量数据，例如世界数据设置和角色选项。

要创建一个新的 ZepetoScriptableObject 文件，请单击项目面板左上角的 \[+] 图标，或单击资产 → 创建 → ZEPETO → ScriptableObject。

::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-ly1N62ko5k7yD_oi9a2Eg-20240904-102418.png" size="60" width="754" height="630" position="center" showCaption="false"}



新创建的 ZepetoScriptableObject 需要通过创建具有定义数据类的脚本进行连接。

::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-UBN5P5kclKDUF0wl5s31n-20240904-102418.png" size="68" width="585" height="246" position="center" showCaption="false"}

创建一个新的 ZEPETOScript 文件，并声明您将用作成员变量的数据。

以下是一些可以用作数据的示例代码。

:::CodeblockTabs
TypeScript

```typescript
import { Vector3, Quaternion } from 'UnityEngine';

export default class PlayerScriptObjectDef {  

    public name: string;
    public hp: number;      
    public position: Vector3;
    public rotation: Vector3;
 }
```
:::



当您将 ZEPETOScript 与定义的数据类链接到 ZepetoScriptableObjects 时，您将在检查器窗口中看到这些数据，如下所示。

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



创建一个 ZEPETOScript 文件以从 ZepetoScriptableObject 中调用数据。

从 ZEPETOScript 导入 ZepetoScriptableObject，并导入您声明的数据类型。

:::CodeblockTabs
TypeScript

```typescript
import { ZepetoScriptableObject } from 'ZEPETO.Script';
import PlayerScriptObjectDef from './playerDefine/PlayerScriptObjectDef';
```
:::



::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-WoXCJ6ZSrzFbrmoDprSmZ-20240904-102418.png" size="50" width="247" height="98" position="center" showCaption="false"}



在ZEPETOScript中声明ZepetoScriptableObject的属性。

:::CodeblockTabs
TypeScript

```typescript
public player: ZepetoScriptableObject<PlayerScriptObjectDef>;
public enemy: ZepetoScriptableObject<PlayerScriptObjectDef>;
```
:::



在ZEPETOScript中打开检查器窗口，为ZepetoScriptableObject属性分配值，如下所示。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-FlWp-r09qaGr43OQPrc7l-20240904-102418.png)



这个示例展示了如何使用ZepetoScriptableObject并访问它的值。

:::CodeblockTabs
TypeScript

```typescript
// 通过名称直接访问
console.log(`玩家名称 : ${this.player["name"]}`);
console.log(`玩家生命值 : ${this.player["hp"]}`);      
console.log(`玩家位置 : (${this.player["position"].x}, ${this.player["position"].y}, ${this.player["position"].z})`);
console.log(`玩家旋转 : (${this.player["rotation"].x}, ${this.player["rotation"].y}, ${this.player["rotation"].z})`);
 
// 通用数据调用
let monsterState = this.enemy.targetObject;
console.log(`敌人名称 : ${monsterState.name}`);
console.log(`敌人生命值 : ${monsterState.hp}`);
console.log(`敌人位置 : (${monsterState.position.x}, ${monsterState.position.y}, ${monsterState.position.z})`);
console.log(`敌人旋转 : (${monsterState.rotation.x}, ${monsterState.rotation.y}, ${monsterState.rotation.z})`);
```
:::



要访问原始类型的成员变量，请将其声明为通用类型或使用类型转换，如下面的示例所示。

:::CodeblockTabs
TypeScript

```typescript
// 类型转换
let playerPosition = this.player["position"] as Vector3;
console.log(`玩家位置 : (x:${playerPosition.x}, y:${playerPosition.y}, z:${playerPosition.z})`);
  
// 通用类型可以访问类成员
console.log(`敌人位置 : (x:${monsterState.position.x}, y:${monsterState.position.y}, z:${monsterState.position.z})`);
```
:::



查看ScriptableObject的完整代码示例。

:::CodeblockTabs
TypeScript

```typescript
import { Vector3 } from 'UnityEngine';
import { ZepetoScriptBehaviour, ZepetoScriptableObject } from 'ZEPETO.Script';
// 导入脚本化对象类型定义
import PlayerScriptObjectDef from './playerDefine/PlayerScriptObjectDef'; 

export default class ScriptableObjectSample extends ZepetoScriptBehaviour {

    public player: ZepetoScriptableObject;
    // 泛型类型调用
    public enemy: ZepetoScriptableObject<PlayerScriptObjectDef>; 

    Awake() {
        // 通过名称直接访问
        console.log(`玩家名称 : ${this.player["name"]}`);
        console.log(`玩家生命值 : ${this.player["hp"]}`);
        console.log(`玩家位置 : (${this.player["position"].x}, ${this.player["position"].y}, ${this.player["position"].z})`);
        console.log(`玩家旋转 : (${this.player["rotation"].x}, ${this.player["rotation"].y}, ${this.player["rotation"].z})`);

        // 泛型数据调用
        let monsterState = this.enemy.targetObject;
        console.log(`敌人名称 : ${monsterState.name}`);
        console.log(`敌人生命值 : ${monsterState.hp}`);
        console.log(`敌人位置 : (${monsterState.position.x}, ${monsterState.position.y}, ${monsterState.position.z})`);
        console.log(`敌人旋转 : (${monsterState.rotation.x}, ${monsterState.rotation.y}, ${monsterState.rotation.z})`);

        // 类型转换
        let playerPosition = this.player["position"] as Vector3;
        console.log(`玩家位置 : (${playerPosition.x}, ${playerPosition.y}, ${playerPosition.z})`);

        // 泛型类型可以访问类成员
        console.log(`敌人位置 : (${monsterState.position.x}, ${monsterState.position.y}, ${monsterState.position.z})`);
    }
}
```
:::

