我如何在没有 physics/raycast 的情况下检测附近的游戏对象?
How can I detect nearby GameObjects without physics/raycast?
我正在尝试检测以玩家为原点的范围内的物体。
我如何在不使用碰撞器的情况下从玩家周围的给定区域找到 Transforms
或 Physics.OverlaptSphere()
我不想使用此方法,因为我需要的唯一信息是从给定的附近对象转换LayerMask
(更具体地说,位置和旋转)如果我要使用物理学,我将不得不在我认为不必要的每个点上放置一个触发器。
是否有其他方法可以找到附近的点,但与使用物理学的方法相似?
如果您想在没有物理或碰撞器的情况下执行此操作,请访问所有对象。遍历它们,检查图层,如果它们匹配,则使用 Vector3.Distance
比较每个对象的距离。 Return 结果。
List<GameObject> findNearObjects(GameObject targetObj, LayerMask layerMask, float distanceToSearch)
{
//Get all the Object
GameObject[] sceneObjects = UnityEngine.Object.FindObjectsOfType<GameObject>();
List<GameObject> result = new List<GameObject>();
for (int i = 0; i < sceneObjects.Length; i++)
{
//Check if it is this Layer
if (sceneObjects[i].layer == layerMask.value)
{
//Check distance
if (Vector3.Distance(sceneObjects[i].transform.position, targetObj.transform.position) < distanceToSearch)
{
result.Add(sceneObjects[i]);
}
}
}
return result;
}
这可以通过使用 Scene.GetRootGameObjects
检索所有 GameObjects
但它不会 return 标记为 DontDestroyOnLoad
的对象来改进。
扩展为扩展函数:
public static class ExtensionMethod
{
public static List<GameObject> findNearObjects(this GameObject targetObj, LayerMask layerMask, float distanceToSearch)
{
GameObject[] sceneObjects = UnityEngine.Object.FindObjectsOfType<GameObject>();
List<GameObject> result = new List<GameObject>();
for (int i = 0; i < sceneObjects.Length; i++)
if (sceneObjects[i].layer == layerMask.value)
if (Vector3.Distance(sceneObjects[i].transform.position, targetObj.transform.position) < distanceToSearch)
result.Add(sceneObjects[i]);
return result;
}
}
用法:
List<GameObject> sceneObjects = gameObject.findNearObjects(layerMask, 5f);
我正在尝试检测以玩家为原点的范围内的物体。
我如何在不使用碰撞器的情况下从玩家周围的给定区域找到 Transforms
或 Physics.OverlaptSphere()
我不想使用此方法,因为我需要的唯一信息是从给定的附近对象转换LayerMask
(更具体地说,位置和旋转)如果我要使用物理学,我将不得不在我认为不必要的每个点上放置一个触发器。
是否有其他方法可以找到附近的点,但与使用物理学的方法相似?
如果您想在没有物理或碰撞器的情况下执行此操作,请访问所有对象。遍历它们,检查图层,如果它们匹配,则使用 Vector3.Distance
比较每个对象的距离。 Return 结果。
List<GameObject> findNearObjects(GameObject targetObj, LayerMask layerMask, float distanceToSearch)
{
//Get all the Object
GameObject[] sceneObjects = UnityEngine.Object.FindObjectsOfType<GameObject>();
List<GameObject> result = new List<GameObject>();
for (int i = 0; i < sceneObjects.Length; i++)
{
//Check if it is this Layer
if (sceneObjects[i].layer == layerMask.value)
{
//Check distance
if (Vector3.Distance(sceneObjects[i].transform.position, targetObj.transform.position) < distanceToSearch)
{
result.Add(sceneObjects[i]);
}
}
}
return result;
}
这可以通过使用 Scene.GetRootGameObjects
检索所有 GameObjects
但它不会 return 标记为 DontDestroyOnLoad
的对象来改进。
扩展为扩展函数:
public static class ExtensionMethod
{
public static List<GameObject> findNearObjects(this GameObject targetObj, LayerMask layerMask, float distanceToSearch)
{
GameObject[] sceneObjects = UnityEngine.Object.FindObjectsOfType<GameObject>();
List<GameObject> result = new List<GameObject>();
for (int i = 0; i < sceneObjects.Length; i++)
if (sceneObjects[i].layer == layerMask.value)
if (Vector3.Distance(sceneObjects[i].transform.position, targetObj.transform.position) < distanceToSearch)
result.Add(sceneObjects[i]);
return result;
}
}
用法:
List<GameObject> sceneObjects = gameObject.findNearObjects(layerMask, 5f);