Unity中如何获取父对象坐标以替换点击的Flag预制体实例
问题解决:Unity 点击Flag预制体实例替换对象的坐标获取方案
现有代码问题梳理
- 全局变量
CreatingBuildingDeleting_FlagObject无法区分3个不同的Flag实例,无法对应不同实例的父对象坐标 - 生成新对象时错误修改预制体本身的坐标,而非生成的实例坐标
Replace方法中错误使用预制体的坐标作为生成位置,未读取待替换Flag的对应坐标
实现方案
步骤1:给Flag预制体加独立点击脚本
每个Flag实例点击时主动传递自身对象到管理逻辑,避免全局变量冲突。脚本FlagItem.cs内容如下:
using UnityEngine; public class FlagItem : MonoBehaviour { // 提前在Inspector面板赋值建筑管理类实例 public BuildManager buildManager; // 若为UGUI对象,可改用IPointerClickHandler接口实现点击检测 private void OnMouseDown() { buildManager.RecordClickedFlag(gameObject); } }
步骤2:修正管理类逻辑
直接从传入的Flag实例读取坐标,操作生成的实例对象而非预制体:
using UnityEngine; public class BuildManager : MonoBehaviour { public GameObject barrackPrefab; public GameObject tentPrefab; private const float YPosition = 0.3f; private const float ZIndex = 5; // 存储当前被点击的Flag实例 private GameObject _currentClickedFlag; public void RecordClickedFlag(GameObject flag) { _currentClickedFlag = flag; } public void BuildBarrack() { if (_currentClickedFlag == null) return; ReplaceFlag(_currentClickedFlag, barrackPrefab); _currentClickedFlag = null; } public void BuildTent() { if (_currentClickedFlag == null) return; // 如需直接使用Flag自身坐标,去掉.parent即可 Vector3 parentPos = _currentClickedFlag.transform.parent.position; Vector3 spawnPos = new Vector3(parentPos.x, YPosition, ZIndex); // 生成新实例并指定位置 Instantiate(tentPrefab, spawnPos, Quaternion.identity); Destroy(_currentClickedFlag); _currentClickedFlag = null; } private void ReplaceFlag(GameObject toReplace, GameObject spawnPrefab) { // 按需选择使用Flag自身坐标或父对象坐标 Vector3 spawnPos = toReplace.transform.parent.position; Instantiate(spawnPrefab, spawnPos, Quaternion.identity); Destroy(toReplace); } }
坐标选择说明
- 若新对象需要和被点击的Flag位置完全一致,直接读取
toReplace.transform.position - 若新对象需要和Flag的父节点位置一致,读取
toReplace.transform.parent.position,建议添加空判断toReplace.transform.parent?.position避免父节点为空时报错
注意事项
- 3D/2D场景下使用
OnMouseDown需要给Flag预制体挂载对应碰撞体组件 - 所有属性修改操作都要作用于生成的实例对象,禁止直接修改预制体本身的属性
内容的提问来源于stack exchange,提问作者Varion Drakonov
相关产品推荐
相关产品推荐

