游戏对象和组件
13 分
在这个世界上,创建对象或修改或添加特定组件到对象是非常常见的。
ZEPETOScript 支持与 Unity 脚本相同的接口。
GameObject 和组件的基本示例
创建和移除游戏对象:
// GameObject 创建
const tempObj = new GameObject();
const obj = Object.Instantiate(tempObj);
// GameObject 销毁
Object.Destroy(obj);要获取 GameObjects 组件或添加新的组件,请使用 GetComponent 或 AddComponent。
// 使用泛型的 GetComponent
const myTransform = this.GetComponent<Transform>();
// 使用泛型的 AddComponent
const animator = this.gameObject.AddComponent<Animator>();
查看 GameObject 组件的完整代码示例。
这是一个示例,涵盖了 GameObject 的创建和属性修改、组件的添加以及销毁。
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 对象。 - 如果未找到,则返回 null。 |
GameObject.FindGameObjectWithTag() | - 它根据当前场景中的标签查找并返回一个活动的 GameObject 对象。 - 在活动对象中查找并返回第一个匹配指定标签的对象,如果未找到则返回 null。 |
GameObject.FindGameObjectsWithTag() | - 查找当前场景中具有特定标签的所有活动 GameObject 对象,并将它们作为数组返回。 - 如果未找到,则返回空数组。 |
例如,设置场景如下:
- 添加多个 3D 对象,并将它们的所有标签指定为 3D。
- 创建一个空对象以附加脚本,并将其重命名为 FindSample。

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 对象中添加脚本时,检查器是空的。

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

创建预制件
让我们探索如何在运行时创建预制件。
- 首先,将一个 3D 对象 > 立方体 添加到场景中。

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

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

- 请编写以下脚本。
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编辑器,将预制件拖到脚本检查器中以添加它。

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

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