Ответы пользователя по тегу Unity
  • Как отзеркалить объект в юнити?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Например, повернуть по oY transform:
    void Update() {
    	// read input
    	float x = Input.GetAxis("Horizontal");
    	
    	// rotate
    	if (x > 0) {
    		transform.eulerAngles = new Vector3(0, 0, 0); // right
    	} else if (x < 0) {		
    		transform.eulerAngles = new Vector3(0, 180, 0); // left
    	}
    	
    	// another logic..
    }
    Ответ написан
    Комментировать
  • Как превратить график в формулу?

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

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    1) Убедитесь, что ваш источник света в принципе может иметь тень.
    6518927525184696406283.png
    2) Удостоверьтесь, что нужный вам объект может давать тени.
    3) И проверьте, может ли другой нужный объект эти тени вообще получить.
    651892ab1565f427953654.png
    4) Дальше зайдите в Edit >> Project Settings >> Quality >> Shadows. Выберите подходящее для вас.
    651893a1f1699499906082.png
    5) Если теней всё равно нет, тогда проверьте используемые материалы. Вполне возможно, что вы используете шейдер, который берёт на себя работу с тенью, тогда настройте этот момент в материалах на объектах.
    Ответ написан
    Комментировать
  • Почему не работает Unity NavMeshAgent?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Humanoid - это стандартный тип объекта. Это нужно для того, чтобы правильно генерировать карту маршрутов. В настройках вы указываете размеры, величину шага и максимальный угол подъёма. Для каждого типа отдельно нужно запечь поверхность. Для этого поместите пустую точку на локацию и добавьте компонент NavMeshSurface. Затем для данной зоны выбираете агента и нажимаете в её настройках Bake. У вас должна земля закраситься голубой заливкой. Подробнее о её настройке смотрите в роликах Brackeys.
    1) https://www.youtube.com/watch?v=CHV1ymlw-P8
    2) https://www.youtube.com/watch?v=FkLJ45Pt-mY
    Ответ написан
    Комментировать
  • Где найти Ambient Light?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Environment >> Environment Lightning >> Source поменяйте на Color.
    Ответ написан
    1 комментарий
  • Unity. Как сделать след от шин при торможении в 2д игре, вид сверху?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Это обычно делается через Trail Renderer. Погуглите как он настраивается, а запуск и остановка вызываются через изменение свойства bool emitting
    Ответ написан
    Комментировать
  • Как обратится к объектам на карте?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Если у вас всё движение завязано на вызовы Update/FixedUpdate/LateUpdate, то вы можете остановить всю игру (меню будет кликабельно), просто написав:

    Time.timeScale = 0;

    Только потом не забудьте вернуть обратно на 1 при рестарте.
    Ответ написан
  • Как исправить ошибку nullreferenceexception: object reference not set to an instance of an object?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Вы серьёзно улучшите свой код, просто вынеся ссылки на Rigidbody2D и SpriteRenderer в инспектор, как вы сделали это со спрайтами выше. Вопрос не только в повышении читаемости кода, а ещё в том, что сама операция GetComponent имеет слишком большие накладные расходы, чтобы каждый апдейт её использовать. В примере вашей игры вы разницы не увидите, но лучше начать писать сейчас, чем потом переучиваться.

    Сама же ошибка от того, что скрипту не удаётся найти самому ссылку на Rigidbody2D объекта вот в этой строке:
    if (_rigidbody.velocity.y >= 0) // вот тут, '_rigidbody'
                {
                    gameObject.GetComponent<SpriteRenderer>().sprite = _raisingSprite;
                }
                else
                {
                    gameObject.GetComponent<SpriteRenderer>().sprite = _fallSprite;
                }


    А ну и ПС. между gameObject.GetComponent и GetComponent нет разницы - это одно и то же, просто во втором случае gameObject, можно сказать, вызывается неявно.
    Ответ написан
    Комментировать
  • Как делают игры с мультиками?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    В нашей сфере такие ролики называются кат-сценами. Я не смотрел референс, но судя по описанию вам достаточно иметь атласы с картинками, а затем в аниматоре проработать все анимации и переключаться между ними стандартными переходами. Это если говорить прямо про самый урезанный вариант. Можно также все кат-сцены самому отрисовать в любом подходящем редакторе и экспортировав как mp4 файлы запускать их в игре через Video Player в подходящий момент. Этот способ несколько тяжелее будет, однако рисование имеет больше визуальных приёмов, чем работа со скелетом или даже покадровой.
    Ответ написан
    Комментировать
  • Как сделать перетаскивание объектов в юнити 3д?

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

    Дальше вещь нужно перетащить. Учитывая платформу и условия, скорее всего это будет происходить путём вращения и движения самого персонажа, а объект будет просто привязан к игроку с сохранением относительного положения и поворота.. а это словно намекает на то, чтобы взять и на период переноски назначить transform.parent свойству объекта transform игрока, который вы вращаете.
    Ответ написан
    Комментировать
  • Как реализовать смену спрайта игрока при его взлете и падении?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Если вы делаете персонажа через Rigidbody 2D, то можете использовать его velocity:
    using UnityEngine;
    
    public class FlappyBirdGraphics : MonoBehaviour {
    
    	[SerializeField] private Rigidbody2D _rigidbody;
    	[Space]
    	[SerializeField] private SpriteRenderer _spriteRenderer;
    	[SerializeField] private Sprite _raisingSprite;
    	[SerializeField] private Sprite _fallSprite;
    
    	private void Update() {
    		if (_rigidbody.velocity.y >= 0) {
    			_spriteRenderer.sprite = _raisingSprite;
    		} else {
    			_spriteRenderer.sprite = _fallSprite;
    		}
    	}
    }


    Вектор _rigidbody.velocity это что-то типа скорости, а свойство y (_rigidbody.velocity.y) это его вертикальная часть. Ну и дальше просто смотрите на её знак.

    Можно ещё сделать через аниматор или трансформ, но через Rigidbody эту игру делать проще всего. Если захотите добавить промежуточное "начальное состояние", когда персонаж смотрит ровно, то можно взять значение 0 и близкие к нему и по такому же принципу туда вставлять соответствующую картинку.
    Ответ написан
    Комментировать
  • Unity стало выдавать выдавать ошибки, что делать?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Тут возможно одно из трёх:
    1) Нет места на жёстком диске. Бывают очень редкие сценарии, когда вместо привычного "Hard drive size is less than 1 GB", вылезает просто пустота. Для работы юнити, да и вообще windows в целом всегда стоит иметь минимум 2% (не менее 400мб) места на системном диске, а лучше все 10%.
    2) Закончилась оперативная память - если ничего не сработает, вернитесь к этому пункту и чекните что там с оперативкой через любую доступную утилиту, типа MemTest86 или Windows Memory Diagnostic. Есть совсем ненулевой шанс, что у вас там могут быть проблемы. А вообще, если её изначально мало и у вас на фоне был включен хром, то он вполне может её обнулить.
    3) Вот здесь (https://discussions.unity.com/t/blank-console-erro...) описана похожая проблема, смотрите первый, а затем второй ответ. Если ничего не поможет и с железом всё ок, пишите в комментарии, подумаем ещё.
    Ответ написан
    Комментировать
  • Как сделать картинку (панель) на весь экран?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Тут есть несколько моментов.

    1. Перевожу на русский, что вы пытаетесь сделать:
    Взять текущее разрешение экрана (не окна Game, а именно что экрана) - что значит, что у вас в консоли должно выводиться 1920x1080 даже при 1152x864. Если вам нужен размер именно окна Game, то его размеры такие:
    int screenWidth = Screen.width;
    int screenHeight = Screen.height;


    2. Единственный сценарий зачем это всё может быть надо что пришёл мне в голову - вы хотите заблочить клики вне диалогового окна за счёт непрозрачного для нажатий фона, но так как фон находится в префабе, вам приходится мучаться с его растяжением на весь экран.
    Если я вдруг не ошибся, то есть решение проще.
    Решение:

    Создаёте префаб изначально растянутый на весь экран. Внутри него создаёте пустой объект, который и будете включать и выключать, опять же, растянутый на весь экран. А внутри уже нужный вам фон (тоже растянутый) и панелька с текстом и кнопками.
    Таким образом вам достаточно просто включать выключать пустышку, которая будет работать и с фоном и с панелькой. Вот пример:
    650a16e0729f0813232153.png


    3. Непрошенный совет. Это касается не столько функциональности, сколько архитектуры кода. Если вы хотите качественно улучшить скрипты, попробуйте по мере возможности сразу хардкодить ссылки, тем более что это части одного объекта.
    Вот пример:

    Было
    public class DialogWindowController : MonoBehaviour {
    
    	private GameObject backgroundPanel;
    	RectTransform backgroundPanelRectTransform;
    
    	void OnEnable() {
    		// Получаем ссылку на панель и устанавливаем её размер на весь экран.
    		backgroundPanel = transform.Find("BackgroundPanel").gameObject;
    		backgroundPanelRectTransform = GetComponent<RectTransform>();
    		backgroundPanelRectTransform.sizeDelta = new Vector2(Screen.currentResolution.width, Screen.currentResolution.height);
    
    		// Отладка. Разрешение совпадает с реальным. Всё верно.
    		string str = Screen.currentResolution.width + "x" + Screen.currentResolution.height;
    		Debug.Log(str);
    		using (StreamWriter writer = new StreamWriter("test.txt")) {
    			writer.WriteLine(str);
    		}
    	}
    }


    Стало:
    public class DialogWindowController : MonoBehaviour {
    
    	[SerializeField] private RectTransform _background;
    
    	void OnEnable() {
    		_background.sizeDelta = new Vector2(Screen.currentResolution.width, Screen.currentResolution.height);
    
    		// Отладка. Разрешение совпадает с реальным. Всё верно.
    		string str = Screen.currentResolution.width + "x" + Screen.currentResolution.height;
    		Debug.Log(str);
    		using (StreamWriter writer = new StreamWriter("test.txt")) {
    			writer.WriteLine(str);
    		}
    	}
    }


    Ответ написан
    3 комментария
  • Почему не переключаются сцены в Unity?

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

    Если вы используете асинхронную загрузку, убедитесь, что вы правильно обрабатываете завершение загрузки сцены и не блокируете основной поток. И вообще проверьте на всякий случай, не слетели ли настройки сцен в Build Settings.

    Чтобы не тратить кучу времени, попробуйте также создать просто пустую сцену, и вызвать переход на неё на целевом устройстве. Если он перейдёт, значит вопрос именно с настройкой конечной сцены.

    Можно ещё проверить логи через ADB/AndroidStudio+Logcat. Без логов реально сложно сказать точнее что там не так, но с озвученного ранее уже можно начать проверку.
    Ответ написан
    Комментировать
  • При запуске вылетает игра Unity Android. В движке всё хорошо. Что делать?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Проверить можно через логи. Экспортируйте проект в Android Studio и запустите на встроенном эмуляторе свою игру. Там есть вкладка (окно) Logcat.
    Ответ написан
    Комментировать
  • Как обновить префаб на всех сценах (везде)?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Для начала убедитесь, что у вас правильно настроен сам канвас и отображение вообще.
    Во вкладке 'Game' сверху слева есть выпадающий список с размерами экрана. Выберите тот, на который равняетесь. Затем найдите свой канвас, там рядом должен быть компонент 'Canvas Scaler'. Установите значения свойств:
    * UI Scale Mode : Scale With Screen Size
    * Reference Resolution : на то же, что вы поставили во вкладке 'Game'.

    Касательно несинхронизированности префабов. Это происходит когда вы меняете префаб не внутри, а прямо на сцене, не заходя в режим префаба (дабл клик на файле нужного префаба или на стрелке вправо во вкладке 'Hierarchy').
    Если вы сделали то, что вам нужно, не заходя в режим префаба, в 'Inspector' префаба вверху прямо под Tag/Layer будет надпись 'Prefab' и выпадающий список 'Overrides'. Нажмите на него и выберите 'Apply All'. Таким образом вы сохраните ваш префаб. Если другие это изменение не подтянули, то у них в том же меню выберите 'Revert All'.
    Ответ написан
    Комментировать
  • Как сделать изменение переменной и текста у всех игроков Unity Photon Pun 2?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Есть такой механизм - RPC (remote procedure call). По своей сути, это сообщение, которое содержит некоторую информацию: сущность процедуры, данные, источник и цели вызова.
    Для начала на объект со скриптом добавьте PhotonView - у него мы и вызовем метод .RPC(), куда передадим всё что нам нужно. Выглядеть это будет как-то так:
    using UnityEngine;
    using UnityEngine.UI;
    using Photon.Pun;
    
    public class ButtonController : MonoBehaviourPunCallbacks {
    	
    	public int gen = 0;
    	public Text statusText;
    
    	private PhotonView photonView;
    
    	private void Start() {
    		photonView = GetComponent<PhotonView>();
    	}
    
    	// привязывается к кнопке
    	public void OnButtonClick() {
    		if (!photonView.IsMine)
    			return;
    
    		gen = 1;
    		UpdateStatusText();
    
    		photonView.RPC(nameof(SyncGen), RpcTarget.All, gen);
    	}
    
    	// локально меняет текст
    	private void UpdateStatusText() {
    		if (statusText != null)
    			statusText.text = (gen == 1) ? "done" : "not done";
    	}
    
    	// вот этот метод запускается сразу у всех копий этого объекта на всех его инстансах в текущей сессии
    	[PunRPC]
    	private void SyncGen(int newGenValue) {
    		gen = newGenValue;
    		UpdateStatusText();
    	}
    }
    Ответ написан
    Комментировать
  • Громкость звука в зависимости от расстояния в Unity 3D Photon?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Speaker (компонент фотона отвечающий за воспроизведение звука) базируется на стандартном AudioSource, в котором это и настраивается. Погуглите что такое Spatial Blend в Audio Source и разберите как работают настройки трёхмерного звука.
    Ответ написан
    Комментировать
  • Что делать если кнопки перестали работать на юнити 2д?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Сначала нужно определиться - кнопки именно что не работают или просто не нажимаются.
    На ум приходит 5 сценариев:
    1) Что-то мешает.
    Иерархия интерфейса устроена таким образом, что чем выше в иерархии объект, тем раньше он рисуется. Возможно ниже по иерархии есть иной графический элемент (даже если он в этом месте прозрачен, главное чтобы был включен), который перехватывает нажатие на себя. Нужно либо поменять иерархию, либо отключить галочку Raycast Target на всех объектах, которые мешают нажатию (ну или просто подвигать)
    2) Кнопка в принципе выключена.
    Проверьте, включено ли свойство Interactable кнопки
    3) Возможно сама кнопка не слушает нажатия.
    Проверьте на всякий случай, рядом с кнопкой на том же объекте должен лежать текст или картинка и там галочка Raycast Target должна быть включена.
    4) На сцене нет Event System
    Эта штука находится в меню создания UI / Event System
    5) Сам канвас не слушает нажатия - проверьте чтобы на канвасе был включенный компонент "Graphic Raycaster"

    Но может быть и так, что событие у самой кнопки просто не настроено (On Click)
    Ответ написан
    3 комментария
  • Как сделать плавное затухание частиц?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Поиграйтесь с настройками Size over Lifetime и Color over Lifetime.
    Ответ написан
    Комментировать