• Как пульнуть обекь в Unity?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Возможно, вы так и задумывали, но если нет, то в строке:
    num = Random.Range(0, 4);
    У вас генерируются числа от 0 до 3 включительно, но число 0 не обрабатывается методом спавна.

    Затем удалите следующие три строки:
    num = (int) num;
    yield return new WaitForSeconds(0.001f);
    num = 0;


    В первой вы делаете бесполезный каст int в int. Затем вы вызываете паузу, столь малую, что она, почти гарантированно сработает раньше следующего обновления экрана. Последняя же строка поставит номер спаунера на ноль - число, которое вы не обрабатываете в коде спавна ниже.

    Если не помогло - пишите в коменты, будем разбираться дальше.
    Ответ написан
  • Как сделать чтобы сфера шла всегда вперед и крутилась?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Существует, два разных направления вперёд:
    * transform.forward - направление вперёд объекта, зависящее от его поворота (обычно, ещё бывает берут transform.right и другие);
    * Vector3.forward - глобальное направление вперёд.

    Проблема вашего вопроса в том, что объект, двигаясь вперёд и кручась при этом будет либо вращаться на месте, либо описывать круг вокруг некоторого центра (в зависимости от настроек скорости движения и вращения.

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

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Сам по себе CharacterController имеет внутренний капсуль-коллайдер, который так-то не должен застревать внутри других объектов. Такое может происходить в случае неправильного использования (скрипты). Например, толкать персонажа внутрь коллайдера со слишком большой силой. Сделай вы так со стандартной связкой коллайдера и твёрдого тела, последний бы просто улетел от накопившихся внутренних напряжений. CharacterController же, в свою очередь, не то чтобы сдвинуть, даже телепортировать извне никак нельзя без его отключения.

    Также такой баг теоретически может возникнуть при движении с использованием свойства velocity, словно это rigidbody. Если вы вдруг так делайте - используйте метод Move(Vector3).

    Кроме того, ваш контроллер сам по себе не знаком с гравитацией. Есть также ненулевая вероятность, что стоя краешком на обрыве персонаж всё ещё считает себя стоящим на земле, и у вас не срабатывает код гравитации (если он вообще есть).

    В любом случае, для более квалифицированой помощи рекомендую приложить скриншот, содержащий настройки персонажа и раскрытый вид иерархии персонажа, а также код движения.

    Примерно вот так выглядит обычный скрипт персонажа с таким контроллером:
    скрипт

    using UnityEngine;
    
    [RequireComponent(typeof(CharacterController))]
    public class PlayerMove3D : MonoBehaviour {
    
    	CharacterController controller;
    
    	Vector3 input, velocity;
    
    	public float moveSpeed = 10f;
    	public float jumpPower = 10f;
    	public float gravity = 20f;
    
    	public Transform groundCheckPoint;
    	public float groundCheckRadius;
    	public LayerMask groundLayer;
    
    	private void Start() => controller = GetComponent<CharacterController>();
    
    	private void Update() {
    		input.x = Input.GetAxis("Horizontal");
    		input.z = Input.GetAxis("Vertical");
    		input = input.normalized;
    
    		bool grounded = Physics.CheckSphere(groundCheckPoint.position, groundCheckRadius, groundLayer);
    
    		if (grounded && velocity.y < 0)
    			velocity.y = -2f;
    
    		if (Input.GetKeyDown(KeyCode.Space) && grounded) {
    			Jump(Mathf.Sqrt(2f * gravity * jumpPower));
    		}
    	}
    
    	private void FixedUpdate() {
    		Vector3 moveVector = transform.right * input.x + transform.forward * input.z;
    		controller.Move(moveVector * moveSpeed * Time.fixedDeltaTime);
    
    		velocity.y -= gravity * Time.fixedDeltaTime;
    		controller.Move(velocity * Time.fixedDeltaTime);
    	}
    
    	private void OnControllerColliderHit(ControllerColliderHit hit) {
    		// TODO collisions
    	}
    }

    Ответ написан
    1 комментарий
  • Как сделать чтобы камера не поворачивалась?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Камера переворачивается потому, что вы поместили её в иерархии внутрь персонажа.
    Решается это так: делаете объект камеры независимым по иерархии от игрока и делаете скрипт. который к текущим координатам игрока прибавляет начальные координаты камеры на момент старта. Таким образом она всегда будет на нужном месте относительно игрока.
    Ответ написан
  • Как сделать пределы для камеры?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Если вы не поместите камеру внутрь персонажа по иерархии, то задача упрощается простой проверкой вхождения координат в некоторую область. Если область имеет неправильную геометрическую форму, то лучше воспользоваться другим ответом freeExec на этот вопрос. Если же у вас простой прямоугольник, можете сделать как-то так:
    using UnityEngine;
    
    public class CameraFollow2D : MonoBehaviour {
    
    	public Transform target;
    
    	public float minX, maxX;
    	public float minY, maxY;
    
    	private void LateUpdate() {
    		Vector3 nextPosition = transform.position;
    		nextPosition.x = Mathf.Clamp(target.position.x, minX, maxX);
    		nextPosition.y = Mathf.Clamp(target.position.y, minY, maxY);
    		transform.position = nextPosition;
    	}
    }
    Ответ написан
    Комментировать
  • Почему не отображаются буквы ошибок в консоли?

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

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Всё потому, что вы создали GameObject и ему же пытаетесь задать массу, хотя должны в Rigidbody. Как-то так:
    GameObject go = Instantiate(Resources.Load("Circle")) as GameObject;
    var rigidBody = go.AddComponent<Rigidbody>() as Rigidbody;
    rigidBody.mass = newMass;
    Ответ написан
    Комментировать
  • Как заставить камеру двигаться за игроком, но не вращаться с ним?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Если камера вращается вместе с игроком, вы добавили её в иерархию игрока. Если камера дёргается, то у вас либо рассинхрон с движением, либо само движение дёрганное.
    Ответ написан
    Комментировать
  • Unity: В игре не отображается заспавненый префаб. Как исправить?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Возможные проблемы:
    * Sprite Renderer / Order In Layer фона больше и/или равно земле, в таком случае рендер не будет понимать, в какой последовательности всё отображать правильно;
    * Камера физически находится впереди нужных спрайтов. Можете в режиме Play просто перейти в 3D и взглянуть на сцену сверху.

    Не помогло - пишите в комменты.
    Ответ написан
    Комментировать
  • Как изменить ambient light только для одной камеры?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Насколько мне известно - никак, т.к. это глобальные настройки. Если я правильно понял вашу задумку, вы можете выехать за счёт возможности источников освещения светить только на объекты выбранного типа. У компоненты Light самое нижнее свойство - Culling Mask - слои, на которые данный свет способен светить. Аналогичная настройка есть и у камеры.
    Вы можете создать набор слоёв, видимых разными камерами по-разному и также по-разному освещаемыми двумя разными источниками.
    Ответ написан
    Комментировать
  • Как убрать паузу в зацикленной анимации 3д объекта?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Самый лёгкий вариант - смените режим ключей. Делается это в таймлайне, путём выделения верхней ноды (соответственно и всех ниже), нажатием ПКМ и выбором мода во втором сверху разделе. Начните с "Auto", если не подходит - экспериментируйте.

    Способ погеморнее - вручную покрутить кривые анимаций. Во вкладке анимации снизу есть два раздела, включенный у вас DopeSheet и скрытый Curves. Выбираете нужную ноду и двигаете/крутите.

    Не поможет - пишите в коменты.
    Ответ написан
    1 комментарий
  • Можно ли найти работу gml(GameMaker)-разработчику игр?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Найти работу возможно, но очень сложно. Нужно быть отличным специалистом и закидывать своими резюме все студии, использующие game maker, какие только найдёте.
    Вы можете устроиться на работу официально с 14 лет при выполнении кучи условий, которые отобьют желание взять вас на работу любого потенциального работодателя, не связанного с вами одной фамилией.

    С другой стороны, вам никто не мешает создать свою команду, объединившись с людьми, которые будут решать другие задачи (например, графика и тестирование). Но до тех пор, пока вы не сработаетесь и не настроите рабочий процесс, вопрос дохода даже не стоит поднимать.

    Есть шанс залететь с этой темой на фриланс/аутсорс, но тут нужно отдельно хорошо разобраться, чтобы не случилась та самая "пустая трата времени и сил".

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

    И непрошенный совет напоследок.
    Если же вы всерьёз намерены войти в тему разработки игр, подумайте о переходе на Unity или Unreal Engine. Там тоже не всё гладко, но многие вопросы решаются просто за счёт их дикой популярности.
    Не спешите, вы ещё успете заработать очень много денег. Сейчас у вас есть время, когда не нужно платить за квартиру, оплачивать своего стоматолога и платить по кредитам. Вы можете просто делать игры "в стол" в свободное время.
    Пошарьтесь по вакансиям вашего направления разработки, посмотрите, что от соискателей требуют. Соберите самые часто встречаемые и попробуйте придумать игры (не обязательно интересные/сложные), которые будут это реализовывать. В процессе отметьте места, которые вам остались не понятны и в следующем проекте сосредоточьтесь именно на них.
    За оставшиеся до совершеннолетия пару лет у вас будет достаточно времени, чтобы в 18 сразу залететь как Middle+ разработчик и за несколько месяцев работы получить столько денег, сколько вы бы заработали на любой легальной, доступной официально вам работе в течение всего этого времени.
    И, если вы ещё этого не сделали, выучите английский, хотя бы на А1.
    Ответ написан
    Комментировать
  • Как можно создать онлайн в игре на Unity с такими требованиями?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Всё есть в гайдах, вот несколько названий, которые вам помогут соориентироваться в теме:
    * Для мультиплеера: Photon Fusion, Photon Realtime или Mirror Networking
    * Для авторизации: Playfab или Google Play
    * Для хранения данных удалённо: Firebase
    * Для локальных данных: JSON-сериализация или SQLite

    Это не все варианты, но норм способы войти в тему без лишних нервов.

    Ну и непрошенные советы - не стремитесь делать идеально сразу. Делайте ошибки и набивайте шишки, читайте документацию и долбите гугл вопросами - это нормально. На читеров забейте. Если вы потратите год на идеальную игру, с которой ни один хакер не справится, а в неё будет играть дай бог три с половиной человека, то какой в этом вообще смысл?

    Лучший способ сейчас сделать вашу игру практически не взламываемой - сделать приложение-вебплеер для браузерки, которая 100% валидаций будет проводить на сервере, а на клиенте будет чисто ловить ввод и показывать красивые анимации. Ну и, конечно, сделать прокси сервер на пути всех запросов к главному, чтобы усложнить всем жизнь.
    Ответ написан
    Комментировать
  • Как создать папку, файл и записать в файл данные на Android?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    На андроиде данные просто тупо не будут сохраняться, если вы неправильно настроили манифест, ну или пользователь не выдал разрешение на использование диска.
    Следующим на очереди проверки я бы предложил рассмотреть способ сохранения.
    Кэш сессии можно хранить по пути Application.temporaryCachePath, постоянный кэш в Application.persistentDataPath.
    Если нужно сохранить в галерею или на сд карту, в помощь нативный код (пример) или просто воспользоваться готовой либой/плагином (например)
    Ответ написан
  • Почему на RenderTexutre не отображается UI?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Я распишу весь процесс для тех, кто будет гуглить, вы просто проверьте у себя, всё ли правильно:

    1. Создать основной и дополнительный холст (Hierarchy >> Create >> UI >> Canvas) - на основном вы будете отображать текстуру, в которой будет виден целевой интерфейс;
    2. Создать Render Texture (вкладка Project >> Create >> Render Texture) - это контейнер для графической информации;
    3. В основном холсте создать Raw Image (Hierarchy >> Create >> UI >> Raw Image), в свойство RawImage.texture указать созданную в [2] текстуру - тут мы будем отображать данные текстуры;
    4. Создать дополнительную камеру, в свойство Camera.targetTexture установить текстуру из [2] - а отсюда мы будем данные в текстуру брать;
    5. У дополнительного хоста свойство Canvas.renderMode сменить на "Screen Space - Camera", а в появившемся ниже поле Canvas.renderCamera указать камеру из [4] - это нужно для того, чтобы в текстуру рисовался и UI.
    Ответ написан
    3 комментария
  • Как сохранить движение после заморозки объекта?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Создайте локальную переменную типа Vector3. Сохраните данные из rigidbody.velocity. Загружайте через метод rigidbody.addforce с установкой силы на ForceMode.VelocityChange. Не поможет - пишите в коменты
    Ответ написан
    3 комментария
  • Какая физика нужна разработчику игр?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Вопрос не в том что учить, а что вы хотите сделать. Это вопрос эффективности траты времени.

    Если вы хотите стать инженером, разрабатывающим движки для создания игр, вам прямая дорога во все разделы механики, колбания механических систем, а ещё оптику и высшую математику (кватернионы и прочее).

    Если вы хотите делать именно игры, и не хотите мучаться с формулами, то существует множество движков, позволяющих без боли и нервов использовать физическую систему всего в пару кликов.

    Возьмём, к примеру, Unity. Там на каждый объект игры можно добавлять компоненты, каждая из которых имеет свою функцию. Добавили коллайдер, и у вас готовая область для столкновений вокруг объекта. Добавили твёрдое тело, и у ваш объект теперь подчиняется физике. Добавили постоянную силу и теперь объект будет сам двигаться и/или вращаться.

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

    PS. Делать игры можно вообще без знания физики - есть куча игр, которые её не используют в принципе.
    Ответ написан
    Комментировать
  • Как исправить работу в скрипте unity?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Если данные теряются, то проблема может быть:
    * в сохранении, которое может как просто не сохранить, так и перезаписать мусорные данные;
    * в загрузке, которая может как загрузить не то, так и добавить своих мусорных данных через мутные валидации;
    * в интерфейсе доступа, который может иметь некорректные фильтры или вообще работать в другом потоке, из-за чего вы даже сообщение об ошибке не увидите;
    * в отображении - всякие Order in Layer у SpriteRenderer, ошибки настройки GridLayoutGroup, отсутствующие ссылки и т.п.

    В вашем конкретном случае рекомендую начать с построчной проверки Start - точно ли цикл отрабатывает все элементы, точно ли у всех нужных выполняются нужные условия. Затем проверьте работу GameManager и AdventureShop. В этом сильно помогает режим отладки, который имеется во всех нормальных IDE.
    Ответ написан
  • Как сделать так, чтобы анимация подстраивалась под точку?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Способ 1 (геморный):
    Объединить все анимации в группы, в зависимости от того, сколько и какие детали персонажа будут задействованы для её исполнения. На аниматоре персонажа выделить по одному слою для каждого фрагмента тела с дублирующими схожее действие анимациями через стейт машину, затем, имея простое число как ключ от стейт машины, вы просто считаете высоту препятствия. Или заранее проставляете точки для её просчёта.
    Например:
    6340b815c74c7939656683.png
    Это имеет смысл, если у вас реально большая игра. Примерно так и была реализована адаптивность анимаций в серии Assassin's Creed (точно Unity+, до неё хз), там более 800 фрагментов анимаций движения персонажа.

    Способ 2 (простой):
    Если у вас маленький или средний проект, не требующий идеального исполнения (хотя это тоже решаемо), воспользуйтесь возможностями дополнения Animation Rigging. Гайды по нему есть на всех языках в гугле.
    Ответ написан
    2 комментария
  • Почему игрок улетает при ударе с уголком?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Без скриншотов и кода могу лишь предположить, что вы перемещаете подчинённого физике персонажа либо телепортацией (модификация transform.position), либо управляете скоростью (Rigidbody.velocity). Оба способа рабочие, но порочные, так как первый вообще не работает на физику, а второй может сделать то, что случилось у вас.

    Если говорить о причине, я на 95% уверен, что произошла следующая ситуация:
    Ваш персонаж столкнулся с коллайдером и физика юнити начала отбрасывать его назад. Он же продолжает двигаться внутрь коллайдера, увеличивая силу, которая в итоге вырастет настолько, что персонажа буквально отшвырнёт. На ровной поверхности вы такой эффект не получите, а вот на углах легко просто потому, что точек сопротивления у коллайдера препятствия меньше.

    Рекомендую обратить внимание на Rigidbody.AddForce с установкой ForceMode (или ForceMode2D для 2D). Вот небольшая подсказка:
    6340b16fc6720621507048.jpeg

    Если мой ответ не помог, напишите и приложите скриншот настроек и вида персонажа, а также код движения (включающий полную последовательность вызова)
    Ответ написан
    Комментировать