You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何用C#复制GameObject及其所有子对象(含当前状态)?

在Unity中复制GameObject及其所有子对象的方法

当然可以!在Unity里用C#完全能实现复制一个GameObject及其所有子对象,并且完整保留它们的当前状态——包括你提到的相对位置、文本内容、字体、颜色这些细节,完全不需要依赖Prefab来完成。

核心实现方法

Unity自带的Instantiate方法就是干这个的,直接实例化父对象时,默认会自动复制所有子对象以及它们身上所有组件的当前属性值。

代码示例

假设你要复制的目标对象是场景中的某个空GameObject,代码可以这么写:

// 获取你要复制的原始对象(可以根据名称、标签或者直接引用获取)
GameObject originalParent = GameObject.Find("你的空GameObject名称");

// 直接实例化,会自动复制所有子对象和组件状态
GameObject copiedParent = Instantiate(originalParent);

// 给副本改个名字,避免和原对象重名混淆
copiedParent.name = originalParent.name + "_Copy";

// 可选:如果需要指定副本的父物体或者位置旋转,用重载版本
// GameObject copiedParent = Instantiate(originalParent, new Vector3(0,0,0), Quaternion.identity);
// copiedParent.transform.SetParent(yourTargetParentTransform);

关键说明

  • 这个方式会完整复制所有子对象的Transform属性(相对位置、旋转、缩放),以及Text组件的text值、font、color、fontSize等所有当前设置,相当于原对象的“实时快照”。
  • 不管是Unity内置组件还是你自己写的自定义组件,只要是可序列化的(默认Unity组件都满足,自定义组件只要没加[NonSerialized]特性),都会被完整复制。
  • 如果原对象或子对象有引用场景内其他对象的组件(比如Image的Sprite引用),副本会保留这个引用。如果需要修改这些引用,可以在实例化后遍历子对象进行调整。

小提示:如果复制后发现某些属性没被正确复制,检查一下对应的组件是否被标记为不可序列化,或者有没有在运行时动态修改的属性没被正确保存(不过一般Unity内置组件都不会有这个问题)。

内容的提问来源于stack exchange,提问作者Stephen Docy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:39:26