子对象无法将游戏对象添加到其父对象(子对象通过 trigger-collider 获取对象)

Posted

技术标签:

【中文标题】子对象无法将游戏对象添加到其父对象(子对象通过 trigger-collider 获取对象)【英文标题】:A child object cant add a gameobject to his parent (child gets the object with trigger-collider) 【发布时间】:2022-01-19 21:52:12 【问题描述】:

嗨,

我的 2d unity 项目有问题。

我的目标是什么:

我想要一个带有额外碰撞器的玩家。这个 Collider 应该将每个带有“Stone”标签的游戏​​对象放在一个列表中。

我尝试了什么:

我创建了另一个对象,它是我的播放器对象的子对象。 子对象有一个圆形 2d 对撞机(设置为触发器),应该将所有带有“石头”标签的东西放在其父对象的游戏对象列表中。当我撞到一块石头时,这给了我一个错误(有关更多详细信息,请参见下文)。 然后我尝试将它放在子对象的列表中并且它起作用了。我无法真正想象为什么它适用于孩子而不是父母。

这里是脚本:

stompRadiusCollScript(child) 的相关部分:
public class stompRadiusCollScript : bendingScript

    private GameObject parent;
    private List<GameObject> colls;
    void Start()
    
        colls = new List<GameObject>();
        parent = base.gameObject;
    
    private void OnTriggerEnter2D(Collider2D givenCollider)
    
        if (givenCollider.tag == "Stone")
        
            GameObject co = givenCollider.gameObject;
            //is able to add in Child List
            colls.Add(co);
            //cannot add in parent list
            //throws error
            currCollisions.Add(co);
        
    
错误信息是什么:
NullReferenceException: Object reference not set to an instance of an object
stompRadiusCollScript.OnTriggerEnter2D (UnityEngine.Collider2D givenCollider)
bendingScript(parent)的相关代码:
public class bendingScript : MonoBehaviour

    protected List<GameObject> currCollisions;
    public Collider2D coll;
    private System.DateTime _lastTimeStompAttack;
    private float _stompAttackMinDelayInMs = 500f;
    private float _forceForStone = 100f;
    void Start()
    
        currCollisions = new List<GameObject>();
        coll  = GetComponent<CircleCollider2D>();
        _lastTimeStompAttack = DateTime.UtcNow;
    

附加信息:
带有石头标签的对象有一个刚体2d和一个circlecollider2d

问题:

我如何将我所有的石头碰撞作为游戏对象放在父级列表中(bendingScript)?

【问题讨论】:

您没有在stompRadiusCollScript 中初始化currCollisions,因为bendingScript.Start 是隐藏的。这回答了你的问题了吗? How to correctly inherit Unity's callback functions like Awake(), Start() and Update and FixedUpdate()? ### 这解决了一个问题。谢谢。但我以某种方式创建了 2 个对象,并以这种方式创建了 2 个单独的列表。孩子有另一个列表而不是父母。 ###### 我在父项中添加的内容:protected virtual void Start() ###### 我在子项中添加的内容:protected override void Start() base.Start; 我有点知道继承在控制台应用程序上的作用,但它是如何实现的在这里工作?据我所知,孩子是父母的高级版本,那么我怎么能只在世界上添加孩子呢?还是我误会了什么? 【参考方案1】:

您可以将列表保留在子对象中,然后在需要时访问子对象,而不是在父对象中拥有一个列表。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于子对象无法将游戏对象添加到其父对象(子对象通过 trigger-collider 获取对象)的主要内容,如果未能解决你的问题,请参考以下文章

Qt:子对象可以在其父对象中组合吗?

如何通过脚本查找 GameObject 的子对象或附加到子 GameObject 的脚本

JavaScript 中的对象继承

使用猫鼬将对象数组添加到子文档

Unity,改变子对象的旋转。无法访问子对象

QT之对象父子关系