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

    @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://..." В моём случае это помогло.
    Ответ написан
    Комментировать
  • Как переместить курсор мыши по середине экрана?

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

    Способ 1
    В классе Cursor наличествует свойство lockState, определяющее поведение и видимость курсора. Сохранив в него значение CursorLockMode.Locked, вы переместите курсор в центр ОКНА ИГРЫ и скроете. Затем туда нужно сохранить значение Cursor.lockState = CursorLockMode.None, что разблокирует курсор и сделает видимым. Есть только одна проблема - эта операция работает не мгновенно, потому применить их последовательно не получится. Выглядеть код будет как-то так

    using UnityEngine;
    
    public class MouseCenteringExample : MonoBehaviour {
    
    	private void Start() {
    		Cursor.lockState = CursorLockMode.Locked;
    		Invoke("UnlockCursor", 0.05f);
    	}
    
    	private void UnlockCursor() => Cursor.lockState = CursorLockMode.None;	
    
    }


    Способ 2
    Если вы используете New Input System, то вам доступна опция InputState.Change, которую, в контексте вашей задачи, можно использовать так:

    using UnityEngine;
    
    public class MouseCenteringExample : MonoBehaviour {
    
    	private void Start() {
    		var center = Screen.safeArea.center;
    		Mouse.current.WarpCursorPosition(center);
    		InputState.Change(Mouse.current.position, center);
    	}
    
    }


    Способ 3
    Можно воспользоваться поддержкой нативных библиотек ОС. Правда, тут придётся подключить платформозависимую компиляцию. Например, для Windows:

    using System.Runtime.InteropServices;
    using UnityEngine;
    
    public class MouseCenteringExample : MonoBehaviour {
    
    #if UNITY_STANDALONE_WIN
    
    	[DllImport("user32.dll")]
    	static extern bool SetCursorPos(int X, int Y);
    
    	private void Start() {
    		var center = Screen.safeArea.center;
    		SetCursorPos((int)center.x, (int)center.y);
    	}
    
    #endif
    
    }
    Ответ написан
    2 комментария
  • Можно ли защитить Unity-игру от вскрытия ассетов через всякие assetRipper и тд?

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

    Если же вас беспокоит сохранность ресурсов, то просто забейте. Если ваш звук проигрывается - его можно записать. Если ваша картинка показывается, её можно заскринить. Заметьте, для этого даже взламывать не нужно - приложение само отображает эти ресурсы.

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

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

    @Ezekiel4 Автор вопроса
    Охотник на пиратов и сборщик монолитов
    Задал тот же вопрос ещё в паре мест, посоветовали установить Postman и полазить по внутренностям сайта через F12.
    Как оказалось, токен надо отправить в заголовок, а перед самим токеном поставить "JWT ". Надеюсь, это кому-то поможет.
    Ответ написан
    Комментировать
  • Что не так с Input Field-TMP в Unity?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    TextMeshProUGUI и есть текст, это не поле ввода. Поле ввода - это TMP_InputField. Попробуйте:

    using TMPro;
    using UnityEditor;
    using UnityEngine;
    
    public class Calc : MonoBehaviour {
    
    	[SerializeField] private TMP_InputField m_inputField;
    	[SerializeField] private TextMeshProUGUI m_text;
    
    	public void OnCalculate() {
            ExpressionEvaluator.Evaluate(m_inputField.text, out int result);
            m_text.text = result.ToString();
    	}
    }
    Ответ написан
    1 комментарий
  • Как сделать управление в Unity персонажем (ошибка в коде)?

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Добрый вечер. Замените

    Player.transform.position += Player.transform.forward * speed * Time.deltaTime;

    На
    transform.position += transform.forward * speed * Time.deltaTime;

    И поменяйте значение скорости, хотя бы на

    public float speed = 50;
    Ответ написан
    2 комментария
  • Как происходит передача хода от игрока к игроку в компьютерной настольной игре?

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

    1. Данные - некий указатель на то, чей сейчас ход. Можно сделать, например, булевой переменной (прим. крестики-нолики : ход крестика false, нолика true), числом (прим. ммо игра: id игрока), или перечислением (прим. варкрафт: RedPlayer, BluePlayer, TealPlayer, etc). Можно и другими (символ, строка-имя, IP или что-то ещё).

    2. Условие - каждый ход игра проверяет, какой игрок ходит.
    Как это работает - каждый игрок может ходить, но игра ходом это не считает (ничего не меняется). Например, просто тапы по экрану, на которые игра не будет реагировать, если этот игрок не соответствует игроку, чей сейчас ход.

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

    @Ezekiel4
    Охотник на пиратов и сборщик монолитов
    Сделайте один рут объект, на котором будет весь основной фарш (движение + твёрдое тело + коллайдеры). Объекты с графикой сделайте дочерними.
    При повороте персонажа делайте не флип, а вращение по оси Y рут объекта. Как-то так (x - это ввод с оси "Horizontal"):
    if (x != 0)
        transform.eulerAngles = new Vector3(transform.eulerAngles.x, x > 0 ? 0 : 180, transform.eulerAngles.z);
    // если оси X/Z без вращения, то можно так:
    if (x != 0)
        transform.eulerAngles = new Vector3(0, x > 0 ? 0 : 180, 0);
    Ответ написан
    Комментировать