【问题标题】:Detecting collisions in unity without actually applying force to the object统一检测碰撞而不实际对物体施加力
【发布时间】:2020-09-09 13:37:24
【问题描述】:

嘿,所以我正在制作一个与 Flappy Bird 非常相似的 2D 游戏(点击屏幕时你会跳跃)。游戏的重点是抓住向你走来的绿色方块。


我遇到的问题是,当我的玩家撞到绿色方块时,它似乎会与它发生碰撞(它会将玩家抛向某个随机方向,甚至像撞墙一样停在原地),即使在碰撞绿色方块时也是如此正在被摧毁。 因此,每当玩家击中绿色方形预制件时,它会增加分数并破坏方形,但有时当我在击中方形之前跳跃时它会停止,就像它与它相撞一样直接通过。


玩家预制件有一个刚体组件和一个 2d 方形碰撞器。 绿色方形预制件只附加了一个 2d 方形碰撞器组件。


我对 Unity 很陌生,这是我开始开发的第一款游戏。 如果您需要任何进一步的信息,请随时询问。


Here is the player's rigidbody and 2d collider settings


Here is the green square's 2d collider settings


也许这张游戏画面可以提供帮助。 想象蓝色方块是玩家,绿色方块是你必须击中的点,红色的东西只是杀死你的敌人,所以不要介意他们。玩家站着不动,绿色方形预制件附有一个脚本,为他们增加了恒定的力量。希望这让它更清晰。

【问题讨论】:

  • 绿色元素是否需要相互碰撞或与其他东西碰撞?如果没有,您可以使用triggers“配置为触发器的对撞机(使用 Is Trigger 属性)不会像实体对象那样运行,只会允许其他对撞机通过。”
  • 你能提供你的GameObjects配置的截图吗?主要是刚体和方形碰撞器?
  • 好的,为了让事情更清楚一点,绿色的东西有一个恒定的力施加在它们身上,以便从屏幕一侧移动到玩家身边。它们只与玩家互动,而不是彼此或其他游戏对象。

标签: c# unity3d


【解决方案1】:

有一个非常有用的统一函数可以检测碰撞器何时接触另一个碰撞器。
它是:void OnCollisionEnter(...)

您还必须传入ColliderCollider2d。所以它看起来像:

  • void OnCollisionEnter(Collider col)
  • void OnCollisionEnter(Collider2D col)

当然,您还必须在顶部有统一引擎的必要导入语句。

【讨论】:

    【解决方案2】:

    您可能希望在绿色方块上使用触发器。那么小鸟被允许通过 true 但方块会在你的脚本中激活你的 OnTriggerEnter 代码。

    所以你可以尝试的是:

        public void OnTriggerEnter(Collider other)
        {
            if (other.tag == "Player")
                {
                //Run your code here!!!
                //for example
                 Rigidbody rb = other.gameObject.GetComponent<Rigidbody>();
                rb.AddForce(new Vector3(1, 1, 1));
                }
        }
    

    这将为您的玩家/小鸟增加力量。但您可以在该方法中运行任何代码。

    【讨论】:

    • 嘿,我还是不太明白 OnTriggerEnter 和 OnCollisionEnter 的区别,请您给我解释一下。在我的代码中,我使用了 OnCollisionEnter。
    • @Tudoraster 你能分享代码吗?如果不查看有问题的代码,就很难为您的问题提供一个体面的解决方案。
    【解决方案3】:

    当物体被刚体击中时,OnTriggerEnter 和 OnCollisionEnter 都会运行。但是使用 OntriggerEnter 你可以通过对象。因为它不受其他物理对象的影响。但是 onCollision 通常会这样做,除非您将其冻结在适当的位置。

    旁注 OnTriggerEnter 在 FixedUpdate 中运行,因此它在每一帧结束时运行

    【讨论】:

    • 谢谢,如果我检查了碰撞器上的触发框,这意味着我必须使用 OnTriggerEnter 函数对吗?
    • 是的。如果你检查 isTrigger 它运行 OnTriggerEnter。
    • 当对象应该是静态的和/或对象不能通过物理交互时,我建议使用 OnTriggerEnter。就像检查站的对撞机。但是您的问题应该可以通过此解决方案解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2018-06-20
    • 2015-02-10
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多