【发布时间】:2021-06-27 15:42:30
【问题描述】:
我正在尝试将相同的组件添加到 Unity 场景中的不同游戏对象。为了让它更快,我正在尝试编写一个脚本来为游戏对象列表执行此操作,例如 (enemy1, enemy2, enemy3...)。
我知道添加一个名为 Enemy 的脚本我会这样做:
gameObject.AddComponent<Enemy>();
但问题是一旦我停止播放模式,组件就消失了。有没有办法做到这一点?
【问题讨论】:
我正在尝试将相同的组件添加到 Unity 场景中的不同游戏对象。为了让它更快,我正在尝试编写一个脚本来为游戏对象列表执行此操作,例如 (enemy1, enemy2, enemy3...)。
我知道添加一个名为 Enemy 的脚本我会这样做:
gameObject.AddComponent<Enemy>();
但问题是一旦我停止播放模式,组件就消失了。有没有办法做到这一点?
【问题讨论】:
您可以通过按住ctrl直接从层次结构中选择所有游戏对象(您提到的敌人列表),然后在检查器中将脚本Enemy添加到所有对象中。
但是,如果您想使用脚本来执行此操作,可以在播放模式之外执行,您需要在脚本前添加ExecuteInEditMode,如下所示:
[ExecuteInEditMode]
public class TriggerEdit : MonoBehaviour
{
// List of GameObjects
String[] enemyList = {"enemy1", "enemy2", "enemy3"};
void OnEnable()
{
foreach(String enemy in enemyList){
go = GameObject.Find(enemy);
go.AddComponent<Enemy>();
}
}
}
然后您需要将该脚本添加到场景中的任何游戏对象。每次要触发脚本时,只需在编辑器中禁用和启用脚本TriggerEdit:
这种方法的一个问题是,每次启用脚本时,它都会添加一个新组件,如果游戏对象中已经存在Enemy 类型的组件,那么您最终可能会得到很多@ 987654329@ 组件。您可以尝试在添加任何新内容之前清理场景中的所有Enemy 组件。例如:
object[] enemiesToDelete = GameObject.FindObjectsOfType<Enemy>();
foreach(UnityEngine.Object enemyComponent in enemiesToDelete)
{
DestroyImmediate(enemyComponent);
}
【讨论】: