子对象在频繁传送时不跟随父对象

问题描述

Game Screen

Teleportation Code

Child Objects And Their Original Location

我是 Unity 的新手,所以在参加了一些 Unity2D 的常规在线课程后,我想添加不同的功能,其中我决定做的第一个事情是在 Portal 中生成一个弹丸您可以在两个连接的门户之间传送。但是,我遇到了一个问题。当我传送我的角色时,有时,通常是当我传送太快但随时可能发生时,玩家游戏对象的子对象倾向于移动,我不明白为什么。 **我想:

  1. 了解为什么父对象和子对象之间的偏移会通过传送发生变化。
  2. 知道如何解决这个问题,最好是在我作为 Unity 初学者可以轻松理解的代码中。也最好以一种不涉及我通过添加偏移量的变换位置不断将子对象附加到父对象的方式,尽管如果这是最简单的解决方案,我不反对尝试。**

值得注意的是偏移量的变化也是不同的,我有一个名为Feet的子对象,它检测跳跃的地面,当它第一次打破时,它似乎停留在前一个传送门的位置。然而,另一个名为 Gun 的子对象,它是弹丸产生的地方,它似乎只向下移动一点点,这意味着它们在破裂时的偏移方式不一致。可能是因为 Feet 有一个碰撞器,但我不确定,不太了解,只觉得值得一提。

methods: {
    getValidationState({
        dirty,validated,valid = null
    }) {
        return dirty || validated ? valid : null;
    },}

为了简化问题,当我有时立即更改父对象的位置时,子对象相对于父对象的位置会发生变化,为什么会发生这种情况以及如何在不简单地在 Update 方法中使用 transform.position 的情况下解决此问题如果可能,不断将子级附加到父级。

解决方法

我会查看您的 OnTriggerEnter2D 方法的 if 语句以寻求解决方案。

private void OnTriggerEnter2D(Collider2D collision)
{
    if (boxCollider2D.IsTouchingLayers(LayerMask.GetMask("Player")) && firstEntered)
    {
        Teleport(collision.gameObject);
        otherPortalComponent.SetFirstEnteredFalse();
    }
}

因为你使用的是 OnTrigger进入这个方法只会用你的脚调用,因为你的玩家的主要碰撞器不是触发器。这意味着您调用 Teleport 方法的 collision 变量实际上是您的脚对象,而不是玩家的身体对象。因此,您正在使用 Teleport 方法更改脚与玩家的偏移。

我会尝试将您的碰撞方法更改为 OnCollisionEnter2D(Collision2D) 它会在玩家进入时拾取它的基础碰撞器,而不是脚部碰撞器。

void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.GetComponent<Player>() && firstEntered)
    {
        Teleport(collision.gameObject);
        otherPortalComponent.SetFirstEnteredFalse();
    }
}

由于播放器脚本与您的基本播放器碰撞器位于同一对象上,因此您可以执行简单的 GetComponent<Player>() 调用来检查它是否是播放器对象。尽管您仍然可以使用图层来检查是否需要。