Ответы пользователя по тегу Unity
  • Почему 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);
        }
    Ответ написан
    Комментировать
  • Множество Rigidbody ИНОГДА проваливается под пол, как исправить?

    @DrRen7
    Ну если проблема появляется на телефоне , логично что проблема с плохой оптимизацией.
    Как вариант можно поиграть с настройками Rigidbody, а точнее с Interpolate и Collision Detection, тогда объекты должны не проваливаться. Стоит написать фпс чекер и посмотреть нет ли паденийfloat fps=1/Time.deltaTime;
    Ответ написан
  • Как построить стены в 2D игре чтоб персонаж не мог через них проходить?

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

    @DrRen7
    using UnityEngine;
    
    public class ParentUsing : MonoBehaviour
    {
    
        GameObject _targetGO;
        bool UIVision;
    
    
        void Update()
        {
    
            if (Input.GetKeyDown(KeyCode.E) && _targetGO != null)
            {
                ParentSet(_targetGO);
            }
        }
    
        void ParentSet(GameObject newParentCursor)
        {
            gameObject.transform.parent = newParentCursor.transform;
        }
    
        void OnTriggerEnter(Collider other)
        {
            if (other.tag == "Cursor")
            {
                UIVision = true;
                _targetGO= other.gameObject;
            }
        }
        private void OnTriggerExit(Collider other)
        {
            if(_targetGO==other.gameObject)_targetGO = null;
        }
    
    }
    Ответ написан
    Комментировать