• Здравствуйте у меня ошибка cs0115 в строке 25. Делал скрипт по видео уроку,как её исравить не нашёл. Попробовал к MonoBehaviour добавить PunCallbacks?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    В следующий раз оберните код внутрь тега Code и приводите весь код полностью (включая импорт). А вообще, проблема кроется вот здесь:
    public override void OnJoinedRoom()
    Заключается она вот в чём. Оператор override служит для переопределения метода. Берётся метод у родительского класса и меняется в дочернем, таким образом (в вашем случае) сам фреймворк знает о таком методе, а вы туда можете написать то, что вам хочется.
    Но в данном случае ни MonoBehaviour, ни один из классов, от которых всё это дело наследуется, не имеет в распоряжении метода заданной сигнатуры, значит и переопределять нечего.

    Скорее всего, проблема решится, когда вы в 7 строке
    public class PUN : MonoBehaviour
    Замените MonoBehaviour на MonoBehaviourPunCallbacks.
    Ответ написан
  • Как сделать плавным прыжок С# unity?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Главный вопрос в том, что вы подразумеваете под плавностью прыжка?

    Вы можете задать траектории прыжка с помощью AnimationCurve и в IEnumerator плавно применять нужные силы или смещения - таким образом у вас будет удобный внешний интерфейс, где вы сможете сделать просто что угодно.
    Вот тут пример, как такое можно сделать - https://www.youtube.com/watch?v=zprbOhxHPXE

    С другой стороны, возможно, сейчас ваш прыжок ведёт себя как-то не так. Не видя остального кода, могу лишь предположить, что, например, персонаж прыгает аномально быстро, почти телепортируясь, а падает крайне медленно. Если у вас всё действительно так, то проблема не в прыжке, а в движении, а точнее вертикальной его координате. Возможно, вы используете что-то типа:
    rb.velocity = Vector2.right * xInput * movementSpeed;

    или
    rb.velocity = new Vector2(xInput * movementSpeed, 0);

    Если я угадал, то тут проблема в обнулении Y координаты движения. Типа вы перегружаете X, что даёт движение, а всё Y движение обнуляется (гравитация, прыжок). Можно сделать вот так:
    rb.velocity = new Vector2(xInput * movementSpeed, rb.velocity.y);


    Непрошенный совет

    Пробовал разные способы которые нашёл в интернете, умножение на Time.deltaTime, пробовав изменить импульс на Time.deltaTime, отслеживал нажатие в FixedUpdate() вместо Update() и используя Time.FixedDeltaTime. Впрочем, ни один из способов не увенчался успехом. Подскажите как исправить данную проблему?

    1. Параметр Time.deltaTime - это временной промежуток между последним и текущим кадром. Умножая на него, например, скорость, вы говорите коду, что хотите сделать привязку скорости не к кадрам (столько-то метров за кадр), а к секундам (столько же метров, но уже за секунду). Это довольно удобно, когда вы делаете физическую симуляцию игре.
    2. У прыжка есть два режима (Force и Impulse). Force обычно используется для продолжительных воздействий. Например, с её помощью можно реализовать занос в гонках. А Impulse нужна для разового приложения силы - разгон пули, удар по мячу, прыжок, и т.д.
    3. Функция отслеживания нажатий. Используйте для этого всегда Update, вместо FixedUpdate. Дело в том, что класс Input предоставляет информацию, которая опирается именно на период обновления экрана (ему соответствует Update). Например, вот в этом кадре вы нажали пробел и продолжаете удерживать кнопку вправо. FixedUpdate же лучше использовать для применения постоянных сил (вроде движения).
    Просто из-за разного периода работы вполне может быть такая ситуация, что ваш ввод просто потеряется или, наоборот, данные о нём останутся на следующую итерацию приложения сил, когда игрок уже перестал нажимать. Чтобы переносить данные между ними, воспользуйтесь полем класса.

    Вот примерно так будет выглядеть простое движение с Rigidbody2D:
    using UnityEngine;
    
    [RequireComponent(typeof(Rigidbody2D))]
    [DisallowMultipleComponent]
    public class PlayerMovementDemo : MonoBehaviour {
    
    	private Rigidbody2D _Controller;
    	private float _MovementInput;
    
    	public float movementSpeed;
    	public float jumpingForce;
    	[Space(10)]
    	public Transform groundCheckPoint;
    	public float groundCheckDistance;
    	public LayerMask groundIdentity;
    
    	private void Start() {
    		_Controller = GetComponent<Rigidbody2D>();
    	}
    
    	private void Update() {
    		_MovementInput = Input.GetAxis("Horizontal");
    
    		if (Input.GetButtonDown("Jump") && IsGrounded())
    			_Controller.AddForce(Vector2.up * jumpingForce, ForceMode2D.Impulse);
    	}
    
    	private void FixedUpdate() {
    		_Controller.velocity = new Vector2(_MovementInput * movementSpeed, _Controller.velocity.y);
    	}
    
    	private bool IsGrounded() {
    		return Physics2D.OverlapCircle(groundCheckPoint.position, groundCheckDistance, groundIdentity);
    	}
    }

    Ответ написан
    Комментировать
  • Почему в unity анимация не прекращается?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    На переходе от ноды получения урона к пустой уберите условия и включите галочку Has Exit Time.
    63f1e2b80acd8608650604.png
    Ответ написан
    Комментировать
  • Почему прыжок не стаёт меньше от уменьшения значения?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Скорее всего, произошла следующая ситуация. Вы создали скрипт и добавили его на сцену потестить. После этого вы пробовали менять параметр jumpForce в коде, но в инспекторе объекта в Unity осталось старое значение. То, что вы пишете тут - для скрипта это как значения по дефолту, попробуйте в инспекторе поменять.
    Ответ написан
    Комментировать
  • Как сделать смену персонажа по Dropdown в Unity3D?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Вам достаточно представить своих персонажей в виде чисел (номер 1 такой-то, номер 9 такой-то и т.д.). Объединив их в массив или список, вы сможете легко пользоваться событием выпадающего списка.

    Вот пример, как это может быть реализовано в коде. Публичный метод привязать к событию выпадающего списка.
    using UnityEngine;
    
    public class CharacterSelection : MonoBehaviour {
    
    	public GameObject[] characters;
    
    	private void Start() {
    		OnSelected(0);
    	}
    
    	public void OnSelected(int elementId) {
    		for (int i = 0; i < characters.Length; i++)
    			characters.SetActive(i == elementId);
    	}
    }
    Ответ написан
    Комментировать
  • Материал розовый, при universal render pipeline, исправить?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    У вас сам пайплайн настроен?
    Edit >> Project Settings >> Graphics
    Там в самом верху пустое поле для префаба пайплайна. Если там "None ...", то почитайте тут что там делать - https://docs.unity3d.com/Packages/com.unity.render....
    Если там всё ок, попробуйте поменять шейдер материала со Standart на URP/Lit
    Не помогло - пишите в коменты, подумаем ещё.
    Ответ написан
  • Как реализовать механику как в игре Draw and run?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    То, что делает игрок - просто рисующий жест.

    Что делает игра.
    По траектории ввода составить массив точек при помощи проекции UI координат на мировые (функция). Затем скрипт, зная о минимальной дистанции спавна объектов (установленную вами заранее), разбивает кривую на отрезки такой длины (список точек). Далее в точках спавнит префабы.
    Ответ написан
    Комментировать
  • Почему анимация с mixamo криво работает в unity?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Так происходит, потому что так записана анимация. Как пофиксить
    1) Положить объект с анимацией в другой, который понемногу опускать скриптом или анимацией дополнительной
    2) Руками переделать анимацию через Animation вкладку
    3) Использовать Animations Rigging
    4) Взять другую
    Ответ написан
    4 комментария
  • Какие есть способы оптимизации Post Processing для телефона?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    К сожалению, процессинг (да и URP в целом) - это не про производительность. Тут есть всего два пути - лёгкий, то есть просто отключить и придумать что-то другое и геморный - ковыряться руками и всё оптимизировать под конкретно вашу игру для телефона. Или, хотя бы, под мобильную платформу.
    Это довольно трудозатратная задача, поэтому имеет смысл посмотреть в сторону готовых решений. Я не пробовал бесплатные варианты, так что хз что там норм, но вот то, что использовал я:
    https://assetstore.unity.com/packages/vfx/shaders/...
    Ответ написан
    Комментировать
  • Как реализовать перемещение на определенное расстояние от одной точки к другой?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Вам отлично подходит MoveTowards. Работает он следующим образом:
    1) Сначала он берёт первый аргумент - текущее положение объекта.
    2) Затем берёт второй - место, куда объект стремится в итоге попасть.
    3) Прокладывает путь между этими точками, после чего отмеряет на этом пути расстояние, равной третьей аргументе - шагу.
    4) И возвращает местоположение, куда вам нужно переместить объект.
    Плюс этого метода в том, что вы никогда не пройдёте дальше цели. Выглядеть это будет как-то так:

    using UnityEngine;
    
    public class ClickMoveExample : MonoBehaviour {
    
    	public Transform target;
    	public float moveDelta = 0.1f;
    
    	void Update() {
    		if (Input.GetMouseButtonDown(0))
    			transform.position = Vector3.MoveTowards(transform.position, target.position, moveDelta);
    	}
    }
    Ответ написан
  • Почему не отрабатывает IAP в мобильном приложении Unity?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Данный пакет на самом деле просто перенаправляет ваши запросы на указанный сервис и его ответы вам, почти никак на них не влияя. Запуск OnInitialized является следствием получения определённого сообщения извне. В случае с Android проблема кроется в самом устройстве, а точнее в активной сессии Google.
    Проверьте статус входа в аккаунт, нет ли там каких предупреждений? Плюс может быть ещё такое, что он не сработает для сырого собранного приложения, а не скачанного с маркета. Также по опыту скажу, что IAP вообще не запустится ни под каким соусом, если ваше приложение система пометила как небезопасное. Проверьте ещё почту, нет ли там каких служебных писем от гугла?

    UPD. вспомнил ещё одну проблему, IStoreListener должен создаваться только один раз за сессию приложения. Типа вы, например, запустили его на сцене 1, при переходе на сцену 2 оно удалилось и пытается запуститься на сцене 2, но сервис это уже не схавает. Попробуйте пометить его как DontDestroyOnLoad(gameObject), может поможет.
    Ответ написан
    Комментировать
  • Как можно зафиксировать позицию дочернего объекта после проигрывания анимации?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Либо с помощью пустой ноды, либо разделив анимацию на слои (в аниматоре слева раздел Layers), либо использовать скрипт вместо анимации. Не видя иерархии и вообще самой анимации точнее не могу сказать, что-то из этого должно подойти
    Ответ написан
    2 комментария
  • Хочу купить ассет, но пугает вот это. Кто сталкивался с этим?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Это нормально. Существование необходимости в таких документах вовсе не значит, что где-то сидит злой майор, смотрит чужие транзакции в поисках тех, кто укажет недостоверные данные или ошибётся в заполнении формы. Просто таково законодательство нашего времени, не разрешающее проводить платежи вслепую.
    Основная цель сбора подобных данных заключается в трёх вещах: работа с налоговой, гарантия возможности возврата товаров для вас как пользователя и гарантия для сервиса на случай урегулирования споров. Даже не столько гарантия, сколько облегчение их работы во всех случаях, если что-то идёт не так.

    Вы вольны писать туда что угодно, но по опыту скажу, что лучше там не врать. Вопрос не в наказании, а в сложностях, если вы захотите получить выгоду, например, что-то продавать, то потом бывает муторно там что-то исправлять.
    Ответ написан
    Комментировать
  • Почему в Unity 2D спрайты не передвигаются по рамкам тайлмапа?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Если вам просто нужно ровно двигать, воспользуйтесь инструментом Move Tool в связке с зажатым Ctrl. Свойства такого движения можно посмотреть и поправить в Edit » Grid and Snap Settings.

    По поводу самого тайлмапа, схема там такая:
    1) Родительский объект с компонентой Grid.
    2) Дочерние объекты с компонентами Tilemap + Tilemap Renderer, дальнейшая работа будет происходить внутри именно этих объектов (по иерархии).
    3) Во вкладке Window » 2D » Tile Palette нужно создать палитру и перетягивать на сцену спрайты оттуда (также попробуйте возможность делать это не поштучно, путём их массового выделения), а не из вкладки Project.
    Если вы всё так и делали, проверьте настройки. При создании палитры вы могли незнаючи что-то тут поменять.
    63d8c5aa9d785789778703.png
    Если проблема останется, напишите в комментарии
    Ответ написан
    Комментировать
  • Как сделать 2д освещение?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Если бы такое задание дали мне, я бы в фотошопе маску полупрозрачную сделал. Если оно анимировано должно быть, то и маску тоже можно анимировать. А вообще, указанный вами пакет с такой задачей должен справляться, типа можно разделить стену с окном на фрагменты и настроить для некоторых из них тени.
    Если всё не то, то можно написать шейдер. Подсказки можете найти в этой статье https://habr.com/ru/post/425989/
    Ответ написан
    Комментировать
  • Как завершить игру?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Работа с плеером:
    https://stackoverflow.com/questions/36738981/how-d...

    Работа с вкладкой:
    https://answers.unity.com/questions/1576906/close-...

    Плюс всегда можно вызвать:
    Application.OpenURL("about:blank");
    Ответ написан
  • Как реализовать дурака онлайн?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Структуру описали выше, а насчёт самой логики. Разделите намерение сделать ход от реакции. Получив от игрока его намерение (нажатие, свайп и т.д.), вы не делаете изменений на клиенте, а шлёте запрос на сервер, а сервер уже реагирует (проверяет чей ход и рассылает обновления всем клиентам сессии).
    Ответ написан
    Комментировать
  • Как получить переменную аналогичную LOD показателю?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Ответом на ваш вопрос будет функция, принимающая из меша модели массив вершин и для каждой пробивающая координаты на экране в WorldToScreenPoint() - отрицательные = за камерой. Но, как правило, объекты не усекаются на части, видимые и невидимые камерой, поэтому достаточно просто факта наличия на экране.
    Поэтому, если вы не ставите перед собой задачу немного задолбаться, а просто узнать, рендерится объект или нет, то вот эта замечательная функция срабатывает только когда объект надо отрисовать на экране:
    https://docs.unity3d.com/ScriptReference/MonoBehav...
    Ответ написан
    1 комментарий
  • Не могу понять почему ошибка cs1003?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    В следующий раз, пожалуйста, оформите код при помощи соответствующего тега и приведите текст ошибки. Пока что могу сказать, что вот в этой строке содержится лишняя точка с запятой:
    public class lobby : MonoBehaviourPunCallbacks; {
    Ответ написан
    Комментировать
  • Как узнать минимальные требования для собственной игры?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Действительно лучший способ определить спецификации - эмпирический на большой выборке разных устройств. Коими, конечно же, одиночные разработчики не обладают. Но это не значит, что сделать тут ничего нельзя.

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

    Если вы захотите уточнить вашу гипотезу, можете продолжить ручной проверкой.

    1. Место на диске
    Просто посмотрите, сколько весит папка с собранной игрой.

    2. Количество ОЗУ
    Оценить максимум вы можете прямо в диспетчере задач, только проводите оценку не посреди главного меню, а в процессе максимума интенсивности игрового процесса. Также можете создать несколько виртуальных машин на вашем компьютере с разной конфигурацией и по очереди прогнать по ним игру.

    3. Видеокарта
    Оценить характеристики видео вы можете по загруженности игрой активными объектами и средствами, влияющими на отрисовку - шейдерам, освещению (трассировке лучей, отражениям и т.д.), постпроцессингу и т.д.. Тут зависимость простая - чем больше эффектов, тем круче видеокарта нужна, чтобы каждое обновление экрана всё это дело перерисовывать. Также почитайте про шейдерные модели. Например, та же 4 версия HLSL требует минимум DirectX 10 версии. Также грубо оценить видеокарту вы можете по тому же диспетчеру задач, сравнив значение столбца GPU во время интенсивной игры со значением мощности видеокарты.

    4. Процессор
    Оценка процессора самая сложная, т.к. в неё постоянно вмешиваются другие процессы. В том же диспетчере задач вы можете посмотреть, как сейчас ведёт себя процессор, плюс можете попробовать занизить его тактовую частоту или выделить игре больше/меньше ядер, чтобы посмотреть как она себя поведёт.

    5. Прочее - интернет, звук и т.д.
    Если ваша игра требует подключение к интернету, просто напишите "интернет". Если же она содержит механику потокового просмотра видео или стриминг, то также укажите скорость, которую можно замерить любой соответствующей утилитой. Если вы делаете игру для аудиофилов, укажите HiRes Audio. Если нужен контроллер - укажите какой. В остальном требования из разряда "это нужно или нет", а не "что конкретно нужно".

    Ну и, напоследок, отзывы.
    Люди так устроены, что никогда не начнут писать положительный отзыв, если не почувствуют в этом необходимость, а вот поругать игру выстраиваются целые виртуальные очереди. Вы всегда можете из негативных отзывов узнать, если с игрой что-то критически не так.

    Как видите, данный процесс весьма трудоёмкий, а местами требующий специфических знаний. Потому порой проще воспользоваться услугами тестировщиков, или заглянуть на реддит. Например, в r/playmygame или в r/playtesters.
    Ответ написан
    2 комментария