---
title: $ref と $unref
slug: world-sdk-guide-ja/dollarref-dollarunref
docTags: 
createdAt: 2024-09-02T08:34:13.135Z
---

その `参照` と `出力` キーワードは、C#で変数や構造体をメソッドに渡す際に使用されます。

TypeScriptでは、これらのキーワードは利用できませんが、ZEPETOScriptでは、次のように同様の機能を実現できます：`$ref` と `$unref`。

| 関数                | 説明                    |
| ----------------- | --------------------- |
| $ref(x?\:T):$Ref  | パラメータの参照を作成します        |
| $unref(x:$Ref)\:T | パラメータの参照を解放し、元の値を返します |



例として、次のようにシーンを設定しましょう：

- シーンに3Dオブジェクト、キューブを追加します。

::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-NdO0i7dLaDpFX1zUPm-6p-20240904-102412.png" size="52" width="592" height="742" position="center" showCaption="false"}



- 追加したキューブのインスペクターで、「コンポーネントを追加」をクリックし、Rigidbodyを追加します。

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



- シーンに空のGameObjectを追加します。
- 以下のRefSampleスクリプトを書き、ステップ3で作成したGameObjectに追加します。

```typescript
import { GameObject, Rigidbody } from 'UnityEngine'
import { ZepetoScriptBehaviour } from 'ZEPETO.Script'
import TestScript from './TestScript';
 
export default class RefSample extends ZepetoScriptBehaviour {
 
    Start() {   
        // "Cube"という名前のGameObjectを取得
        const testObject = GameObject.Find("Cube");
         
        // "Cube"オブジェクトからRigidbodyコンポーネントを取得
        const testComponent = GameObject.Find("Cube").GetComponent<Rigidbody>();
         
        // "Cube"オブジェクトからTestScriptコンポーネントを取得
        const testScript = GameObject.Find("Cube").GetComponent<TestScript>();
 
        // コンポーネントとオブジェクトへの参照を作成
        let tempObj = $ref(testObject);
        let tempComponent = $ref(testComponent);
        let tempScript = $ref(testScript);
 
        // Rigidbodyコンポーネントがnullでないか確認
        if(tempComponent != null) {
            // その参照の実際の値にアクセス
            let component = $unref(tempComponent);
            console.log(`コンポーネント名 : ${component}`);
        }
 
        // TestScriptコンポーネントがnullでないか確認
        if(tempScript != null) {
            // その参照の実際の値にアクセス
            let script = $unref(tempScript);
            script.DoTest();
        }
 
        // GameObject参照がnullでないか確認
        if(tempObj != null) {
            // その参照の実際の値にアクセス
            let objName = $unref(tempObj);
            console.log(`tempObj名 : ${objName.name}`);
        }
    }
}
```



- 別のZEPETOScriptを作成し、以下のTestScriptを書きます。

```typescript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script'
 
export default class TestScript extends ZepetoScriptBehaviour {
 
    DoTest() {   
        console.log(`TestScriptのDoTest()が実行されました。`);
    }
}
```



- TestScriptをCubeのInspectorにドラッグして接続します。
- \[▶︎(再生)]ボタンをクリックして結果を観察します。
- コンソールログウィンドウでオブジェクト、Rigidbodyコンポーネント、ZEPETOScriptコンポーネントの参照の成功を確認できます。

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

