【问题标题】:raycast wont hit collider after using NGUI?使用 NGUI 后,raycast 不会击中对撞机?
【发布时间】:2017-06-16 02:10:08
【问题描述】:

在将主 UI 框架转换为 NGUI 后,我们发现我们无法再用碰撞器击中对象了,下面的代码在我们不使用 NGUI 时运行良好:

private void checkRayCast()
    {
        if ((Input.GetMouseButtonDown(0)))

        {

            Debug.Log("shoot ray!!!");

            Vector2 point = Camera.main.ScreenToWorldPoint(Input.mousePosition);

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit2;

            if (Physics.Raycast(ray, out hit2, 100))
            {

                //this should hit a 3d collider
                Debug.Log("we may hit something");
                Debug.Log(hit2.collider.gameObject.tag);
            }

            RaycastHit2D[] hits = Physics2D.RaycastAll(point, Vector2.zero, 0f);
            if (hits.Length != 0)
            {
                //this should all 2d collider
                Debug.Log(" ohh, we hit something");

            }
            else
            {
                Debug.Log("you hit nothing john snow!!!");
            }
            //if (hit.transform.gameObject.GetComponent<Rigidbody2D>() != null)
            //{

            //}
        }

    }

我们发现我们无法再击中 2d 对撞机或 3d 对撞机了

这是目标对象的检查器:

编辑

在遵循@programmer 的建议并将对撞机调整为非常大的大小后,检测到命中(感谢@programmer)

但是对撞机被改成太大了,以至于它无法制造场景。我们应该找出现在应该有多大。

  • 在场景中调整碰撞器大小之前 注意指示对撞机大小的绿色边框

  • 这是对撞机工作的那个,但应该大到不合理:

【问题讨论】:

  • 不知道你为什么要从UGUI切换到NGUI。如果您的项目是在 NGUI 之上构建的,但不要在 NGUI 之上创建新项目,则可以使用 NGUI。 UGUI 不仅为您提供了更多支持,Unity 2017 还将在 UGUI 中添加集成 TextMesh Pro,这甚至使它变得更好。 3 年前用 NGUI 就好了。
  • 对您的咆哮感到抱歉,但现在重新评估该决定还为时不晚。我注意到代码中有这么多Debug.Log....你看到任何日志吗?当你增加 Collider 的大小时会发生什么?也可以尝试禁用 Is Trigger。好久没用NGUI了,点击UISprite脚本上的“Collider”复选框会发生什么?它应该调整对撞机。只是向您抛出一些可能的解决方案。
  • @Programmer 感谢回复我们改成NGUI的原因是在尝试使用时遇到了很多坑,一个大问题是纹理与alpha重叠时的性能问题,显然它们这方面做得不好,还有一点就是把UGUI和世界上的游戏对象结合起来很不方便,就像我想从UI面板上拖一个东西到游戏世界一样。所以我们决定改用NGUI,直到UGUI可以完成这项工作。并且我会尝试增加碰撞器来检查 NGUI 的大小调整是否导致了这个问题。
  • 打印的日志表明光线投射没有击中任何东西,3d 或 2d 对撞机都不起作用。
  • 您的第一条评论很有道理。至于您的第二条评论,您可以通过将 Canva 的渲染模式更改为世界空间来将 ui 对象放入世界空间。你看到 `Debug.Log("shoot ray!!!");` 日志了吗?您是否也调整了 Collider 的大小以查看会发生什么?

标签: c# unity3d raycasting ngui


【解决方案1】:

在四处挖掘之后,我发现了这一点:

诀窍是我们在使用 NGUI 时应该使用UICamera.currentCamera 而不是Camera.main 来拍摄射线。

如果我们在游戏视图中点击这里发射射线:

如果我们添加如下一行:

Debug.DrawLine(ray.origin, ray.origin + ray.direction * 100, Color.red, 2, true);

之后

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

我们应该在 3d 模式下看到场景中的实际光线:

注意代表射线的红线,由于Camera.main的比例不同,它无法在所需的位置射击。

但如果我们将 carmera 更改为 UICamera 来拍摄光线,我们可以拍摄所需的光线。

Ray ray = UICamera.currentCamera.ScreenPointToRay(Input.mousePosition);

希望这可以帮助人们遇到同样的坑。

【讨论】:

    猜你喜欢
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2020-11-11
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    相关资源
    最近更新 更多