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

该`ref`和`out`关键字在 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"}



- 在添加的立方体的检查器中，点击“添加组件”并添加一个刚体。

![](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's DoTest() is executed.`);
    }
}
```



- 拖动并将 TestScript 连接到 Cube 的 Inspector。
- 点击 \[▶︎(播放)] 按钮以观察结果。
- 您可以在控制台日志窗口中检查引用对象、Rigidbody 组件和 ZEPETOScript 组件的成功情况。

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

