Ray & Physics.Raycast Constructor - PullRequest
       5

Ray & Physics.Raycast Constructor

0 голосов
/ 29 июня 2018

Привет, я новичок в Unity.
Первый вопрос. .
Я получил пример кода из интернета, третий параметр использует out hit.
Но подсказка должна быть distance, и это действительно сработало. Зачем? enter image description here

Второй вопрос . Я не могу изменить Ray Class по параметру происхождения и направления.
My Unity Version 2017.4.
enter image description here

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Третий параметр использует хит. Но подсказка должна быть расстояние, и это на самом деле работает. Почему?

1 . Третий параметр не out hit. Это зависит от используемой перегрузки метода.

Функция Raycast имеет около перегруженных методов 16 , что означает, что существует около 16 различных способов ее использования, предоставляя им разные аргументы. Вы новичок в Unity, но это больше связано с языком программирования C #, чем с Unity. Если вы не знаете, что такое перегрузка метода, прочитайте этот пост.

С примером из вашего вопроса, это перегрузка, которую вы используете:

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 уже есть API с именем Ray , и я уверен, что это то, что вы хотите использовать. Не называйте ваш скрипт одинаково с любым API-интерфейсом Unity. Если вы это сделаете, он не будет знать, какой из них использовать (ваш класс Ray или класс Ray Unity).

У вас есть два варианта:

A . Переименуйте ваш Ray класс в другое

B . Пусть компилятор знает, что вы хотите использовать класс Ray Unity вместо своего собственного, предоставив пространство имен 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))
{

}
0 голосов
/ 29 июня 2018
  1. https://msdn.microsoft.com/en-us/library/5dhe1hce.aspx
  2. Класс Ray существует в Unity - просто используйте пространство имен или переименуйте
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...