---
title: スクリプタブルオブジェクト
slug: world-sdk-guide-ja/vikackU0NcQQgYgybVId3
docTags: 
createdAt: 2024-09-02T08:34:13.135Z
---

ZepetoScriptableObjectはUnity ScriptableObjectをサポートしています。ZepetoScriptableObjectは、ワールドデータ設定やキャラクターオプションなど、大量のデータを保存するデータコンテナです。

新しいZepetoScriptableObjectファイルを作成するには、プロジェクトパネルの左上隅にある\[+]アイコンをクリックするか、Assets → Create → 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を定義されたデータクラスとリンクすると、下記のようにInspectorウィンドウにそのデータが表示されます。

![](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"}



ZepetoScriptableObjectをZEPETOScriptのプロパティとして宣言します。

:::CodeblockTabs
TypeScript

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



ZEPETOScriptでInspectorウィンドウを開き、以下のようにZepetoScriptableObjectのプロパティに値を割り当てます。

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



このサンプルは、ZepetoScriptableObjectを使用し、その値にアクセスする方法を示しています。

:::CodeblockTabs
TypeScript

```typescript
// 名前による直接アクセス
console.log(`プレイヤー名 : ${this.player["name"]}`);
console.log(`プレイヤーHP : ${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(`敵HP : ${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(`プレイヤーHP : ${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(`敵HP : ${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})`);
    }
}
```
:::

