【问题标题】:Unity - how to get collision angle on trigger enter?Unity - 如何在触发器输入时获得碰撞角度?
【发布时间】:2012-09-28 03:48:32
【问题描述】:

我正在尝试构建一个破砖游戏,我想根据球击中球拍的位置来瞄准球。 例如,如果球击中桨的右边缘,它应该向右(向上)。 假设桨有一个盒子(或胶囊)对撞机,而球有一个球对撞机,我该怎么做? 感谢您的帮助!

我也想获得打击垫的速度。下面的代码返回 0,有什么想法吗?

function OnTriggerEnter(other:Collider)
{
    if(other.rigidbody){
    V_pad=other.rigidbody.velocity;
    //Here it returns (0,0,0) , also tried other.attachedRigidbody
    }    

    if(other.name=="Pad"){
    rigidbody.velocity = 
Vector3(rigidbody.velocity.x, Mathf.Abs(rigidbody.velocity.y + V_pad),0); 
//this part executes but with V_pad.y=0
    }
}

【问题讨论】:

    标签: unity3d collision angle


    【解决方案1】:

    当两个碰撞体在 Unity 中接触时,OnCollisionEnter 方法将在您添加到同一个游戏对象的任何组件中调用。如果您使用Collision 参数定义该方法,您将获得包括两个对撞机之间的接触点的信息。您可以使用此信息来计算出您的球触及球棒的位置。

    请注意,从球的角度来看,这将始终是球体“底部”的一个点。您可能还需要考虑球的速度角度。

    编辑:另一种方法(根据您的评论)可能是使用Collider.ClosestPointOnBounds。如果您使用bat.ClosestPointOnBounds(ball) 之类的东西,您将获得球棒上最靠近球的点的Vector3 - 对于球形球来说,这将是碰撞点。

    【讨论】:

    • 谢谢,但我正在处理 OnTriggerEnter(c:collider) 中的碰撞,我无法获取 c.contacts[0],有什么方法可以将碰撞器转换为碰撞?
    • col.ClosestPointOnBounds(transform.position) 对我有用,谢谢! :)
    【解决方案2】:

    尝试使用 Vector3D 类来确定球的方向,然后根据它应该击中的表面来改变向量的那个分量。使用 Unity Vector3D API 获取更多帮助。祝你好运。

    【讨论】:

      【解决方案3】:

      或者对桨也使用球形对撞机。您可以将对撞机的中心移动到桨后面一点点,然后缩放对撞机以满足您的需要。

      【讨论】:

        【解决方案4】:

        您需要取消选中碰撞器中的 Is Trigger 设置,并使用 OnCollision 而不是 OnTrigger。在 OnCollision 中,您可以使用类似这样的方法来计算输出方向。

        var direction = Vector3.Reflect(lastFrameVelocity.normalized, collision.contacts[0].normal);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多