---
title: ScriptableObject
slug: world-sdk-guide-kr/scriptableobject
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)



ZepetoScriptableObject에서 데이터를 호출하기 위해 ZEPETOScript 파일을 생성합니다.

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

