Использование PointerEventData возвращает ошибку: «Неожиданный символ»

Я новичок в C# и решил начать использовать его сейчас, так как большинство руководств по Unity сосредоточено на нем, и я никогда не использовал JavaScript для чего-либо, кроме веб-страниц.

По большей части все работало, пока я не попробовал использовать метод Vector2.MoveTowards:

    void OnMouseDown() {
    int weapCoolDown = 1;
    Instantiate(bullet_player);
    Vector2.MoveTowards(GameObject.Find("player-1"), Vector2 PointerEventData.position(), float p1BulletSpeed);
}

Ошибки, сообщаемые консолью Unity

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

И когда я пытаюсь использовать вместо этого идентификатор, он присваивает его, но не позволяет мне его использовать, и он, как обычно, говорит «Неожиданный символ».

В руководстве Unity недостаточно подробностей или примеров, которые действительно помогли бы мне решить эту проблему, есть ли класс или ссылка, которые мне не хватает, или мне просто нужно попробовать использовать альтернативный метод?

«Я никогда не использовал JavaScript ни для чего, кроме веб-страниц» .... Не уверен, какое это имеет отношение к вашему вопросу. Ваш код - C#. Это не Unityscript. Это не Javascript.

Programmer 23.03.2018 23:57

@Programmer Хорошо, но я думаю, что, поскольку я уже достаточно хорошо знаю JS, я мог бы начать переключаться на него. В C# нет такого же синтаксиса, поэтому мне нужно вообще начать изучать новый язык или снова начать с js. Я пытаюсь придерживаться C#, когда работаю с Unity, потому что большинство видеоуроков, которые я нашел, в основном сосредоточены на нем.

commandertuna 24.03.2018 02:10

Я не говорю, что вам не следует использовать C#. Я говорю вам, что код в вашем вопросе - это код C#, а не Javascript. Раньше вы могли использовать Unityscript / Javascript, но теперь это снято с производства. У вас нет другого выбора, кроме как изучить C#

Programmer 24.03.2018 02:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть несколько вещей, которые вы должны проверить в своем коде:

Vector2.MoveTowards() не вызывается с правильными параметрами. GameObject.Find() вернет gameObject, а не Vector2. Если вы ищете текущую позицию игрока 1, вам следует построить Vector2 из transform.position игрока 1.

Vector2 playerPosition = new Vector2();
playerPosition.x = GameObject.Find("player-1").transform.position.x;
playerPosition.y = GameObject.Find("player-1").transform.position.y;

Любое использование PointerEventData требует директивы using для EventSystem. Чтобы включить его, добавьте using UnityEngine.EventSystem с остальными директивами using.

Префикс Vector2 перед PointerEventData.position() недействителен. Это не явное приведение типов, так как оно не заключено в круглые скобки, но приведение типов не требуется, поскольку position вернет Vector2.

pointerEventData.position - это свойство, основанное на ссылке на объект. Однако реализация PointerEventData.position() неправильно использует это как статический метод. Поскольку на самом деле это не статический метод, а динамическое свойство, он не сможет скомпилировать и отобразить ошибки.

Для существования pointerEventData он должен исходить из события, которое извлекает eventData. К сожалению, OnMouseDown() этого не делает. Однако метод интерфейса из IPointerClickHandler, называемый OnPointerClick(PointerEventData pointerEventData), имеет нужные pointerEventData.

При рефакторинге существующего кода это ближе к той функциональности, которую вы ищете.

// Add this "using" directive
using UnityEngine.EventSystems;

// Be sure to implement the interface of IPointerClickHandler
public class NameOfYourScript : MonoBehaviour, IPointerClickHandler {

    //
    // Additional Code in your class. . . .
    // 

    // Replace OnMouseDown() with this.
    public void OnPointerClick(PointerEventData pointerEventData) {
        Instantiate(bullet_player);

        Vector2 playerPosition = new Vector2();
        playerPosition.x = GameObject.Find("player-1").transform.position.x;
        playerPosition.y = GameObject.Find("player-1").transform.position.y;

        Vector2.MoveTowards(playerPosition, pointerEventData.position, p1BulletSpeed);
    }
}

Код безупречный и без ошибок. Спасибо за помощь, думаю, в следующий раз мне стоит начать использовать JavaScript, поскольку я уже знаю этот язык и все еще новичок в C#.

commandertuna 24.03.2018 02:26

Напоминаем, что Unity использует специальный вариант JavaScript, также известный как UnityScript, который исторически и до сих пор обычно (но непоследовательно) именуется «JavaScript». UnityScript можно использовать только для создания сценария Unity. Он не совместим с внешними библиотеками JavaScript, поэтому вы не можете импортировать такие вещи, как Node или Threes. См. stackoverflow.com/questions/29194823/unityscript-vs-javascri‌ pt для получения дополнительной информации.

Katherine Cykes 24.03.2018 03:07

Другие вопросы по теме