• Как сделать физическое перемещение персонажа по локальным осям?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Если хотите взаимодействовать в движении с коллайдерами, то про перемещения через transform можете забыть, используйте rigidbody или character controller, смотря что больше подходит.
    По поводу осей. Глобальные оси вызываются через Vector3, например Vector3.up - это вектор (0;1;0). В случае Vector2 всё тоже самое, только без z.
    Оси же самого объекта вызываются через его transform: та же ось вперёд - transform.forward в стандартном 3д или transform.up в стандартном 2д.

    Движение же будет выглядеть как-то так:
    // z is vertical axis (3d; y for 2d), x is horizontal axis
    rigidBody.velocity = transform.forward * z + transform.right * x;
    Ответ написан
    Комментировать
  • Unity 2d. У меня возникает следующая проблема. Можете, пожалуйста, объяснить, что не так?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Кратко: у вас дубликат класса, переименуйте этот или найдите другой класс с таким же именем.

    Детально: есть такая штука, namespace. Грубо говоря, это каталог всех классов, которые к нему принадлежат. Вы namespace явно не задаёте, поэтому этот (а возможно и другие) класс лежат в так называемом global namespace. Чтобы всё правильно работало, в рамках одного пространства имён каждый класс должен иметь уникальное название. Ошибка говорит о том, что у вас уже есть такой класс.
    Если для вас принципиально важно иметь два класса с одинаковым названием, один из их переместите в другое пространство имён:

    public namespace MyNamespace {
    
        public class MyClass {
            //code
        }
    }


    Чтобы потом этот класс использовать в другом коде, укажите директиву:

    using MyNamespace;
    Ответ написан
    1 комментарий
  • Как сделать управление в Unity персонажем (ошибка в коде)?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Добрый вечер. Замените

    Player.transform.position += Player.transform.forward * speed * Time.deltaTime;

    На
    transform.position += transform.forward * speed * Time.deltaTime;

    И поменяйте значение скорости, хотя бы на

    public float speed = 50;
    Ответ написан
    2 комментария
  • Как создать сенсорную кнопку Escape в Юнити?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Вынесите реализацию паузы в отдельный public метод. Затем откройте свой UI Button и прокрутите в инспекторе вниз, пока не увидите поле On Click, чуть ниже будет кнопка +, жмите. Появится такая схема:
    625d3da8287f0344210173.png
    В левое нижнее поле перетащите объект, на котором висит скрипт с паузой. Затем в выпадающем списке справа сверху выберите свой класс и метод паузы.

    Вы просили код, выглядеть это будет так. До:
    private void Update() {
    	if (Input.GetKeyDown(KeyCode.Escape)) {
    		// your code
    	}
    }

    После:
    private void Update() {
    	if (Input.GetKeyDown(KeyCode.Escape))
    		OnPauseStart();
    }
    
    public void OnPauseStart() {
    	// your code
    }


    PS. Если хотите, можете попробовать повесить функцию на кнопку back
    private void Update() {
        if (Application.platform == RuntimePlatform.Android) {
            if (Input.GetKeyDown(KeyCode.Escape)) {
    			// your code
            }
        }
    }
    Ответ написан
    1 комментарий
  • Как сделать автокликер на java android?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Комментировать
  • Как моментально скинуть значения rotation к нулям?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Попробуйте
    transform.eulerAngles = new Vector3(x, y, z);
    Ответ написан
  • Если скачать бесплатно платный ассет, то как об этом могут узнать?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    От более лёгкого, не требующего специальных знаний или навыков, до более сложного:
    * текстуры
    * анимации
    * модельки, рельеф
    * графические интерфейсы, диалоговые окна
    * звуки, музыка
    * внутриигровые процессы, механики
    * частицы
    * шейдеры
    * оставленные неиспользуемые ресурсы
    * строение проекта и именование ресурсов
    * идентичность кода или его структуры/логики при обфускации

    В любом случае, всегда должно быть заинтересованное лицо, которое а) найдёт за что зацепиться, б) не поленится что-то с этой инфой сделать. Если речь идёт о бесплатном проекте, то всем пофиг. Если о платном, то тогда вопрос, насколько ваш продукт с ним конкурирует и насколько оригинал беспокоится об авторских правах (привет Nintendo).
    Ответ написан
  • Почему не найден класс?

    @Ezekiel4 Автор вопроса
    Охотник на пиратов и сборщик монолитов
    Спустя несколько часов поиска разобрался сам. Если у кого будет тот же трабл, оставляю решение. В pom-файл maven-а нужно дописать блок build, добавить плагин maven assembly. Полный текст выглядит так, можете сравнить с этим же текстом выше.

    В строке study.DiscordBot замените содержимое на путь к своему главному классу. Актуальную версию плагина можно взять тут.

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>discord-application</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.source>16</maven.compiler.source>
            <maven.compiler.target>16</maven.compiler.target>
        </properties>
    
        <dependencies>
            <!-- https://mvnrepository.com/artifact/net.dv8tion/JDA -->
            <dependency>
                <groupId>net.dv8tion</groupId>
                <artifactId>JDA</artifactId>
                <version>5.0.0-alpha.9</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>3.3.0</version>
                    <configuration>
                        <!-- get all project dependencies -->
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <!-- MainClass in mainfest make a executable jar -->
                        <archive>
                            <manifest>
                                <mainClass>study.DiscordBot</mainClass>
                            </manifest>
                        </archive>
    
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <!-- bind to the packaging phase -->
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    Ответ написан
    Комментировать
  • Как происходит передача хода от игрока к игроку в компьютерной настольной игре?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Делается это двумя шагами:

    1. Данные - некий указатель на то, чей сейчас ход. Можно сделать, например, булевой переменной (прим. крестики-нолики : ход крестика false, нолика true), числом (прим. ммо игра: id игрока), или перечислением (прим. варкрафт: RedPlayer, BluePlayer, TealPlayer, etc). Можно и другими (символ, строка-имя, IP или что-то ещё).

    2. Условие - каждый ход игра проверяет, какой игрок ходит.
    Как это работает - каждый игрок может ходить, но игра ходом это не считает (ничего не меняется). Например, просто тапы по экрану, на которые игра не будет реагировать, если этот игрок не соответствует игроку, чей сейчас ход.

    Представьте шахматы. Если текущий игрок белый, то чёрный, конечно, может пользоваться мышкой/тачскрином, но ничего происходить не будет. И напротив, аналогичные действия белого оппонента игра будет принимать.
    Ответ написан
    Комментировать
  • Почему не работает проверка на столкновение объектов?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Чек-лист, что стоит проверить:
    1. Висит ли подходящий тег на объекте?
    2. Есть ли на объекте коллайдер?
    3. Включена ли галочка isTrigger хотя бы на одном из двух коллайдеров? (т.к. OnTriggerEnter2D)
    4. Находятся ли коллайдеры в одной плоскости (обычно, Z)?
    5. Висит ли скрипт, фрагмент из которого указан в коде выше, на объекте, который ставится?
    6. Не хранится ли в ссылке TowerPistol null?
    7. Является ли ссылка (TowerPistol) корректной ссылкой на нужный объект?

    Если на объекте висит Rigidbody, можете попробовать поменять Collision Detection на Interpolate.

    Если всё проверено, а проблема осталась, попробуйте изменить метод OnTriggerEnter2D на OnTriggerStay2D.
    Ответ написан
    Комментировать
  • Как ровно выставить пиксельные плитки в Unity?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Меню Edit -> Grid and Snap Settings.
    World Snap - это глобальная сетка, Increment Snap - это виртуальная сетка, по которой вы расставляете объект. Поставьте значение шага (Move x-y-z) соответствующие размеру вашего объекта. Выделите объект и нажмите "All axes" в том же окне. После чего включите инструмент Move Tool (панель сверху) и с зажатой клавишей Ctrl попробуйте подвигать ваш объект за стрелки.

    Если же речь идёт не о паре десятков, а о сотнях объектов, то лучше изучите тайлмапы, из ответа LittleBob
    Ответ написан
  • Как прикрепить в Unity 2d коллайдер, к движущемуся объекту?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Повесь коллайдер на само лезвие или сделай дочерний пустой объект с коллайдером нужных размеров. Когда родительский объект (топор) будет двигаться, он автоматически будет подтягивать все дочерние.
    Ответ написан
    Комментировать
  • Стоит ли учить C++, если нет возможности использовать Unreal Engine?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Освоив один язык, вы без проблем освоите и другой. Тем более, если речь идёт о языках группы C и производных. Поэтому не переживайте, что вы потратите время зря, изучая С#. С него легко перейти на большинство современных востребованных языков. А если учесть, что ваш ПК не тянет Unreal Engine, то почему бы не начать с Unity? Кто бы что не говорил, а эта программа ничуть не хуже ни в функциональном плане, ни в плане перспектив будущего трудоустройства. Если вдруг вам будет по началу трудно вникнуть в конструкции языка, то в Unity есть система визуальных скриптов (Bolt).
    Ответ написан
    Комментировать
  • Не работает функция Flip, что делать?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Сделайте один рут объект, на котором будет весь основной фарш (движение + твёрдое тело + коллайдеры). Объекты с графикой сделайте дочерними.
    При повороте персонажа делайте не флип, а вращение по оси Y рут объекта. Как-то так (x - это ввод с оси "Horizontal"):
    if (x != 0)
        transform.eulerAngles = new Vector3(transform.eulerAngles.x, x > 0 ? 0 : 180, transform.eulerAngles.z);
    // если оси X/Z без вращения, то можно так:
    if (x != 0)
        transform.eulerAngles = new Vector3(0, x > 0 ? 0 : 180, 0);
    Ответ написан
    Комментировать
  • Как определить расстояние между несколькими объектами в 2d?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Ваши монстры идут по вейпоинтам в определённом порядке. Это значит, что у каждого монстра должно быть состояние, которое говорит о том, куда сейчас монстр стремится. Если предположить, что вейпоинты у вас в массиве, то состояние - это индекс следующего вейпоинта. В таком случае вы можете брать всех монстров с максимальным индексом, и, пользуясь Vector3.Distance, определять отдалённость от целевого вейпоинта всех проверяемых монстров. Затем выбрать наименьшее из них.
    Ответ написан
    Комментировать
  • Как сделать работу приложения в фоне Unity?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Приложения Unity Android видит как обычное Activity. Сворачивая приложение, вы ставите Activity на паузу. Все приложения на паузе Android волен закрывать по своему желанию, даже Application.runInBackground не работает (в iOS тоже). Решение, которое вам поможет: написать службу на Java/Kotlin и потом запускать при сворачивании/закрытии и останавливать при открытии приложения.

    Обратите внимание на этот GitHub проект: https://github.com/nintendaii/unity-background-service
    Ответ написан
    2 комментария
  • Как убрать верхнюю часть меню в Android studio?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Ищите файлик themes.xml
    Поправьте стиль, который называется "Theme.название_вашей_игры", поставьте parent=
    Theme.MaterialComponents.DayNight.NoActionBar
    Ответ написан
    Комментировать
  • Как сделать коллайдер для торуса(бублика) в юнити?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Самый простой вариант - сделайте сборный коллайдер из капсул.

    61714c230eeaa613415166.png
    Ответ написан
    Комментировать
  • Java Scanner. Как считать данные?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Если никаких арифметических операций не требуется, то вы можете ограничиться простым считыванием nextLine(), после чего получить массив подстрок, разделив строку по пробелам split(), а затем вывести их в обратном порядке.
    Если же всё же нужны числа, можете читать их методом nextInt(), или же взять получившиеся подстроки и каждую преобразовать в целое число.
    Ответ написан
    Комментировать
  • Как проверить тип данных в Java через if?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Тип переменной проверяют через instanceof

    Object r = 13.1;
    if (r instanceof Double) {
        System.out.println("matches double");
    }


    Распознать же строку как double можно, например, с помощью регулярки

    String example = "1331.2";
    if (Pattern.matches("^[\\+\\-]{0,1}[0-9]+[\\.\\,][0-9]+$", (CharSequence) example)) {
        System.out.println("matches double");
    }


    Можно найти какую-нибудь библиотеку, можно самому написать метод, посимвольно перебирающий строку. А можно просто воспользоваться Double.parseDouble(), не такой уж он и громоздкий.
    Ответ написан
    4 комментария