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

    EveningEugene
    @EveningEugene
    Unity-разраб
    1. Научиться ботом отслеживать любые сообщения пользователей.
    2. Научиться удалять сообщения.
    3. Научиться выдавать разные командные кнопки в зависимости от полномочий в группе.
    4. Научиться сохранять состояние по команде.
    5. Научиться проверять состояние.
    6. Объединить всё вышеописанное в единую фичу.
    Ответ написан
    Комментировать
  • Как сделать такой занос у Rigidbody2D?

    EveningEugene
    @EveningEugene
    Unity-разраб
    Во-первых, вам нужно уяснить разницу между физическим и не физическим движениями и понимать какие методы на что влияют. У вас изначально движение реализовано через физику, то есть вы придаёте объекту физический импульс и в конечном счёте это влияет на rg.velocity - именно он является итоговым вектором движения объекта.

    А теперь, в контексте вышесказанного, задумайтесь, что вы пытались сделать своим первым несработавшим способом? Просто попытались повернуть объект в пространстве, никак не изменив вектор движения.

    Во втором способе вы уже догадались применить правильный метод, но почему-то не догадались заглянуть в его документацию, чтобы узнать, а как его нужно правильно применять. Нет, вместо этого вы решили закинуть аргументы наугад, надеясь, что это заработает так, как вы хотите.
    А правильно так (пример взят прямиком из документации):
    Quaternion deltaRotation = Quaternion.Euler(m_EulerAngleVelocity * Time.fixedDeltaTime);
    m_Rigidbody.MoveRotation(m_Rigidbody.rotation * deltaRotation);

    , где m_EulerAngleVelocity - это вектор, содержащий в себе угол поворота для каждой из осей. Если ваш объект движется в плоскости XY, то вращать нужно вокруг оси Z:
    m_EulerAngleVelocity = new(0, 0, rotatePower);
    И не забудьте включить интерполяцию в компоненте rb объекта в инспекторе.

    Предвосхищая ваш дальнейший геймдизайнерский вопрос, скажу - где-то в этом коде вы должны сбрасывать скорость объекта в зависимости от eulerDelta, который вам не помешает самому придумать, как реализовать.
    Ответ написан
    Комментировать
  • Можете ли вы дать идею для реализации AI?

    EveningEugene
    @EveningEugene
    Unity-разраб
    Есть функция Vector2.SignedAngle, которая возвращает угол между двумя векторами. Причём эта версия Возвращает значения от -180 до 180. В зависимости от того значение меньше или больше нуля вам и нужно поворачивать направо или на лево, если вообще нужно поворачивать. И вот это "нужно ли поворачивать" - это вовсе не "угол равен 0", а какие-то небольшие отклонения от нуля.
    Уделяйте больше времени чтению документации, задача очень простая. Вам уже сказали, что тут простая векторная математика, а значит идёте и исследуете документацию по Vector2
    Ответ написан
    6 комментариев
  • Почему не работает смена локализации (языка) игры?

    EveningEugene
    @EveningEugene
    Unity-разраб
    Вы читаете какой сейчас язык внутри класса LocalisationSystem из статической переменной public static Language language. Значит и менять нужно тоже её, а не создавать где-то в другом месте новую, которую никто нигде не читает.
    public void ClickButtonRussian()
    {
        LocalisationSystem.language = Language.Russian;
    }
    Ответ написан
    4 комментария
  • Как оптимизировать изменение размера камеры?

    EveningEugene
    @EveningEugene
    Unity-разраб
    У вас есть динамические переменные sceneWidth, Screen.width, Screen.height, а значит запускать этот код можно не каждый апдейт, а только тогда, когда изменяются эти переменные. Выносите код в отдельный метод и вызываете его при каждом изменении этих переменных. У Screen наверняка есть событие, которое умеет сообщать об изменениях размера экрана, подписываете на него метод. sceneWidth можно превратить в свойство, которое в set также будет вызывать этот метод.
    Ответ написан
    Комментировать
  • Как поменять изображение у кнопки через скрипт?

    EveningEugene
    @EveningEugene
    Unity-разраб
    Вот у вас есть кнопка, которая реагирует на клик. Как она реагирует? Вызывает новое окно, где есть список смайлов. Как вызывает? Очевидно, через вызов какого-то метода, например, OpenSmileMenu(). Так вот, пускай этот метод имеет параметр Action<Sprite>. Что должно передаваться? Ссылка на метод класса кнопки по которому кликнули, который принимает в себя спрайт и этот спрайт уже применяет к изображению кнопки.
    private void UpdateSprite(Sprite sprite){
      spriteRenderer.sprite = sprite;
    }
    Что происходит в OpenSmileMenu(Action<Sprite> callback)? В нём мы этот колбек прибавляем к событию: SmileChoosed += callback;
    Далее. Что происходит при нажатие на смайл? Очевидно, вызывается обработчик клика. Что он делает?
    private void OnClick(Button button){
      callback?.Invoke(button.GetComponent<SpriteRenderer>().sprite);
      CloseSpriteMenu();
    }
    Ответ написан
    5 комментариев
  • Как менять угол наклона камеры в центре и в нужном направлении?

    EveningEugene
    @EveningEugene
    Unity-разраб
    EDIT с учётом, что выяснилось, что игра в 3д-изометрии.

    Есть некая точка, в которую всегда смотрит камера. И это та самая точка, вокруг которой должна вращаться камера, назовём её фокусом. Создай emptyObject на сцене и размести где-то чуть выше плоскости земли. Камеру размести на сцене так, как она должна изначально быть расположена относительно этой точки (главное, чтобы её x-координата была нулевой, важно в скрипте далее). С поворотом самой камеры в сцене париться сильно не надо, его мы назначим в Start() с помощью LookAt().
    Далее сделай камеру дочерней относительно фокуса, а в классе камеры заведи приватное поле под фокус и в инспекторе передай туда объект фокуса. А также заводим поля для настраиваемых скоростей.
    [SerializeField] private Transform _focus;
    [SerializeField] private float rotationSpeed = 1;
    [SerializeField] private float moveSpeed = 1;
    private void Start(){
      //
      tramsform.LookAt(_focus);
      //
    }

    Таким образом, если есть фича мгновенного переноса фокуса камера на удалённые объекты, то нужно двигать только сам фокус на тот объект, а камера будет уже двигаться сама, так как дочерняя.

    Далее поворот и движение якобы камеры, на самом деле фокуса, а камера меняет положение уже как дочерний объект
    private void RotateCamera()
        {
            if (Input.GetMouseButton(1))
            {
                float mouseMove = Input.GetAxis("Mouse X") * rotationSpeed;
                _focus.Rotate(0, mouseMove, 0); //-mouseMove для инвертирования
                Debug.Log("Rotation " + mouseMove.ToString());
            }
        }
    
        private void MoveCamera()
        {
            if (Input.GetMouseButton(0))
            {
                Vector3 mouseMove = new Vector3(Input.GetAxis("Mouse X"), 0, Input.GetAxis("Mouse Y")) * moveSpeed;
                _focus.Translate(mouseMove, Space.Self); //-mouseMove для инвертирования
                Debug.Log("Moving " + mouseMove.ToString());
            }
        }


    Только сейчас понял, что то, что вы называли "центром камеры", и есть фокус, куда она смотрит.
    Ответ написан
  • Как сделать вращение в заданном диапозоне?

    EveningEugene
    @EveningEugene
    Unity-разраб
    var TempBlood = Instantiate(Blood, transform.position, Quaternion.AngleAxis(Random.Range(-60, 60), Vector3.forward));

    Vector3.forward означает вращение вокруг оси z. Подойдёт, если игра в 2d. Если 3d, то сами замените на то, что нужно. Уточняйте в каком пространстве ваша игра, 2d или 3d.
    Ответ написан
    Комментировать
  • Как удалять дубликат объекта после перезапуска уровня?

    EveningEugene
    @EveningEugene
    Unity-разраб
    ChekingLVL checkingLvl = (ChekingLVL)FindObjectOfType(typeof(ChekingLVL));
    if (!checkingLvl) Instantiate(checkingLvlPrefab);
    Ответ написан
    Комментировать
  • Как отсортировать список?

    EveningEugene
    @EveningEugene
    Unity-разраб
    Каждая песня - это объект, а его просмотры - это одно из полей/свойств. Song.Views
    List<Song> songs;
    songs = songs.OrderBy(s => s.Views);
    //используйте OrderByDescending для порядка по убыванию
    Ответ написан
  • Функция swap заменить максимальные и минимальные значения массивов?

    EveningEugene
    @EveningEugene
    Unity-разраб
    Вызывая Swap() вы меняете местами значения в переменных maxA и maxB, но этим вы никак не модифицируете массивы, так как int - значимый тип, а не ссылочный.

    Предлагаю, вместо сохранения значений минимума и максимума, сохранять индексы ячеек с такими значениями, а функцию Swap() переделать так, чтоб он принимал массивы и индексы заменяемых ячеек и уже редактировать этот массив, меняя в нем местами значения по указанным индексам.
    Ответ написан
  • Почему не загружается сцена из кода?

    EveningEugene
    @EveningEugene
    Unity-разраб
    Edited: Тебе буквально в ошибке написали, что нужно сделать. File -> Build Settings -> Перетащить новую сцену в окно -> Поставить галочку напротив этой сцены game.
    Ответ написан
    4 комментария
  • Не найден метод пригодный для переопределения?

    EveningEugene
    @EveningEugene
    Unity-разраб
    Вы написали ключевое слово override, которое означает, что ты переопределяешь наследуемый метод. Но VS тебе говорит, что у наследуемого класса нет такого метода и поэтому нечего переопределять. А это от того, что ты вообще не наследуешь никакой класс. Либо ты хотел унаследовать какой-то класс, но забыл, либо ты скопипастил лишнее ключевое слово override. Даже целых два.
    Ответ написан
    2 комментария
  • Operator '==' cannot be applied to operands of type 'Collider[]' and 'bool'???

    EveningEugene
    @EveningEugene
    Unity-разраб
    У вас в классе есть переменная public bool ButtonOn;
    А также внутри метода Update есть переменная с таким же именем, но другим типом Collider[] ButtonOn;
    Когда в методе Update вы делаете сравнение if (ButtonOn == true), подразумевается именно локальная переменная Collider[] ButtonOn. То есть, вы пытаетесь сравнить Collider[] с bool. Либо меняйте название локальной переменной либо пишите так if (this.ButtonOn == true), тогда будет использоваться внешняя переменная класса.
    Рекомендую почитать про области видимости. А ещё при добавления кода в пост используйте тег
    <code lang="cs">
    //your code
    </code>
    Ответ написан
    1 комментарий