Unity C#:如何从实例化对象内的脚本引用外部GameObject?
问题解决指南
1. 直接在编辑器赋值场景内对象
你完全可以给public GameObject Obj;赋值场景中已存在的对象,操作很简单:把Hierarchy面板里的目标对象直接拖到脚本组件的Obj字段上就行。如果拖不动,检查这几个点:
- 脚本必须挂载在场景中激活的GameObject上(不能是Project面板里的预制体,预制体上的脚本无法引用场景对象)
- 确认
Obj变量是public,没有被[HideInInspector]属性隐藏 - 如果目标是运行时才生成的对象,编辑器里没法拖,得用代码动态获取
2. 代码动态获取目标对象
如果没法手动拖,用代码查找是更灵活的方式:
- 通过对象名称查找:
void Start() { // 替换成你要移动的对象的名称 Obj = GameObject.Find("TargetObjectName"); if (Obj != null) Obj.transform.position = Vector3.zero; }
- 通过标签查找:先给目标对象设置专属标签(比如"MoveTarget"),再用标签查找:
void Start() { Obj = GameObject.FindGameObjectWithTag("MoveTarget"); if (Obj != null) Obj.transform.position = Vector3.zero; }
- 若目标是当前脚本所在对象的子物体:
void Start() { Obj = transform.Find("ChildObjectName").gameObject; if (Obj != null) Obj.transform.position = Vector3.zero; }
3. 实例化时传递目标引用
如果你的脚本是挂载在要实例化的预制体上,想让克隆出来的对象直接知道要操作哪个场景对象,可以在实例化时主动传递引用:
预制体上的脚本(比如叫MoveTargetScript):
public GameObject targetObj; void Start() { if (targetObj != null) targetObj.transform.position = Vector3.zero; }
然后在负责实例化的代码里:
public GameObject prefabToSpawn; // 拖你的预制体 public GameObject targetToMove; // 拖场景里的目标对象 void SpawnAndMove() { GameObject spawnedClone = Instantiate(prefabToSpawn); MoveTargetScript script = spawnedClone.GetComponent<MoveTargetScript>(); if (script != null) script.targetObj = targetToMove; }
内容的提问来源于stack exchange,提问作者Octogoon
相关产品推荐
相关产品推荐

