Ray&Physics.Raycast构造函数

时间:2018-06-29 05:44:14

标签: c# unity3d

嗨,我是Unity新手。
第一个问题。
我从互联网上获得了一些示例代码,第三个参数使用out hit
但是提示显示应该为distance,并且确实有效。为什么? enter image description here

第二个问题。 我无法通过原点和方向参数来新建Ray Class
我的Unity版本2017.4。
enter image description here

2 个答案:

答案 0 :(得分:3)

  

第三个参数使用out hit。但提示显示应该是   距离,并且实际上有效。为什么?

1 。第三个参数不是out hit。这取决于所使用的方法重载。

Raycast函数有大约 16 个方法重载,这意味着通过向它们提供不同的参数,可以使用大约16种不同的方法。您是Unity的新手,但是C#编程语言比Unity有更多的作用。如果您不知道什么是方法重载,请阅读this帖子。

在您的问题示例中,这是您正在使用的重载:

public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance);

请注意,最后一个参数是maxDistance而不是layerMask。要使用最大距离和图层蒙版,请使用此参数,应为Physics.Raycast(transform.position, rayDirection, out hit, distance, layerMask),下面是该参数的重载:

public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask);

这些是Raycast函数的其他可用重载:

public static bool Raycast(Ray ray);
public static bool Raycast(Vector3 origin, Vector3 direction);
public static bool Raycast(Ray ray, float maxDistance);
public static bool Raycast(Ray ray, out RaycastHit hitInfo);
public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance);
public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo);
public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance);
public static bool Raycast(Ray ray, float maxDistance, int layerMask);
public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance, int layerMask);
public static bool Raycast(Ray ray, [DefaultValue("Mathf.Infinity")] float maxDistance, [DefaultValue("DefaultRaycastLayers")] int layerMask, [DefaultValue("QueryTriggerInteraction.UseGlobal")] QueryTriggerInteraction queryTriggerInteraction);
public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance);
public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance, int layerMask);
public static bool Raycast(Ray ray, out RaycastHit hitInfo, [DefaultValue("Mathf.Infinity")] float maxDistance, [DefaultValue("DefaultRaycastLayers")] int layerMask, [DefaultValue("QueryTriggerInteraction.UseGlobal")] QueryTriggerInteraction queryTriggerInteraction);
public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask);
public static bool Raycast(Vector3 origin, Vector3 direction, [DefaultValue("Mathf.Infinity")] float maxDistance, [DefaultValue("DefaultRaycastLayers")] int layerMask, [DefaultValue("QueryTriggerInteraction.UseGlobal")] QueryTriggerInteraction queryTriggerInteraction);
public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, [DefaultValue("Mathf.Infinity")] float maxDistance, [DefaultValue("DefaultRaycastLayers")] int layerMask, [DefaultValue("QueryTriggerInteraction.UseGlobal")] QueryTriggerInteraction queryTriggerInteraction);

  

我无法通过原点和方向参数来新建Ray类。

2 。您无法使用Ray类,因为您创建了一个名为Ray的脚本。这个Ray类没有构造函数。 Unity已经有一个名为Ray的API,我敢肯定这就是您要使用的。请勿使用任何Unity API为脚本命名相同的名称。如果这样做,它将不知道要使用哪个(您的Ray类或Unity的Ray类)。

您有两个选择:

A 。将您的Ray类重命名为其他

B 。通过提供Unity的Ray类命名空间(即Ray,让编译器知道您要使用Unity的UnityEngine类而不是您自己的类

RaycastHit hit;
int layerMask = 1 << LayerMask.NameToLayer("LayerName"); ;
float distance = 100;

UnityEngine.Ray ray = new UnityEngine.Ray(transform.position, transform.forward);
if (Physics.Raycast(ray, out hit, distance, layerMask))
{

}

答案 1 :(得分:1)

  1. https://msdn.microsoft.com/en-us/library/5dhe1hce.aspx
  2. Ray类存在于Unity中-仅使用名称空间或重命名