【问题标题】:Unity collider going through other colliders at times?Unity collider 有时会通过其他对撞机?
【发布时间】:2016-05-03 07:15:31
【问题描述】:

我正在尝试创建一个 Pong 克隆用于练习。我在 2D 中设置我的项目。

桨有以下组件:

  • -Rigidbody2D(设置为kinematic
  • -BoxCollider2D(是trigger

球有以下组成部分:

  • -Rigidbody2D(设置为kinematic
  • -CircleCollider2D(是trigger

桨是通过拖动来控制的(用户在屏幕上左右拖动手指)。我为此使用了EasyTouch 插件。

然后我用这个脚本移动球:

void Update () {
        transform.position += new Vector3(xSpeed * Time.deltaTime, ySpeed * Time.deltaTime);
    }

这就是我检测碰撞并在球击中某物后重定向球的方式(水平对象是顶部/底部/桨,而垂直对象是左/右屏幕边框):

void OnTriggerEnter2D(Collider2D c)
    {
        if(c.gameObject.tag.Equals("Horizontal"))
        {
            ySpeed *= -1;
        }
        else if(c.gameObject.tag.Equals("Vertical"))
        {
            xSpeed *= -1;
        }

    }

问题是有时球会穿过球拍,这对最终用户来说可能会出现故障。我在网上搜索过这个,我试图将刚体的Collision Detection 属性设置为Continuous 而不是Discrete。但是球在某些时候仍然会通过桨。

有人知道如何解决这个问题吗?我在设置/编码游戏的方式上做错了什么?

谢谢

【问题讨论】:

  • 物理引擎没有问题,因为你没有使用任何物理。添加一些调试日志以检查您的球出现故障时发生的情况
  • 有趣的是,人们认为它更有可能是它的统一性错误而不是他们的错误。你为什么不搜索一个 pong 教程来寻找统一,有很多而且只需要一两个小时,但是如果你在尝试自己的想法之前知道事情是如何运作的,你就会避免很多挫折。请不要把它当作冒犯,即使我一开始有点讽刺:)
  • 感谢两位的建议。是的,我会继续学习教程并复习。很久没有接触游戏开发和 Unity 了。我又觉得自己像个新手了:P

标签: unity3d 2d collision rigid-bodies


【解决方案1】:

你有一个非常简单的概念错误。 OnTriggerEnter2D(Collider2D) 是获取对撞机是否进入了其他对撞机。换句话说,您可以遍历对象。

你需要改用这个函数:

OnCollisionEnter2D(Collision2D coll)

我建议你观看这个 Unity 教程,因为它很好地解释了这一切:https://unity3d.com/learn/tutorials/modules/beginner/physics/colliders

附加信息:http://docs.unity3d.com/ScriptReference/Collider2D.html

谢谢。

【讨论】:

  • 当我看到你的帖子时,我意识到根据我的需要应该是 OnCollisionEnter 而不是 OnTriggerEnter。我的菜鸟错误。我会继续你分享的教程!谢谢!
【解决方案2】:

如代码所示,transform是自己控制的,而连续检测需要物理引擎的控制,所以尽量用物理引擎控制gameObject,而不是给它一个自己代码修改的位置。

【讨论】:

  • 谢谢。我尝试将运动行为留给物理引擎,它不再通过对撞机,这很好。但是,产生的动作并不是我想要的乒乓球游戏。我会继续看一些关于这个的教程
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多