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
现在我正在 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