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

Unity中C#脚本获取List<Transform>的方法及预制体访问问题

解决Unity预制体外部List获取问题

核心思路

不修改Player预制体的情况下,只能通过运行时动态查找来获取外部GameObject的Transform。以下是几种可靠方案,同时解决你用标签报错的问题:

方案1:标签批量查找(修正你的原有方法)

你之前用标签报错,大概率是误用了GameObject.FindWithTag(仅返回单个对象),正确的批量查找方式如下:

private void GetTransformsByTag()
{
    // 替换成你的目标标签,比如"GunTip"
    GameObject[] taggedObjects = GameObject.FindGameObjectsWithTag("YourTargetTag");
    gunTips = new List<Transform>();
    
    foreach (var obj in taggedObjects)
    {
        if (obj != null)
        {
            gunTips.Add(obj.transform);
        }
    }

    // 空判断,避免后续逻辑报错
    if (gunTips.Count == 0)
    {
        Debug.LogWarning("未找到对应标签的Transform");
    }
}

在Start()方法里调用这个函数,替换原有的Inspector赋值逻辑即可。

方案2:按名称前缀过滤查找

如果外部对象有统一命名规则(比如"PredictionPoint_0"、"PredictionPoint_1"),可以直接按名称过滤:

private void GetPredictionPointsByName()
{
    predictionPoints = new List<Transform>();
    
    // 遍历场景中所有Transform,筛选名称前缀匹配的对象
    foreach (var transform in FindObjectsOfType<Transform>())
    {
        if (transform.name.StartsWith("PredictionPoint_"))
        {
            predictionPoints.Add(transform);
        }
    }
}

方案3:全局管理器单例(最稳定的长期方案)

创建一个全局管理器,提前把需要访问的Transform存入List,通过单例直接获取,完全避免查找出错:

  1. 创建TransformManager脚本:
public class TransformManager : MonoBehaviour
{
    public static TransformManager Instance;
    public List<Transform> gunTips;
    public List<Transform> predictionPoints;

    private void Awake()
    {
        Instance = this;
        // 可以在Inspector手动拖入,也用上面的动态方法填充List
    }
}
  1. 在你的DualHooks脚本中调用:
private void Start()
{
    ListSetup();
    // 直接从单例获取外部Transform List
    gunTips = TransformManager.Instance.gunTips;
    predictionPoints = TransformManager.Instance.predictionPoints;
}

针对你的DualHooks脚本的修改建议

把ListSetup()中的空List初始化,替换为动态获取逻辑:

private void ListSetup()
{
    predictionHits = new List<RaycastHit>();
    swingPoints = new List<Vector3>();
    joints = new List<SpringJoint>();
    swingsActive = new List<bool>();
    grapplesActive = new List<bool>();
    currentGrapplePositions = new List<Vector3>();

    // 新增:动态获取外部Transform
    GetTransformsByTag();
    GetPredictionPointsByName();

    for (int i = 0; i < amountOfSwingPoints; i++)
    {
        predictionHits.Add(new RaycastHit());
        joints.Add(null);
        swingPoints.Add(Vector3.zero);
        swingsActive.Add(false);
        grapplesActive.Add(false);
        currentGrapplePositions.Add(Vector3.zero);
    }
}

常见报错排查

  • 空引用异常:确认目标对象已添加对应标签、场景中存在该对象;查找后必须做非空判断。
  • 索引越界:获取List后检查Count是否与amountOfSwingPoints匹配,避免后续循环访问不存在的索引。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:25:35