【问题标题】:Ray & Physics.Raycast ConstructorRay & Physics.Raycast 构造函数
【发布时间】:2018-06-29 14:57:57
【问题描述】:

您好,我是 Unity 新手。
第一个问题。
我从网上得到了一些示例代码,第三个参数使用out hit
但是提示显示应该是distance,它确实有效。为什么?

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

【问题讨论】:

  • 首先是邮政编码而不是图片。
  • 对不起,我知道,但我想显示提示

标签: c# unity3d


【解决方案1】:

第三个参数使用 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 类命名空间,即 UnityEngine,让编译器知道您想使用 Unity 的 Ray 类而不是您自己的类。

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))
{

}

【讨论】:

  • 哦,创建两个相同名称的类太愚蠢了,对不起,是的,我知道那是重载,但是你在哪里找到这些方法我在官方文档中只有四个方法docs.unity3d.com/ScriptReference/Physics.Raycast.html
  • 文档中没有列出某些功能。我使用 Visual Studio 来查找其他函数重载。右键单击Physics.Raycast 函数,然后选择“转到定义”。您会看到这些列表
【解决方案2】:
  1. https://msdn.microsoft.com/en-us/library/5dhe1hce.aspx
  2. Ray 类存在于 Unity 中 - 只需使用命名空间或重命名

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2013-10-13
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多