【问题标题】:How can I prevent non-trigger colliders from pushing each other in Unity?如何防止非触发碰撞器在 Unity 中相互推动?
【发布时间】:2021-01-27 06:47:30
【问题描述】:

我从 Unity 的资源商店中获得了预制的射弹,但无法找到让它们按我预期的方式工作的方法。

射弹有碰撞器(不是触发器)、刚体和一个以 .velocity 移动它们的脚本。它使用OnCollisionEnter 检测碰撞,使它们推动具有刚体的物体(不想要的行为)。

我确实可以使用OnTriggerEnter,但弹丸使用OnCollisionEnter 方法中的ContactPoint 生成粒子,OnTriggerEnter 无法访问该方法。我尝试使用光线投射模拟这个ContactPoint,但没有运气。可以从头重写代码,但前提是别无他法……

video 中,这个家伙与我的射弹、刚体和对撞机具有相同的设置,但是射弹并没有推动另一个物体,但他没有深入了解它的行为。

有什么想法吗?

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    您需要保持每帧的速度、角速度和位置,然后在 OnCollisionEnter 中添加一些代码,在其中告诉两个对撞机从现在开始相互忽略,并恢复射弹的原始速度,角度速度和位置。

        private Collider col;
        private Rigidbody rigidBody;
        private Vector3 vel;
        private Vector3 angularVel;
        private Vector3 position;
    
        private void Start() {
            col = gameObject.GetComponent<Collider>();
            rigidBody = gameObject.GetComponent<Rigidbody>();
        }
    
        private void FixedUpdate() {
            vel = rigidBody.velocity;
            angularVel = rigidBody.angularVelocity;
            position = transform.position;
        }
    
        private void OnCollisionEnter(Collision collision) {
            Physics.IgnoreCollision(col, collision.collider);
            rigidBody.velocity = vel;
            rigidBody.angularVelocity = angularVel;
            transform.position = position;
        }
    

    【讨论】:

    • 这对我不起作用,弹丸仍在推动敌人..
    • 这个脚本需要在你想忽略碰撞的物体上运行,所以你可能需要它在射弹和其他物体上,如果它们都有刚体的话
    【解决方案2】:

    在 Edit -> Project Settings -> Physics 中,您会在底部找到 Layer Collision Matrix。在这里您可以选择哪些图层与哪些图层发生碰撞。游戏对象的默认层是“默认”。为您的射弹和您不希望与之发生碰撞的游戏对象分配一个新层。然后您可以取消选中图层碰撞矩阵中代表这两个图层的框。现在这些游戏对象在碰撞时不会相互影响,并且不会为它们调用像 OnCollisionEnter 这样的方法。希望这能完全回答您的问题。

    【讨论】:

    • 但是我想调用 OnCollisionEnter,我只是不希望对象相互推动。如果可以调用该方法但它们之间的碰撞器没有,则层碰撞矩阵将起作用推。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多