---
title: 游戏对象和组件
slug: world-sdk-guide-ch/6XyVzwvTKcSS0KXHChvxR
docTags: 
createdAt: 2024-09-02T08:34:13.135Z
---

在这个世界上，创建对象或修改或添加特定组件到对象是非常常见的。

ZEPETOScript 支持与 Unity 脚本相同的接口。

## GameObject 和组件的基本示例

创建和移除游戏对象：

:::CodeblockTabs
GameObject

```typescript
// GameObject 创建
const tempObj = new GameObject();
const obj = Object.Instantiate(tempObj);
 
// GameObject 销毁
Object.Destroy(obj);
```
:::

要获取 GameObjects 组件或添加新的组件，请使用 GetComponent 或 AddComponent。

:::CodeblockTabs
Component

```typescript
// 使用泛型的 GetComponent
const myTransform = this.GetComponent<Transform>();
 
// 使用泛型的 AddComponent
const animator = this.gameObject.AddComponent<Animator>();
```
:::



查看 GameObject 组件的完整代码示例。

这是一个示例，涵盖了 GameObject 的创建和属性修改、组件的添加以及销毁。

:::CodeblockTabs
GameObjectSample

```typescript
import { GameObject, Object, Transform, Animator, Vector3, WaitForSeconds } from 'UnityEngine';
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
 
export default class GameObjectSample extends ZepetoScriptBehaviour {
 
    private _testObject : GameObject;
 
    Start() {
 
        // 创建一个空的 GameObject
        const tempObj = new GameObject();
        this._testObject = Object.Instantiate(tempObj) as GameObject;
 
        // 改变对象的名称
        this._testObject.name = "TestObject";
 
        // 改变对象的变换信息
        this._testObject.transform.position = new Vector3(3,3,3);
 
        // 将组件附加到对象
        this._testObject.gameObject.AddComponent<Animator>();
 
        // 使用 GetComponent 的示例
        const animator = this._testObject.GetComponent<Animator>();
        if(animator != null) {
            console.log("GetComponent 成功");
        }
 
        // 使用协程在 5 秒后销毁对象
        this.StartCoroutine(this.DestroyObject());
 
    }
 
    *DestroyObject() {
        yield new WaitForSeconds(5);
 
        // 销毁 GameObject
        Object.Destroy(this._testObject);
    }
}  
```
:::



## 利用查找

Find 相关方法在 ZEPETOScript 中也支持与 Unity 脚本相同的接口风格。

| 方法                                  | 描述                                                                                   |
| ----------------------------------- | ------------------------------------------------------------------------------------ |
| GameObject.Find()                   | - 它根据当前场景中的名称查找并返回一个活动的 GameObject 对象。<br />- 如果未找到，则返回 null。                        |
| GameObject.FindGameObjectWithTag()  | - 它根据当前场景中的标签查找并返回一个活动的 GameObject 对象。<br />- 在活动对象中查找并返回第一个匹配指定标签的对象，如果未找到则返回 null。 |
| GameObject.FindGameObjectsWithTag() | - 查找当前场景中具有特定标签的所有活动 GameObject 对象，并将它们作为数组返回。<br />- 如果未找到，则返回空数组。                  |

例如，设置场景如下：

- 添加多个 3D 对象，并将它们的所有标签指定为 3D。
- 创建一个空对象以附加脚本，并将其重命名为 FindSample。

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



:::CodeblockTabs
TypeScript

```typescript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { GameObject, Transform } from 'UnityEngine';

export default class FindSample extends ZepetoScriptBehaviour {

    public tempObj1: GameObject;
    public tempObj2: GameObject;
    public tempObj3: GameObject[];

    Start() {    
        // 查找具有指定名称的目标 GameObject。
        // 如果多个 GameObject 具有相同的名称，将返回找到的第一个。
        this.tempObj1 = GameObject.Find("Cube");
        if(this.tempObj1 != null) {
            console.log("GameObject 查找成功");
        }
 
        // 查找具有指定标签的目标 GameObject。
        // 如果多个 GameObject 具有相同的标签，将返回找到的第一个。
        this.tempObj2 = GameObject.FindGameObjectWithTag("3D");
        if(this.tempObj2 != null) {
            console.log("FindGameObjectWithTag 成功");
        }
 
        // 返回具有指定标签的 GameObject 数组。
        this.tempObj3 = GameObject.FindGameObjectsWithTag("3D");
        if(this.tempObj3 != null) {
            console.log("FindGameObjectsWithTag 成功");
        }
    }
}
```
:::



- 当您在 FindSample 对象中添加脚本时，检查器是空的。

::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-brkQtTPkzO4PVeCeTWY0C-20240904-102427.png" size="66" width="484" height="554" position="center" showCaption="false"}



- 按下播放按钮以运行它，您可以在检查器窗口中确认每个对象已被分配，并通过控制台窗口检查查找对象的成功。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-v0TXlzool-ExIjeoQtL2q-20240904-102427.png)

## 创建预制件

让我们探索如何在运行时创建预制件。

- 首先，将一个 3D 对象 > 立方体 添加到场景中。

::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-n8sQHSZS0g09ODQKdPMFn-20240904-102428.png" size="50" width="592" height="742" position="center" showCaption="false"}



- 在立方体的检查器中按下添加组件，并添加刚体。

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



- 然后将立方体拖到项目区域以使其成为预制件。

::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-mzQZpGo5GJ00sZShBiWbC-20240904-102428.png" size="88" width="367" height="397" position="center" showCaption="false"}



- 由于我们将使用预制件，请删除场景中的立方体。



  ::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-YGeJYJrbHhKghMigpQObo-20240904-102428.png" size="62" width="326" height="327" position="center" showCaption="false"}


- 请编写以下脚本。

:::CodeblockTabs
TypeScript

```typescript
import { GameObject, Object, Vector3, WaitForSeconds } from 'UnityEngine';
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
 
export default class CloneSample extends ZepetoScriptBehaviour {
     
    public clonePrefab : GameObject;
 
    Start() {
 
        this.StartCoroutine(this.DoRoutine());
 
    }
 
    *DoRoutine() {
        while(true) {
            yield null;
            // Create a clone
            const clone = Object.Instantiate(this.clonePrefab) as GameObject;
             
            // Set the height of the clone object
            clone.transform.position = new Vector3(0, 10, 0);
             
            // Destroy it after 5 seconds of creation
            GameObject.Destroy(clone, 5);
            yield new WaitForSeconds(1);
        }
    }
}

```
:::

- 然后返回到Unity编辑器，将预制件拖到脚本检查器中以添加它。

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



- 按下播放按钮以检查每秒创建一个3D对象并从上方掉落。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-WsJD59NBM4Q9x0R_24yiH-20240904-102428.gif)

点击下面的链接以了解ZEPETOScript提供的Unity GameObjects和组件。



:::hint{type="info"}
**📘 创建GameObjects**
[https://docs.unity3d.com/2020.3/Documentation/ScriptReference/Object.Instantiate.html](https://docs.unity3d.com/2020.3/Documentation/ScriptReference/Object.Instantiate.html)
:::

:::hint{type="info"}
**📘 销毁GameObjects**
[https://docs.unity3d.com/2020.3/Documentation/ScriptReference/Object.Destroy.html](https://docs.unity3d.com/2020.3/Documentation/ScriptReference/Object.Destroy.html)
:::

:::hint{type="info"}
**📘 使用组件**
[https://docs.unity3d.com/kr/current/Manual/UsingComponents.html](https://docs.unity3d.com/kr/current/Manual/UsingComponents.html)
:::

