Задать вопрос
Ответы пользователя по тегу Unity
  • Как реализовать изменение цветовой схемы (типа светлая/темная тема) в приложении, написанном на Unity?

    @DrRen7
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using TMPro;
    
    public class MenuColor : MonoBehaviour
    {
        [SerializeField] Image _backGround; //Добавляем фон в инспекторе
        [SerializeField] List<Button> _buttons; //добавляем кнопки в инспекторе
        private void Start()
        {
            DarkMode();
        }
        public void DarkMode()
        {
            _backGround.color = Color.black;                                           // Меняет цвет бекграунда
            for(int i=0;i<_buttons.Count;i++) 
            {
                _buttons[i].GetComponent<Image>().color = Color.white;                          // обводка кнопки 
                _buttons[i].transform.GetChild(0).GetComponent<Image>().color = Color.black;    //цвет кнопки 
                TextMeshProUGUI text = _buttons[i].transform.GetChild(1).GetComponent<TextMeshProUGUI>();//цвет шрифта кнопки
               text.color = Color.white;
                text.faceColor=Color.white;
            
            }
        }
        public void WhiteMode()
        {
            _backGround.color = Color.white;
            for (int i = 0; i < _buttons.Count; i++)
            {
                _buttons[i].GetComponent<Image>().color = Color.black;
                _buttons[i].transform.GetChild(0).GetComponent<Image>().color = Color.white;
                TextMeshProUGUI text = _buttons[i].transform.GetChild(1).GetComponent<TextMeshProUGUI>();
                text.color = Color.black;
                text.faceColor = Color.black;
            }
        }
    }

    Кнопка (родительский объект стандартная кнопка, 1 изображение чучуть меньше кнопки 2 дочерний текст )
    66857e14a77e3957747932.png
    Итого
    66857f375f7a3004009123.png

    цвет можно задавать через числа new Color32(255,0,0,255)(это красный) rgb и альфа
    Ответ написан
    Комментировать
  • Как сделать так чтобы руки следовали за камерой не сразу а с задержкой?

    @DrRen7
    hand.rotate = Quaternion.RotateTowards(hand.rotate, target.rotate,speedrotate);

    в данном случаи руки будут вращаться со скорость, что поставите, если надо что б прям какое то время стояли
    то условно можно через коорутиру speedrotate сделать 0 на какое то время
    Ответ написан
    Комментировать
  • Как сделать, чтобы вопросы шли по порядку списка, либо убрать повторения их?

    @DrRen7
    void questionGenerate()
        {
            if (qList.Count > 0)
            {
                randQ = Random.Range(0, qList.Count); //если не нужен рандом это удалить
                crntQ = qList[randQ] as QuestionList;
                qText.text = crntQ.question;
                List<string> answers = new List<string>(crntQ.answers);
                for (int i = 0; i < crntQ.answers.Length; i++)
                {
                    int rand = Random.Range(0, answers.Count);
                    answersText[i].text = answers[rand];
                    answers.RemoveAt(rand);
                                                             
                }
    qList.RemoveAt(qList[randQ]);
                                                  
            }
            else
            {
                Debug.Log("Вы прошли игру");
            }
        }


    смысл в том что надо удалить уже заданный вопрос из листа где лежат все вопросы
    Ответ написан
    Комментировать
  • Почему GameObject null?

    @DrRen7
    shootPF передан со сцены или это пребаб? при запуске гейммода shootPF на месте?
    [SerializeField] GameObject shootPF;
    как вариант для отсечения взаимодействия со стороны от других скриптов
    Ответ написан
  • Почему не работает NavMeshAgent?

    @DrRen7
    nma.SetDestination(player.transform.localPosition);

    А точно нужны локальные координаты? думаю тут просто нужен transform.position
    Ответ написан
    Комментировать
  • Как включать сразу несколько эффектов в Cinemachine?

    @DrRen7
    using UnityEngine;
    using Cinemachine;
    
    public class CameraShaker : MonoBehaviour {
    
        public CinemachineVirtualCamera _vCam;
    
        private CinemachineBasicMultiChannelPerlin _vCamNoise;
    
        void Start()
        {
            if (_vCam != null)
                _vCamNoise = _vCam.GetCinemachineComponent<Cinemachine.CinemachineBasicMultiChannelPerlin>();
        }
    
        void Update()
        {
           // _isShake = Input.GetKey(KeyCode.Space);
    
            if (Input.GetKey(KeyCode.Space))
            {
                _vCamNoise.m_AmplitudeGain = 2f;
                _vCamNoise.m_FrequencyGain = 1.2f;
            }
            else
            {
                _vCamNoise.m_AmplitudeGain = 0f;   
            }
        }
    }


    ну соответственно m_AmplitudeGain и m_FrequencyGain это из инспектора

    А все это переключать ну правильный вариант это сделать машину состояний с различными параметрами.
    Вариант попроще просто через свич
    Ответ написан
    Комментировать
  • Юнити, как сказать сцене что при загрузке нужно активировать аниматор и кнопки?

    @DrRen7
    Canvas включился и просто альфа на 0? Как переход в аниматоре сделан если через триггер его надо скинуть, можно попробовать сделать переход из any state через триггер что будет активироваться в Canvas Group при OnEnable()
    Ответ написан
  • Нужно ли результат функции от времени умножать на deltaTime в Unity?

    @DrRen7
    Тут надо на реальном примере посмотреть
    private void Update()
     {
         transform.position = transform.position + transform.forward * 5f * Time.deltaTime;
     }

    без дельтата тайма вообще нет времени в функции возьмем за константу что апдейт вызывается 60 раз(у нас 60фпс)
    S=S+f(t)
    где f(t) = transform.forward * 5f *(1c/60)

    Думаю для теста лучше подойдет Rigidbody, потому как там мы работает с силами(они же ускорения) а как знаем из физики скорость это первообразная от ускорения, там соответственно нет deltaTime(ну если мы работаем с силами)
    Ответ написан
    Комментировать
  • Стоит ли отключать интерполяцию твердого тела, при использовании Cinemashine?

    @DrRen7
    FixedUpdate вызывается раз в 0.02 с (по умолчанию) интерполяция нужна для расчета что будет делать объект между обновлениями её выключение может привести к прохождению через пол/стены при высокой скоростью.
    Варианты: если у врага нет rb зачем перемещать его в FixedUpdate? лучше тогда использовать Update, стоит ещё проверить Time.deltaTime или Time.fixedDeltaTime, про сейчас.
    Обычно камера идет в Late Update, условно что кадр должен отрисоваться после всех движений и выполнения всей логики и физика тут все портит, поэтому тут и нужна интерполяция
    Ответ написан
    Комментировать
  • Не получается настроить камеру в Unity, где мне нужно изменить код?

    @DrRen7
    using UnityEngine;
    
    
    public class CamHolder : MonoBehaviour
    {
        [Header("TargetObj")]
        [SerializeField] Rigidbody carPhysics;
        [Header("CamSettings")]
        [SerializeField] Transform _сamHolder;
        [SerializeField] float _camSpeedRotate=1f;
        [SerializeField] bool _rotateMode;
        [SerializeField] float _speedToDefault = 360f;
        [SerializeField] float _timerToSetDefoult=1f;
        float _currentTimerToSet;
    
        float mouseX, mouseY;
    
        float _camYaw;
        float _camPitch;
    
    
        const float k_bottomClamp=-90f;
        const float k_topClamp = 90f;
    
        private void Update()
        {
            GetMouseInput();
        }
    
        void GetMouseInput()
        {
            mouseX = Input.GetAxis("Mouse X");
            mouseY = Input.GetAxis("Mouse Y");
            if (Input.GetMouseButton(1))
            {
                Debug.Log("Test");
                _rotateMode=true;
                _currentTimerToSet = _timerToSetDefoult;
            }
            if (_rotateMode)
            {
                _currentTimerToSet -= Time.deltaTime;
                if(!(_currentTimerToSet>0))_rotateMode = false;
            }
        }
        private void FixedUpdate()
        {
            transform.position = carPhysics.transform.position;
            transform.rotation = carPhysics.transform.rotation;
        }
        private void LateUpdate()
        {
            CameraRotation();
        }
    
        private void CameraRotation()
        {
            if (_rotateMode)
            {
                _camYaw += mouseX * _camSpeedRotate;
                _camPitch -= mouseY * _camSpeedRotate;
                _camYaw = Clamper(_camYaw, float.MinValue, float.MaxValue);
                _camPitch = Clamper(_camPitch, k_bottomClamp, k_topClamp);
                _сamHolder.transform.rotation = Quaternion.Euler(_camPitch,
                    _camYaw, 0.0f);
            }
            else
            {
                _сamHolder.transform.localRotation = Quaternion.RotateTowards(_сamHolder.transform.localRotation,Quaternion.Euler(Vector3.zero),_speedToDefault*Time.deltaTime);
            }
        }
    
        float Clamper(float curAngle,float clampMin,float clampMax)
        {
            if (curAngle < -360f) curAngle += 360f;
            if (curAngle > 360f) curAngle -= 360f;
            return Mathf.Clamp(curAngle, clampMin, clampMax);
        }
    }

    665e0921d2dcc917802879.png
    скрипт на самый верхний объект

    надо еще поправить что б при включении камеры брался настоящий трансформ с камеры а то она прыгать будет, плюс если будет дергаться надо менять порядок вызова
    Ответ написан
    Комментировать
  • Как использовать Global Volume только для одного слоя Unity urp 2d?

    @DrRen7
    Не совсем уверен что то
    Присваиваешь объекту с компонентом Volume слой
    потом идешь в настройки камеры environment=> Volume mask и выбираешь слой с пп
    Ответ написан
    Комментировать
  • Почему Не работает код на респавн еды?

    @DrRen7
    [SerializeField] BoxCollider2D SpawnArea;
      private void Randomposition()
      {
          Bounds bounds = SpawnArea.bounds;
          float x =SpawnArea.transform.position.x+ Random.Range(bounds.min.x, bounds.max.x);
          float y = SpawnArea.transform.position.y+Random.Range(bounds.min.y, bounds.max.y); 
          //перед изменением надо проверить на наличие змейки в точке
          // не уверен что сработает , без должно тож работать
          Vector3 newpos=  new Vector3(Mathf.Round(x) + 0.5f, Mathf.Round(y) + 0.5f, -1f); //0.5 из за того что объект равен 1,1
          if (IsGetSnake(newpos))
          {
              Randomposition();
              return;
          }
          transform.position = newpos; 
      }
    
      bool IsGetSnake(Vector3 pos)
      {
          bool shake = false;
          if (Physics.Raycast(pos + Vector3.forward, -Vector3.forward, out RaycastHit hit)) 
          {
              if (hit.transform.tag == "snake")
              {
                  shake = true;
              }
          }
          return shake;
      }
    
      private void Start()
      {
          Randomposition();
      }
      private void OnTriggerEnter2D(Collider2D other)
      {
          if (other.tag == "snake")
          {
              Randomposition();
          }
      }
    Ответ написан
    5 комментариев
  • Не проигрывается Rigidbody .velocity?

    @DrRen7
    ну _playerRb.position.y получается ты умножаешь положение на силу и если игрок стоит в 0 то силы не будет и наоборот если стоит высоко то будет прыгать сильно
    да и лучше использовать addforce
    _playerRb.AddForce(_playerRb.transform.up * jumpHeight,ForceMode2D.Impulse);

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

    @DrRen7
    ну вариантов много ну самый простой
    это сделать игрока DontDestroyOnLoad, а при срабатывании сценария смены сцены( SceneManager.LoadScene("___"); ) задать игроку нужный Transform, вероятно может быть проблема с физикой если она, тогда надо сделать чек на загрузку сцены и менять трансформ уже после загрузки
    Ответ написан
    Комментировать
  • Какой ресурс более качественный, для изучения языка c#?

    @DrRen7
    Самый правильный вариант изучения юнити это оффсайт https://learn.unity.com/
    Во первых не все кто работают в Unity это программисты, там можно попробовать разные направления мб понравится делать VFX, или работать с анимацией
    Далее там есть условные макеты по котором можно учится как все делать и настраивать.
    Вроде даж можно и С# обучится на при мерах из ютини. Но вот это я б точно не советовал, все таки языки надо учить отдельно.
    Ответ написан
    Комментировать
  • Как привязать положение по оси Y одного объекта к положению по оси Y другого объекта?

    @DrRen7
    [SerializeField] GameObject _gO1;
       [SerializeField] GameObject _gO2;
    
       private void Update()
       {
           GameOBJ1Rotator();     
       }
       private void LateUpdate()
       {
           _gO2.transform.rotation = Quaternion.Euler(0, GetAngle(), 0); //задаем
           Debug.Log("GO1 :" + _gO1.transform.eulerAngles.y + " GO2 :" + _gO2.transform.eulerAngles.y); // дебаг для вращения
       }
       void GameOBJ1Rotator() ///это не надо просто для наглядности, как сломать вращение
       {
           _gO1.transform.rotation *= Quaternion.Euler(Vector3.one*90f*Time.deltaTime);
       }
       float GetAngle() //получаем градусы таргет объекта
       {
           float angle = _gO1.transform.rotation.eulerAngles.y;
           return angle;
       }

    Я тут специально сделал баг с захлопыванием элеров из за вращения тагрет объект по 3м осям сразу. В реальным примерах такое получить сложно, просто для наглядности и почему вращения задают кватернионами а не градусами.
    Ответ написан
    Комментировать
  • Как ограничить поворот по оси X?

    @DrRen7
    При считывании мыши не надо домножать на дельту, там и так идет дельта от предыдущий позиции. Не совсем понял что вам тут нужно, по коду ограничить поворот 310-50
    [SerializeField] float rotationSpeed = 360f;
        [SerializeField] float _inputPower=5f;
        float _inputY;
    
        private void Update()
        {
            _inputY -= Input.GetAxis("Mouse Y") * _inputPower;
            _inputY = Mathf.Clamp(_inputY, -50f, 50f);
            transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(Vector3.up * _inputY), rotationSpeed * Time.deltaTime);
        }

    если с осью поворота не угадал то Vector3.up изменить на другую
    Ответ написан
    1 комментарий
  • Box collider 2d и полет нормальный?

    @DrRen7
    Проверь physics material в коллайдерах.
    Плюс ещё можно проверить гравитацию 665334a790f15972754899.png
    Ответ написан
    4 комментария
  • Как в unity повернуть материал в probuilder?

    @DrRen7
    В Probuilder есть UV редактор поверни на 90 градусов нужные шелфы
    Ответ написан
    Комментировать
  • Как сделать так, чтобы после проверки If в Update действие выполнялось 1 раз?

    @DrRen7
    думаю проще игрока перевернуть , потому как там скорее всего ещё должны быть трансформы из которых пули летят и тд
    float _inputX;
        float _inputLastInput=1;
        private void Update()
        {
            _inputX = Input.GetAxisRaw("Horizontal");
            Mover();
        }
    
        private void Mover()
        {
            if (_inputX == 0) return;
            if (_inputLastInput != _inputX) RotObj();
            transform.position+=transform.right*Time.deltaTime;
        }
        void RotObj()
        {
            _inputLastInput *= -1;
            float angle = 180;
            if (_inputLastInput == 1) angle = 0;
            transform.rotation = Quaternion.Euler(0,angle,0);
        }
    Ответ написан
    Комментировать