Unity Raycasting:"Camera.main.ScreenPointToRay" 有效,"new Ray(...)" 无效

Unity Raycasting: "Camera.main.ScreenPointToRay" works, "new Ray(...)" does not

现在我正在 Unity 引擎中进行行星生成项目。 当我想在星球表面放置植物时,我遇到了这个问题。

我的方法是将光线从行星中心向外投射到地表,得到植物的位置(因为地表不是平面球体,所以不知道具体位置)。但是我没有得到任何点击。

所以我尝试了几种方法来解决这个问题。我的发现对我来说很奇怪。 当我使用“新射线”创建射线时,我什么也得不到。但是对于“UnityEngine.Camera.main.ScreenPointToRay”,我得到了一些预期的点击率。所以这不是游戏对象层的问题。

对我来说,使用“new Ray”似乎有问题。

有人来解释一下吗?

    public void CreatePlants(List<PlantDefinition> plantSpeciesDefinitions)
    {
        foreach (PlantDefinition plantDefinition in plantSpeciesDefinitions)
        {
            directions = new Vector3[plantDefinition.maximumCount];
    
            for (int i = 0; i < plantDefinition.maximumCount; i++)
            {
                Vector3 direction = new Vector3(Random.Range(-1f, 1f), Random.Range(-1f, 1f), Random.Range(-1f, 1f));
                direction.Normalize();
                directions[i] = direction;
    
                Ray ray = new Ray(planetCenter, directions[i]); // does not give any hits
                Ray ray2 = UnityEngine.Camera.main.ScreenPointToRay(Input.mousePosition); // does give hits
    
                Physics.Raycast(ray2, out RaycastHit hit);
                    
                if(hit.collider != null) 
                    Debug.LogWarning($"Object hit: {hit.collider.gameObject.name}");
                    
            }
        }
    }

默认情况下,Unity 中的光线投射不会击中对撞机的“内部”/背面。

您从球体内部开始光线并希望从内部照射表面。

您必须通过代码

启用Physics.queriesHitBackfaces
private void Awake ()
{
    Physics.queriesHitBackfaces = true;
}

或通过 Physics Settings