Ответы пользователя по тегу C#
  • Как реализовать перемещение на определенное расстояние от одной точки к другой?

    @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);
    	}
    }
    Ответ написан
  • Как реализовать дурака онлайн?

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

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

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Занятный способ использовать агента. Обычно для движения используют Transform, Rigidbody, CharacterController или WheelCollider. Не видя проекта могу лишь сказать, что вы поместили камеру по иерархии внутрь игрока. И когда игрок поворачивается, камера поворачивается вместе с ним. Обычно для управления камерой пишут отдельный скрипт, что я вам и советую сделать.
    Ответ написан
    Комментировать
  • Как исправить ошибку NullReferenceException: Object reference not set to an instance of an object?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Ошибка заключается в том, что в этой строке:
    hit.collider.transform.parent.GetComponent<DoorScript>().count_v();

    Вы пытаетесь вызвать родительский объект у объекта, который не имеет родительского объекта. В таком случае получаете null. Если вы хотите обратиться к корневому объекту, используйте свойство root. Типа:
    hit.collider.transform.root.GetComponent<DoorScript>().count_v();

    Что, к слову, можно сократить до
    hit.transform.root.GetComponent<DoorScript>().count_v();


    Если же у вас есть вероятность, что скрипта DoorScript вообще не будет на объекте с данным тегом, то от него проще отказаться:
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class user : MonoBehaviour {
    
    	public float Distens = 0f;
    
    	void Update() {
    		if (Input.GetKeyDown(KeyCode.E)) {
    			Ray ray = new Ray (transform.position, transform.forward);
    			RaycastHit hit;
    			if (Physics.Raycast(ray, out hit, Distens))
    				if (hit.transform.root.TryGetComponent(out DoorScript door))
    					door.count_v();
    		}
    	}
    }
    Ответ написан
    Комментировать
  • Как установить ссылку на объект в Unity?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Есть такое понятие как контекст. Если переменная создана внутри одного блока кода, она не будет видима нигде, кроме этого и дочерних ему блоков кода, коими являются как методы, так и конструкции типа if. В вашем коде есть два фрагмента:
    if (!oneApple) {
    	if (Input.GetKeyUp(KeyCode.Q)) {
    		createApple();
    		GameObject apple = GameObject.Find("apple");
    		oneApple = true;
    	}
    }
    
    if (oneApple) {
    	apple.transform.position -= new Vector3(0, 0, 5 * Time.deltaTime);
    	if (apple.transform.position.z < -15) {
    		Destroy(apple);
    		oneApple =false;
    	}
    }

    Не понятно, идут они вместе или в разных методах, но даже на этом уровне видно, что контекст переменной apple находится исключительно внутри блока первого фрагмента кода. Решается это путём создания переменной класса. Если таковая уже есть, тогда из первого фрагмента удалите GameObject, чтобы получилось.
    if (!oneApple) {
    	if (Input.GetKeyUp(KeyCode.Q)) {
    		createApple();
    		apple = GameObject.Find("apple");
    		oneApple = true;
    	}
    }

    И, на будущее, вставляйте скрипты внутрь соответствующего тега.
    Пара непрошенных советов
    // Данный код
    GameObject createApple() {
    	GameObject result = new GameObject("apple");
    	GameObject apple = null;
    	apple = apllePrefab;
    	Vector3 applePos = transform.position + new Vector3 (1, 0.5f,1);
    	if (apple != null) {
    		GameObject go = Instantiate(apllePrefab, applePos,Quaternion.identity);
    	}
    	return result;
    }
    // Можно заменить на такой без потери смысла
    GameObject сreateApple() {
    	var applePos = transform.position + new Vector3(1, 0.5f, 1);
    	return Instantiate(apllePrefab, applePos, Quaternion.identity);
    }
    // Далее в этом фрагменте вы сначала помещаете объект на сцену, а затем пытаетесь его найти
    if (!oneApple) {
    	if (Input.GetKeyUp(KeyCode.Q)) {
    		createApple();
    		apple = GameObject.Find("apple");
    		oneApple = true;
    	}
    }
    // Не то чтобы метод GameObject.Find вообще не стоило
    // никогда использовать, но обычно есть более практичные
    // способы это сделать. Например передать прямую ссылку:
    if (!oneApple) {
    	if (Input.GetKeyUp(KeyCode.Q)) {
    		apple = сreateApple();
    		oneApple = true;
    	}
    }
    Ответ написан
    Комментировать
  • Как сделать чтобы каждая кнопка выводила свой текст на unity?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    У текстового поля как объекта есть два поля для имени/номера - имя объекта и видимое текстовое поле. Забегая вперёд скажу, что вы не можете удалить из консоли одно выбранное сообщение, а лишь всё скопом, что наталкивает на мысль, что вы подразумевали сделать кнопку-переключатель видимости вложенного текста.
    Если я прав, то вам достаточно привязать к кнопке что-то типа:
    public GameObject text; // ссылка на внутреннее текстовое поле
    // ...
    public void OnClick() { // привязать к кнопке
    	text.SetActive(!text.activeSelf); // переключает видимость
    }
    Ответ написан
    Комментировать
  • Почему при взаимодействии с UI в OnMessage вебсокет закрывает соединение?

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

    // очередь команд
    private readonly ConcurrentQueue<Action> _Actions = new ConcurrentQueue<Action>();
    
    // получаете сообщение - ставите в очередь
    private void OnMessage(object sender, MessageEventArgs e) {
    	_Actions.Enqueue(() => ReadResponse(e.Data));
    }
    
    // каждое обновление экрана запускаем всю очередь
    private void Update() {
    	while (_Actions.Count > 0)
    		if (_Actions.TryDequeue(out var action))
    			action?.Invoke();
    }
    
    // вот тут вы уже можете влиять на тот же текст
    private void ReadResponse(string data) {
    	// ваш код
    }
    Ответ написан
    1 комментарий
  • Как заставить камеру двигаться за игроком, но не вращаться с ним?

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

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

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

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

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

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

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

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

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

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

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    При открытии сцены всё её содержимое загружается в память, а при закрытии удаляется из неё. Вам же нужно пометить нужный объект как неудаляемый. Делается это в коде, примерно так:

    using UnityEngine;
    
    public class DontDestroyMe : MonoBehaviour {
    
    	private void Start() {
    		DontDestroyOnLoad(this.gameObject);
    	}
    }


    Почитать подробнее: https://docs.unity3d.com/ScriptReference/Object.Do...
    Ответ написан
    5 комментариев
  • Почему не работает UI у персонажа с ассета?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Проверьте по порядку:
    1) Есть ли на сцене объект Event System или одноимённый компонент?
    2) Не перекрывает ли кнопку иное изображение/надпись, с включенным Raycast Target?
    3) Привязано ли к кнопке нужное событие?

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

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

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

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

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

    @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);
    	}
    }
    Ответ написан
    Комментировать
  • Unity Почему не обрабатываются нажатия?

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