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

Unity中如何获取父对象坐标以替换点击的Flag预制体实例

问题解决:Unity 点击Flag预制体实例替换对象的坐标获取方案

现有代码问题梳理

  1. 全局变量CreatingBuildingDeleting_FlagObject无法区分3个不同的Flag实例,无法对应不同实例的父对象坐标
  2. 生成新对象时错误修改预制体本身的坐标,而非生成的实例坐标
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:36:05