Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用NGUI后raycast不会击中对撞机?_C#_Unity3d_Raycasting_Ngui - Fatal编程技术网

C# 使用NGUI后raycast不会击中对撞机?

C# 使用NGUI后raycast不会击中对撞机?,c#,unity3d,raycasting,ngui,C#,Unity3d,Raycasting,Ngui,将主UI框架转换为NGUI后,我们发现我们无法再使用collider命中对象,因为下面的代码工作正常,我们没有使用NGUI: private void checkRayCast() { if ((Input.GetMouseButtonDown(0))) { Debug.Log("shoot ray!!!"); Vector2 point = Camera.main.ScreenToWorldPoint

将主UI框架转换为NGUI后,我们发现我们无法再使用collider命中对象,因为下面的代码工作正常,我们没有使用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)
            //{

            //}
        }

    }
private void checkRayCast()
{
if((Input.GetMouseButtonDown(0)))
{
Log(“射出光线!!!”;
Vector2点=Camera.main.ScreenToWorldPoint(Input.mousePosition);
Ray-Ray=Camera.main.screenpointoray(输入.鼠标位置);
RaycastHit2;
如果(物理.光线投射(光线,输出HIT2100))
{
//这应该击中3d碰撞器
Log(“我们可能碰到了什么”);
Log(hit2.collider.gameObject.tag);
}
RaycastHit2D[]hits=Physics2D.RaycastAll(点,矢量2.0,0f);
如果(hits.Length!=0)
{
//这应该是所有2d碰撞器
Log(“哦,我们碰到了什么”);
}
其他的
{
Log(“你没有击中任何东西,约翰·斯诺!!!”;
}
//if(hit.transform.gameObject.GetComponent()!=null)
//{
//}
}
}
我们发现我们再也打不到2d或3d对撞机了

以下是目标对象的检查器:

编辑 在遵循@programmer的建议并将碰撞器调整为一个非常大的碰撞后,检测到碰撞(谢谢,@programmer)

但对撞机被改得如此之大,以至于它无法制造场景。我们应该知道现在这个应该有多大

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

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


在四处挖掘之后,我发现:

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

如果我们在游戏视图中单击此处拍摄光线:

如果我们添加一行,如:

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

之后

Ray-Ray=Camera.main.screenpointoray(Input.mousePosition)

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

请注意代表光线的红线,它无法在所需位置拍摄,因为
摄影机。main
具有不同的比例

但是如果我们把卡梅拉换成UICamera来拍摄光线,我们就可以拍摄到我们想要的光线

Ray-Ray=ui相机.currentCamera.ScreenPointRoay(输入.鼠标位置)


希望这能帮助大家遇到同样的问题。

我不知道你为什么从UGUI转到NGUI。如果您的项目构建在NGUI之上,但不在NGUI之上创建新项目,那么使用NGUI是可以的。您不仅可以获得更多的UGUI支持,Unity 2017还将为UGUI添加集成功能,使其更加完善。3年前使用NGUI是可以的。很抱歉,现在重新评估这个决定还不算晚。我注意到代码中有这么多的
Debug.Log
,你看到任何日志了吗?增加对撞机的大小会发生什么?还可以尝试禁用触发器。很长时间没有使用NGUI了,但是当点击
UISprite
脚本上的“碰撞器”复选框时会发生什么?它应该调整对撞机。只是向您抛出一些可能的解决方案。@程序员感谢您的回复我们改为NGUI的原因是我们在尝试使用时遇到了很多凹坑,一个大问题是当纹理与alpha重叠时的性能问题,显然他们在这方面做得不好,另一件事是,将UGUI和世界上的游戏对象结合起来非常不方便,就像我想把一些东西从UI面板拖到游戏世界一样。因此,我们决定改用NGUI,直到UGUI完成任务。我会尝试增加一点碰撞器,以检查NGUI的大小调整是否导致了这个问题。并且有记录显示光线投射没有击中任何东西,3d或2d碰撞器都无法工作。你的第一个评论很有意义。对于第二个注释,可以通过将Canva的渲染模式更改为世界空间,将ui对象放置在世界空间中。你看到“Debug.Log”(“shot-ray!!!”)了吗日志您是否调整了碰撞器的大小以查看发生了什么?