Ответы пользователя по тегу Unity
  • Как сделать фильтр слов в (TMP_)InputField?

    @romazhan
    Для реализации фильтра слов в `TMP_InputField` вы можете использовать регулярные выражения. Регулярные выражения позволяют искать в тексте определенные шаблоны символов, которые определяются с помощью специального синтаксиса.

    Для реализации фильтра в вашем случае нужно создать регулярное выражение, которое будет искать слова, которые вы хотите фильтровать. Например, чтобы удалить слово "лох" из текста, можно использовать следующее регулярное выражение: /\bлох\b/gi
    Это выражение ищет слово "лох" (без учета регистра, благодаря флагу "i"), находящееся отдельно от других слов. Символы "\b" обозначают границу слова.

    Чтобы воспользоваться регулярным выражением в вашем скрипте, вам нужно будет использовать класс `System.Text.RegularExpressions.Regex`:
    string inputText = "Привет, меня зовут Иван и я не лох";
    string pattern = @"/\bлох\b/gi";
    string replacement = "";
    string result = Regex.Replace(inputText, pattern, replacement);
    
    Debug.Log(result);
    Ответ написан
    Комментировать
  • Как сделать отслеживание врагов у игрока?

    @romazhan
    В функции `OnTriggerExit2D` вы пытаетесь удалить элемент из списка `enemes`, но сразу же обращаетесь к этому списку без проверки на пустоту. Следует добавить проверку на то, что список `eneme`s не пуст, перед обращением к элементам этого списка.

    По поводу ошибки `ArgumentOutOfRangeException`: возникает она, когда вы пытаетесь обратиться к элементу списка по индексу, который выходит за пределы размера этого списка. Например, если у вас есть список из трех элементов, то допустимые индексы будут от 0 до 2. При обращении к элементу с индексом 3 будет возникать ошибка.

    Чтобы исправить эту ошибку, нужно проверять, что список `enemes` не пуст и что индекс, по которому вы обращаетесь к элементу, находится в допустимом диапазоне. В функции `PlayerVision` нужно проверять, что список `enemes` не пуст перед тем, как обращаться к элементам этого списка. Например, так:
    if (enemes.Count > 0) {
        target = enemes[0];
        Distance = Vector3.Distance(enemes[0].transform.position, transform.position);
        SeeEnemy = true;
        if (enemes.Count >= 2)
            for (int i = 1; i != enemes.Count; i++)
                if (Vector3.Distance(enemes[i].transform.position, transform.position) < Distance) {
                    Distance = Vector3.Distance(enemes[i].transform.position, transform.position);
                    target = enemes[i];
                }
    }

    В функции `OnTriggerExit2D` также стоит добавить проверку на то, что список `enemes` не пуст, перед обращением к элементам этого списка. Например, так:
    if (other.tag == "Enemy")
    {
        enemes.Remove(other.gameObject);
        if (enemes.Count == 0) {
            transform.parent.gameObject.GetComponent().NoTarget();
        } else {
            transform.parent.gameObject.GetComponent().PlayerVision(enemes);
        }
    }

    Проверьте также, что вы правильно указали тег "Enemy" у вражеских объектов, чтобы условие `if (other.tag == "Enemy")` выполнялось только при встрече с врагами.
    Ответ написан
  • Как по компоненту определить GameObject?

    @romazhan
    Для того, чтобы получить объект `GameObject`, ассоциированный с коллайдером, вы можете использовать свойство `gameObject` класса `Collider2D`:
    Collider2D[] Player = Physics2D.OverlapCircleAll(attackPos.position, attackRange, player);
    for (int i = 0; i < Player.Length; i++)
    {
      GameObject playerObject = Player[i].gameObject;
      playerObject.GetComponent<SomeComponent>().TakeDamage(damage);
    }

    В данном случае вы также должны указать тип компонента, который вы хотите получить, так как функция `GetComponent` возвращает объект типа `Component` В данном случае это может быть, например, компонент `SomeComponent`, который содержит функцию `TakeDamage`.

    Почему ваш код работает, хотя вы не указываете тип компонента? Вероятно, у вас в проекте есть класс, наследуемый от `MonoBehaviour`, с именем "SomeComponent", который содержит функцию `TakeDamage`. В таком случае функция `GetComponent` вернет экземпляр этого класса, и вы сможете вызвать функцию `TakeDamage`. Однако это не является наиболее рекомендуемым способом написания кода, так как такой подход не обеспечивает типизацию и может привести к ошибкам в рантайме. Лучше явно указывать тип компонента, чтобы избежать подобных ошибок.
    Ответ написан