• Как сделать так чтобы объект шёл рандомно от объекта к объекту?

    @DrRen7
    Ost234,
    Просто на объект все будет работь.
    Если есть навмешь, но к объекту надо добавить агента то тогда уже движение будет не
    void MoveToPlayer()
        {
            transform.position = Vector3.MoveTowards(transform.position, _playerPos.position, _speed * Time.deltaTime);
        }


    а будет
    void MoveToPlayer()
        {
            agent.SetDestination(_playerPos.position);
        }
    Написано
  • Не сохраняется переменная в Unity через PlayerPrefs?

    @DrRen7
    Ну тадо тогда посидеть по дебагать, когда данные перестают записываться считываться.
    Есть еще вариант немного все изменить те не на прямую работать с PlayerPrefs а через условно другой скрипт который будет хранить переменные. Условно при старте он возьмет все значение(из PlayerPrefs) и ты будешь работать со значениями в этом скрипте, а когда надо просто то сохранить все значения
    Написано
  • Если переносить объект и держать долгое время и скидывать то он падает очень быстро. C# Что делать?

    @DrRen7
    matikYT, Ну тогда все проще скинь Velocity.у Rigidbody (а то она накапливается) перед падением плюс еще надо поставить интерполяцию(у Rigidbody) что бы при объект не проходил через коллайдер при большой скоростью
    Написано
  • Как лучше хранить и доставать ресурсы в unity?

    @DrRen7
    Ну класс Item ты создаешь в папке с проектом и его заполняешь потом кидаешь в общую базу (ItemHolder выше), а там уже делаешь с различные списки и поиски.
    Ну я создаю персонажа условно
    using UnityEngine;
    
    public class Player : MonoBehaviour
    {
        [Header("PlayerAnker")]
        [SerializeField] Transform _armorPos;
        [SerializeField] Transform _weaponPos;
        [SerializeField] Transform _helmetPos;
    
        ItemHolder _ItemBase;
    
        [Header("inventory")]
        Item _helmetItem;
        Item _weaponItem;
        Item _armorItem;
    
        private void Start()
        {
            _ItemBase = GameObject.FindGameObjectWithTag("GameMaster").GetComponent<ItemHolder>();
            NewSword();
        }
    
        void NewSword()
        {
            _weaponItem = _ItemBase._allITemList[0]; //<= ну условно у меня там есть метод для получение нужного меча
            EquipItem(_weaponItem, _weaponPos);
        }
    
        void EquipItem(Item item,Transform pos)
        {
            item.ReOpenItem(pos);
        }
    }


    Ну и по сути все Item это asset , и в них хранятся ссылки на спрайты и без условного ReOpenItem это просто адрес что то типо такого
    _sprites:
      - {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}

    Замысел в том что это хорошо все масштабируется, тебе же нужны не только внешний вид но и статы это все тоже можно получить через наследование там у брони защита или урон у оружия.
    Ну и с иконками все для инвентаря работает так же, написать метод что вытащит их Item сплайт для инвентаря
    Написано
  • Как лучше хранить и доставать ресурсы в unity?

    @DrRen7
    Varhelm,
    А понял тебе просто надо распаковать scriptableObject в gameObject щас подумаю с 2д я особо не знаком щас что нить попробуй по быстрому накидать

    using UnityEngine;
    
    public class Item : ScriptableObject
    {
        public enum ObjType
        {
            HeavyArmor, LightArmor, Swords, Stuffs
        }
        public int _id;
        public string _name;
        public ObjType _Objtype;
        public Sprite[] _sprites;
        public Sprite icon;
    
    
        public virtual void ReOpenItem(Transform pos)
        {
    
            GameObject openObj =new GameObject();
            openObj.transform.position = pos.position;
            openObj.transform.name = _name;
            for (int i=0; i< _sprites.Length; i++)
            {
                GameObject sonObj = new GameObject();
                sonObj.transform.SetParent(openObj.transform);
                sonObj.transform.localPosition = Vector2.zero; //?
                sonObj.AddComponent<SpriteRenderer>().sprite = _sprites[i];
                sonObj.transform.name = "Sprite " + (i + 1);
            }
    
        }
    }

    Ну сейчас по идеи объект должен открыться в том месте где укажешь, для оптимизации можно сделать что объект создается 1 раз а потом просто меняют имя и спрайты если надо то делает ещё дочерние объекты или их удаляет
    Написано
  • NullReferenceException: Object reference not set to an instance of an object?

    @DrRen7
    ian77, Текст это просто компонент как коллайдер и прочее создаешь пустой объект и добавляешь компонент текст
    662e330ebdae6672962592.png
    Написано
  • NullReferenceException: Object reference not set to an instance of an object?

    @DrRen7
    ian77, Попробуй юзать просто текст а не TextMeshPro только для него надо подключить
    using UnityEngine;
    using UnityEngine.UI;
     
    public class Plus : MonoBehaviour
    {
        Text _text;
    
    
        private void OnEnable()
        {
            _text = GetComponent<Text>();
        }
    
        private void Start()
        {
            
            _text.text = "Testing";
        }
    
    
    }


    Плюс проверь нет ли это скрипта ещё где то а то пишет что ошибка в GetComponent
    Написано
  • Instantiate создаёт два объекта в unity 2D C# Что делать?

    @DrRen7
    Данный скрипт случаем не находится на двух объектах которые сталкиваются? И или на объекте который создается?
    Написано
  • Как сделать так чтобы при запуске сцены счётчик очков обнулялся?

    @DrRen7
    Ost234, Добавить в скрипт
    private void Awake()
     {
         DontDestroyOnLoad(this.gameObject);
     }

    тогда сохранится этот объект и все его дочерние, при загрузке новой сцены
    Написано
  • Как правильно настроить считывание клавиш?

    @DrRen7
    caramel2312, 662bf022babab255004650.png
    Ну вот в mover можно сделать так переходы осуществляются через MovePower по сути что и есть скорость
    using UnityEngine;
    
    public class Mover : MonoBehaviour
    {
        Rigidbody _rb;
        float _currentSpeed;
        [SerializeField] float _walkSpeed=5f;
        [SerializeField] float _runSpeed=7f;
        [SerializeField] float _sprintSpeed=10f;
    
        Vector2 _inputVec2;
        Vector3 _moveVecto3;
        bool _sprint;
        bool _superStrint;
        bool _lastUpdateSuperPos;
        float _currentSuperSprintTime;
        float _superSprimtTime = 1f;
        Animator _anim;
        private void Start()
        {
            _rb = GetComponent<Rigidbody>();
            _anim = GetComponent<Animator>();
        }
    
        private void Update()
        {
            InputRead();
            SpeedControll();
            AnimUpdate();
        }
        void InputRead()
        {
            _sprint=Input.GetKey(KeyCode.LeftShift);
            _superStrint =Input.GetKey(KeyCode.LeftAlt);
            if (_superStrint && !_lastUpdateSuperPos) _currentSuperSprintTime = _superSprimtTime;
            _inputVec2.Set(Input.GetAxis("Horizontal"),Input.GetAxis("Vertical"));
            _lastUpdateSuperPos = _superStrint;
    
    
        }
        void AnimUpdate()
        {
            _anim.SetFloat("MoveFront",_inputVec2.x);
            _anim.SetFloat("MoveSIde", _inputVec2.y);
            if (IsMove())
            {
                if (_inputVec2.sqrMagnitude > 1f) _inputVec2.Normalize();
            }
            _anim.SetFloat("MovePower", _currentSpeed);
        }
    
        void SpeedControll()
        {
            _currentSpeed = _sprint ? _sprintSpeed : _walkSpeed;
            if (_superStrint && !(_currentSuperSprintTime > 0))
            {
                _currentSpeed = _sprintSpeed;
                _currentSuperSprintTime -= Time.deltaTime;
            }
            
        }
        private void FixedUpdate()
        {
            _moveVecto3.Set(_inputVec2.x, 0, _inputVec2.y);
            _rb.MovePosition(_rb.position+_moveVecto3 * Time.fixedDeltaTime * _currentSpeed);
        }
    
        bool IsMove()
        {
            return _inputVec2.sqrMagnitude != 0;
        }
    }

    это код для состояния на земле, если чучуть поиграться то можно допилить для остальных, ну для приседания по сути ничего менять не надо только сделать ограничение на скорость ну и измение размера коллайдера туда и обратно. С падением все интересней надо проверку на землю и изменить код для движения
    Написано
  • Почему текстуры с blockbench в unity ломаются?

    @DrRen7
    Попробовал в URP все нормально. 662bccae8e2b8753037313.png
    Как вариант попробуй сделать текстуру квадратной
    Написано
  • Как правильно настроить считывание клавиш?

    @DrRen7
    662ba3d433235568232638.png
    Вот как то там лучше сделать
    MoveFront, MoveSIde - это координаты вектора движения для 2D смешивания
    MoveFall - это rb.velocity.y если падение и набор высоты разные движения, мб надо для анимации приземления с большей высоты
    MovePower - скорость движения, для перехода идла, ходьбы и бега
    IsGround - переход между воздухом и землей
    IsCrouch - переход между состоянием присядя и в полный рост
    Attack - атака, можно использовать и bool

    ну это как бы сделал я. А так надо сидеть и думать о прерывания и как смешивать. Условно бег и ходьбу можно в 1 смешивание запихнуть, грубо говоря как на геймпад чуть отклонение ходьба полное бег а кнопка еще и спринт
    Написано
  • Почему выводится type mismatch при загрузке файла анимации в юнити?

    @DrRen7
    MAX_x, анимация и аниматор это разные компоненты. Грубо говоря аниматор это контроллер который воспроизводит определенную анимацию и его надо настраивать
    6627e5a15ffc4348554937.png
    Написано
  • Почему выводится type mismatch при загрузке файла анимации в юнити?

    @DrRen7
    сделай скрин из инспектора. И ты анимируешь камеру?
    Написано
  • Некорректное объединение объектов, как исправить?

    @DrRen7
    LinaApenko,
    можно проверить 66267944c8e10780827150.png
    потом выбрать face ALt+N->Flip
    хотя обычно розовый цвет это потеря текстур, надо удалить старый и назначить новый.И да если потом это идет в игровой движок то лучше все превратить в треугольники (ctrl + t)
    Написано
  • Как сделать переход на другую сцену при подборе 15 предметов на юнити?

    @DrRen7
    Да. Item должны иметь коллайдеры в режиме триггер и rigidbody c IsKineMatic

    сделал ассет что б понятней было https://disk.yandex.ru/d/hfLevbu4APkGMA
    Написано