Ответы пользователя по тегу Unity
  • Как через PlayerPrefs сделать сохранение настроек?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Для сохранения логической переменной используйте int
    bool Fullscreen;
    //... SET
    PlayerPrefs.SetInt("Fullscreen", Fullscreen ? 1 : 0);
    //... GET
    Fullscreen = PlayerPrefs.GetInt("Fullscreen", 0) == 1; // 0 значение по умолчанию
    Ответ написан
    Комментировать
  • Как правильно регистрировать столкновения и пересечения с CharacterController-ом?

    @Ezekiel4 Автор вопроса
    Охотник на пиратов и сборщик монолитов
    Если у кого возникнет такой вопрос - смотрите сообщение OnControllerColliderHit
    https://docs.unity3d.com/ScriptReference/Character...
    Ответ написан
    Комментировать
  • Каких вы знаете ютуберов которые понятно и легко учат работать в Unity?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    На первых порах вам важно понять:
    * Интерфейс программы - какая вкладка за что отвечает
    * Панель инструментов - какой инструмент что и как делает
    * Как создавать и настраивать объекты
    * Как работать с Unity Asset Store
    В этом вам поможет просто любой, ведь облажаться на этом этапе крайне сложно - Unity имеет низкий порог входа.

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

    Ещё более глубокие темы, типа пайплайнов, shader graph, ads, iap и т.д. Уже через документацию и большую практику.

    Параллельно со всем этим вам нужно взять на вооружение официальную документацию по коду и мануалы Unity, а также аналогичную документацию по C#. И то и другое расписано довольно хорошо.

    Также полезный непрошенный совет - начните с малого. Не рвитесь делать убийцу гта/вов/майнкрафта. Сначала нужно развить понимание того, как всё работает. Для этого начните с простых пошаговых логических игр, вроде сапёра или крестиков-ноликов.
    Ответ написан
    1 комментарий
  • Unity, как сделать звук по кнопке (прочитайте текст)?

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

    По поводу второго - у источника звука есть параметр loop, влияющий за зацикливание звука, вам нужно лишь делать Play и Stop самого воспроизведения.
    Ответ написан
  • Как ограничить вращение камеры по оси x?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Есть функция Mathf.Clamp(float number, float min, float max), которая делает то, что вам нужно. Также для удобства работы, можете вынести наклон в отдельную внешнюю переменную. Выглядеть это будет как-то так:
    //... class
    float pitch;
    // ... Update
    pitch = Mathf.Clamp(pitch - mouseY, -90f, 90f);
    transform.Rotate(new Vector3(pitch, 0, 0));
    Ответ написан
    Комментировать
  • Как сделать адекватное рисование в unity?

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

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

    Если не помогло, напишите в комменты и уточните, в момент наблюдения бага вы используете движение/поворот или просто стоите рядом и персонажа крутит?
    Ответ написан
    Комментировать
  • Как отследить объект за границами камеры?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Всё сильно зависит от конфигурации якорей и центра. Для примера, я возьму дефолтный вариант:
    6323950533beb133518050.png
    Код будет как-то так выглядеть:
    using UnityEngine;
    
    public class Example : MonoBehaviour {
    
    	// отступы, используйте, если не хотите, чтобы ваша панель спавнилась вплотную к границе
    	public float leftMargin = 0f;
    	public float rightMargin = 0f;
    	public float upMargin = 0f;
    	public float bottomMargin = 0f;
    
    	// объект для спавна
    	public RectTransform prefab;
    
    	// родительский объект для спавна в него
    	public Transform parent;
    
    	private void Update() {
    		if (Input.GetMouseButtonDown(0)) {
    			// получаем координаты клика
    			Vector2 clickPosition = Input.mousePosition;
    			// центрируем объект относительно границ экрана
    			clickPosition.x -= Screen.width / 2;
    			clickPosition.y -= Screen.height / 2;
    			// находим общие границы для спавна
    			float xMin = (prefab.sizeDelta.x - Screen.width) / 2;
    			float xMax = (Screen.width - prefab.sizeDelta.x) / 2;
    			float yMin = (prefab.sizeDelta.y - Screen.height) / 2;
    			float yMax = (Screen.height - prefab.sizeDelta.y) / 2;
    			// делаем отступы
    			xMin += leftMargin;
    			xMax -= rightMargin;
    			yMin += bottomMargin;
    			yMax -= upMargin;
    			// ограничиваем точку спавна этими границами
    			clickPosition.x = Mathf.Clamp(clickPosition.x, xMin, xMax);
    			clickPosition.y = Mathf.Clamp(clickPosition.y, yMin, yMax);
    			// спавним объект
    			var obj = Instantiate(prefab, parent);
    			// меняем его местоположение
    			obj.localPosition = clickPosition;
    		}
    	}
    }
    Ответ написан
    1 комментарий
  • Какие можете порекомендовать курсы по unity (C#) разработке игр?

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

    Главная проблема геймдев курсов в том, что они не могут обеспечить норм зарплату ведущему, а потому вероятность, что там действительно окажется компетентный специалист с нужным вам опытом, не 100%. А даже если и будет, не факт, что он будет хорош как преподаватель.

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

    Если же с деньгами всё не так хорошо, то вы сами можете составить себе план курса, используя общедоступные планы курсов, например, топовых курсов на Udemy. Затем, останется лишь загуглить искомое название или найти соответствующее видео. А ответы на вопросы вы можете получить на этом сайте.
    Ответ написан
    Комментировать
  • Как сделать билд под mac будучи юзером на windows?

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

    Есть несколько способов, как в инди-геймдеве это решают, не имея денег на мак:
    1) Найти знакомого, у котого за презент можно стрельнуть ноут на пару дней;
    2) Арендовать ноут на пару дней, если у вас в городе есть такие услуги;
    3) Воспользоваться услугами аренды VPS;
    4) Если в вашей стране есть закон о возврате, вы можете купить ноут и сделав всё нужное, просто вернуть его обратно без потери денег;
    5) Объединиться со знакомыми с такой же проблемой и купить мак в совместную собственность;
    6) Если ваш комп не совсем уж древний, можете установить виртуальную машину с Unity и собирать в нём.
    Ответ написан
    Комментировать
  • Под какие разрешения экранов делать игру?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Экраны малого размера встречаются слишком редко, чтобы о них беспокоиться, если вы не делаете игру специально для них. Например Apple Watch Series 6 имеет разрешение 396 x 484.

    Если вы хотите обеспечить нормальный вид, проверьте, чтобы ваше приложение нормально смотрелось на девяти самых часто встречаемых разрешениях ноутбуков и смартфонов:
    1280:720
    1366:768
    1600:900
    1920:1080
    2160:1080
    2560:1440
    2960:1440
    3200:1800
    3840:2160
    Если у пользователя будет что-то другое - это его проблемы.

    Насчёт текста - у компонент UI.Text, TMPro.TextMeshPro и TMPro.TextMeshProUGUI есть возможность сделать размер текста адаптивным: у первого это свойство Best Fit, у последних двух Auto Size.
    Ответ написан
    Комментировать
  • Почему изображение не скачивается?

    @Ezekiel4 Автор вопроса
    Охотник на пиратов и сборщик монолитов
    Ответили в другом месте, суть в том, чтобы при попытках получения удалённого ресурса проверять статус запроса:
    public IEnumerator GetRemoteTexture(string url, Action<Texture2D> response) {
    	UnityWebRequest request = UnityWebRequestTexture.GetTexture(url);
    	yield return request.SendWebRequest();
    	if (request.result != UnityWebRequest.Result.Success){
    		response(null);
    	} else {
    		response(DownloadHandlerTexture.GetContent(request));
    	}
    }
    Ответ написан
    Комментировать
  • Как сделать бесскочнный звук с кнопками?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Как-то так:
    using UnityEngine;
    
    public class MusicDemo : MonoBehaviour {
    
    	public AudioSource audio; // в инспекторе сюда перетащите источник звука
    
    	public void OnPressed() { // привяжите к кнопке этот метод
    		if (audio.isPlaying) // если аудио играет
    			audio.Pause(); // поставить на паузу
    		else // иначе
    			audio.UnPause(); // снять с паузы
    	}
    }

    Если вам нужно, чтобы после достижения конца трека проигрывание начиналось заново, включите галочку loop в свойствах источника звука - это зациклит воспроизведение.
    Ответ написан
    Комментировать
  • Как запустить код в другом потоке?

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

    // ...
    using System.Collections.Concurrent;
    // ...
    private readonly ConcurrentQueue<Action> _Actions = new ConcurrentQueue<Action>();
    // ...
    // Когда вам нужно что-то запустить из другого потока, вызываете тут
    _Actions.Enqueue(() => {
    	// Ваш код
    });
    // ...
    private void Update() {
    	while (_Actions.Count > 0)
    		if (_Actions.TryDequeue(out var action))
    			action?.Invoke();
    // ...
    }
    Ответ написан
    Комментировать
  • Как настроить тригер?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Суть в том, что на цели должен быть проходимый коллайдер (включена галочка isTrigger), в таком случае у вас появляется доступ к событиям OnTriggerEnter2D, OnTriggerExit2D и OnTriggerStay2D, которые вызываются при вхождении, выходе и нахождении постороннего коллайдера внутри этого. Далее проверяете что именно вошло в коллайдер (например, по тегу, который есть только на игроке) и делаете SetActive(true) на кнопке.
    Как-то так:
    using UnityEngine;
    
    public class SimpleTrigger : MonoBehaviour {
    
    	public GameObject button;
    
    	private void OnTriggerEnter2D(Collider2D c) {
    		if (c.gameObject.tag == "Player")
    			button.SetActive(true);
    	}
    }
    Ответ написан
    Комментировать
  • Почему персонаж проваливается под террейн?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Персонаж проваливается потому, что нет коллизии между ним и рельефом. Возможные причины:
    1) Нет коллайдера на персонаже (или CharacterController-а) и/или на рельефе нет коллайдера;
    2) Один (или оба) из коллайдеров обозначен как проходимый (isTrigger=true);
    3) Вы пытались поставить игрока на землю на глаз и случайно "провалили" нижний кусочек коллайдера игрока сквозь границу рельефа;
    4) В настройках физики вы отключили коллизию между слоями игрока и рельефа (Edit > Project Settings, вкладка Physics, в самом низу будет схема с галочками);
    5) На персонаже висит Rigidbody, и вы даёте ему слишком большой имульс движения вниз, а в Collision Detection стоит не Continuous.
    Если ничего не помогло, заскриньте компоненты физики и движения в инспекторе персонажа и пришлите в ответ.
    Ответ написан
  • Unity Почему не обрабатываются нажатия?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Ввод не обрабатывается по одной из 4 причин:
    1) Отсутствует Event System;
    2) Требуемый компонент перекрывается иным компонентом или канвасом, у которого включено свойство Raycast Target;
    3) Ваш канвас типа World Space / Screen Space - Camera, но камера не указана;
    4) На объекте с Event Trigger отсутствует компонент, способный быть целью для взаимодействий с UI (галочка Raycast Target, например Image, который можно сделать прозрачным или Text, у которого можно удалить отображаемую надпись).
    Ответ написан
    Комментировать
  • Как проверить во что врезался рейкаст?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Переменная hit из вашего примера имеет тип RaycastHit (ссылочка на документацию), у которого есть свойство collider. Сам же метод Raycast возвращает логическое значение, определяющее, было ли касание в указанном направлении и расстоянии. Выглядеть это должно как-то так:
    if (Physics.Raycast(transform.position, _direction, out hit, 10f)) {
    	if (hit.collider == yourCollider) {
    		// some logic
    	}
    }

    Также это всегда можно совместить с TryGetComponent, если логика должна зависеть от определённого компонента, который может быть на цели (ссылочка). Как-то так:
    private MyComponent GetTarget() {
    	if (Physics.Raycast(transform.position, _direction, out hit, 10f))
    		if (hit.transform.TryGetComponent(out MyComponent m))
    			return m;
    	return null;
    }
    Ответ написан
    2 комментария
  • Как сделать перемещение пола с игроком на нем?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    В простейшем варианте должно быть что-то такое: когда игрок становится на платформу, мы делаем платформу его родительским объектом (свойство transform.parent), когда игрок спрыгивает с платформы, в transform.parent передаём null. Таким образом игрок будет двигаться сам по себе на платформе, будучи привязанным к ней до тех пор, пока не спрыгнет.

    Выглядеть это будет как-то так:
    using UnityEngine;
    
    public class PlatformMove : MonoBehaviour {
    
    	// movement
    
    	private void OnCollisionEnter2D(Collision2D c) {
    		if (c.gameObject.tag == "Player")
    			c.transform.parent = transform;
    	}
    
    	private void OnCollisionExit2D(Collision2D c) {
    		if (c.gameObject.tag == "Player")
    			c.transform.parent = null;
    	}
    }
    Ответ написан
    Комментировать
  • Как получить ответ из WebSocket?

    @Ezekiel4 Автор вопроса
    Охотник на пиратов и сборщик монолитов
    Итак, если у вас появилась аналогичная проблема и вы перепробовали всё возможное, проверьте, не должно ли в адресе сервиса быть "wss://...", а не "ws://..." В моём случае это помогло.
    Ответ написан
    Комментировать