Ошибка при использовании Physics2D.Raycast — необязательные аргументы

Привет :) Я использую метод Physics2D.Raycast, и согласно документации Unity его входные аргументы определяются следующим образом:

public static RaycastHit2D Raycast(Vector2 origin, Vector2 direction, float distance = Mathf.Infinity, 

int layerMask = DefaultRaycastLayers, float minDepth = -Mathf.Infinity, float maxDepth = Mathf.Infinity);

И я вызвал этот метод и вставил следующие входные аргументы:

RaycastHit2D hit = Physics2D.Raycast (transform.position,
newVelocity, layerMask: hitLayerMask);

Однако я получаю следующее сообщение об ошибке:

The best overloaded method match for 'UnityEngine.Physics2D.Raycast(UnityEngine.Vector2, UnityEngine.Vector2, float)' 

does not contain a parameter named layerMask

Не могли бы вы помочь мне решить эту проблему? Я не понимаю, почему компилятор считает, что я перегружаю метод только тремя входными аргументами.

P.S. Я знаю о том, что я ввел «transform.position», объект Vector3, в функцию, которая предположительно принимает объект Vector2. Но я делал это раньше, и у меня не было ошибок. Единственный новый подход, который я использую, — это спецификация аргумента layerMask :/

Буду признателен за любую помощь.

Изменить: Просто чтобы уточнить, transform.position — это объект Vector3, newVelocity — это Vector2, а hitLayerMask — это целое число.

Редактировать 2: обратите внимание, что я пренебрег передачей входного аргумента «расстояние», потому что он имеет значение по умолчанию Mathf.Infinity. На этой веб-странице о необязательных аргументах (https://msdn.microsoft.com/en-us/library/dd264739.aspx), в части ExampleMethod() показано, как можно игнорировать аргументы со значениями по умолчанию. И именно по этой причине я пренебрег аргументом «расстояние».


person Dayman75    schedule 16.04.2016    source источник


Ответы (2)


Вы должны пройти на расстояние перед маской слоя, но вам это не удалось. Подпись функции: vector2,vector2,float int и другие, но текущий код у вас есть: vector2,vector2,int (hitLayerMask)....

    int hitLayerMask = 0;
    int layerMask = 6;
    float distance = 60f;

    RaycastHit2D hit = Physics2D.Raycast(transform.position,
        newVelocity, distance, layerMask: hitLayerMask);

Это скомпилируется, но может работать неправильно из-за того, как вы передаете слой. Для этого вы используете побитовую операцию. Например, 1<<hitLayerMask, 1 << LayerMask.NameToLayer("Environment"). Для получения дополнительной информации о побитовой операции слоя посетите здесь.

Ниже приведен правильный способ сделать это:

    Vector3 newVelocity = Vector3.zero;
    float distance = 100f;
    int layerMask = 1 << 6; //cast rays only against colliders in layer 6.
    RaycastHit2D hit = Physics2D.Raycast(transform.position,
        newVelocity, distance, layerMask);

ИЗМЕНИТЬ:

Ошибка, скорее всего, связана с тем, что функция, которую вы пытаетесь использовать, недоступна в текущей версии Unity C#. Необязательные параметры и именованные аргументы были добавлены в C# V4, в то время как Unity использует версию C#‹=3.5, в которой убраны некоторые функции.

person Programmer    schedule 16.04.2016
comment
Ох, ладно. Я думал, что можно пренебречь аргументами, которые имеют значение по умолчанию. Но у меня нет расстояния, чтобы указать... :s Должен ли я использовать Mathf.Infinity, так как это значение по умолчанию? - person Dayman75; 16.04.2016
comment
Кроме того, эта веб-страница с дополнительными аргументами msdn.microsoft.com/en-us/library /dd264739.aspx объясняет, как вы предположительно можете игнорировать аргументы, которые имеют значение по умолчанию, например, входной аргумент расстояния в функции raycast (проверьте ExampleMethod() на этой странице). Так что не проходить расстояние должно работать :/ - person Dayman75; 16.04.2016
comment
@ Dayman75, ты неправильно прочитал эту страницу. Вы можете игнорировать необязательные аргументы справа налево, но не слева направо. Таким образом, вы можете пренебречь layerMask, но затем использовать distance. Хотя нельзя пренебрегать расстоянием и использовать layerMask. Для расстояния вы можете пока использовать Mathf.Infinity, пока не придумаете собственное расстояние. Это индивидуально для каждой игры. - person Programmer; 16.04.2016
comment
Извините за мою настойчивость. Это правда, что если вызывающий объект предоставляет аргумент для любого из последовательности необязательных параметров, он должен предоставить аргументы для всех предшествующих необязательных параметров (с веб-сайта). Однако, если вы знаете имя третьего параметра, вы можете использовать именованный аргумент для выполнения задачи. Итак, anExample.ExampleMethod(3, optionalint: 4); работает. Итак, если я использую layerMask в качестве именованного аргумента, я не понимаю, почему это не работает. извините за настойчивость - person Dayman75; 16.04.2016
comment
В моем втором коде четко упоминается, что вы должны забыть об именованном аргументе и использовать побитовое значение для передачи маски слоя. Я даже предоставил ссылку, чтобы узнать больше о слоях и побитовом режиме. Побитовое — это то, как вы добавляете/удаляете слои в raycast. Сосредоточьтесь на этом. Наконец, то, что вы пытаетесь сделать, не работает, потому что Unity использует C# 2->3.4, но вам нужна функция, представленная в C# 4. Таким образом, она не будет работать, пока Unity не обновится до C# 4 или выше, что произойдет в конец этого года. Так что используйте то, что в настоящее время используют все остальные. Если это устранило вашу ошибку, вы можете принять это как ответ. Удачного кодирования! - person Programmer; 16.04.2016
comment
Ах! Хорошо :) Я не знал, что Unity использует C# 2->3.4. Спасибо. Я не знаю, почему вы упоминаете побитовые операции для LayerMask. Я прекрасно знаю, что такое побитовая операция и ее значение :/ На самом деле, я передал слой-маску с помощью побитовых операций. Я не думаю, что они вообще имеют какое-либо отношение к теме вопроса. Но я благодарю вас за понимание версии Unity для C#. Спасибо, что помогли мне. - person Dayman75; 16.04.2016
comment
Виноват. Код в вашем вопросе не включал побитовый материал, и в нем было layerMask: hitLayerMask. Поэтому я подумал, что вы новичок из-за этого... Рад, что вы знаете, что делаете. - person Programmer; 16.04.2016
comment
Нет проблем :) Я не оставлю ваш ответ принятым, но если вы отредактируете его, чтобы конкретно решить проблему с версией C #, о которой вы упомянули, я приму ваш ответ, друг. В противном случае я просто отвечу на него сам. Еще раз спасибо и удачного кодирования :) - person Dayman75; 16.04.2016

Как заявил пользователь @Programmer, Unity использует C # 2-> 3.5. На самом деле я искал «версию» С#, используя «Debug.Log (System.Environment.Version);» и заметил, что моя версия 2.0.50727.1433.

Чтобы делать то, что я хотел, с именованными аргументами, мне требовалась версия C # 4.0, и поэтому я получал эту ошибку.

person Dayman75    schedule 16.04.2016