Контакты
Местоположение
Украина, Киевская обл., Киев

Достижения

Все достижения (2)

Наибольший вклад в теги

Все теги (10)

Лучшие ответы пользователя

Все ответы (28)
  • Как оптимизировать изменение размера камеры?

    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());
            }
        }


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

    EveningEugene
    @EveningEugene
    Unity-разраб
    Translate() перемещает объекты без проверки на столкновения. То есть, предметы не будут останавливаться при визуальном столкновении со стенами и прочем, а просто проходить сквозь, даже без вызова методов типа OnCollisionEnter() и прочее.

    Второй нефизический способ - это модификация transform.position напрямую.

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

    _rb.AddForce() - позволяет прикладывать силы к физическому объекту, а физ.движок сам обсчитает, как именно это повлияет на конечный вектор скорости объекта.

    _rb.velocity (это свойство, а не функция, как вы написали) - редактирование вектора движения напрямую. Задаёшь конечный вектор скорости, а физический движок уже двигает объект.
    Ответ написан
    Комментировать
  • 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 комментарий