unity中OnTriggerEnter2D和Start哪个函数最先调用呢?

最近在写角色脚本的时候发现了一点小问题
首先角色之间的层级关系是这样的

这是一个Sand受到攻击后血量减少的脚本


一开始,想到SandCollision的父物体固定是Sand,而SandHp这个值是在Sand上的SandSharedData这个脚本里。

所以当SandCollision碰撞到子弹后,先要获取父物体Sand

所以我将获取Sand这个父物体的代码Sand=this.gameObject.transform.parent;写在了Start上,

但是当OnTriggerEnter2D与子弹碰撞后当运行Sand.GetComponent<SandSharedData>().Hp -= Atk;
(Atk是子弹的攻击力)时控制台总是在报错。


我便加了个Debug.Log(Sand);OnTriggerEnter2D来判断是否有获取到父物体。

让我震惊的是,预设体的在Start中获取父物体似乎不总是成功。有时候获取的是null空物体。

然后我也尝试将获取父物体的部分放到Update里面,但是结果还是为null

经过我反复测试后,在StartUpdate中获取父物体还是很容易为空。


所以我就开始思考是不是OnTriggerEnter2D它在运行中的优先级高于StartUpdate,可是当我找到一张关系图时



发现Start应该总是先于OnTriggerEnter2D运行才对。

所以我的Start先运行就不应该存在null的情况才对。

最后我还是没想明白这个问题。

于是干脆将Sand=this.gameObject.transform.parent;写进了OnTriggerEnter2D里面。事情就这样解决了。
(这样完全不会报错耶)


但是我还是很好奇我最初的想法是否有问题。还是说OnTriggerEnter2D先于Startunity的一个bug吗。

或者说在预制体中子物体的要先于父物体所以父物体一开始才为空吗?

有懂的大佬解释一下吗。


小结:所以当要获取一个父物体时应该将获取父物体的代码和对父物体操作的代码写在一起。


以上。

posted @ 2025-02-26 21:49  辰末之星  阅读(60)  评论(0)    收藏  举报