Ответы пользователя по тегу Unity
  • Как сделать так, чтобы после проверки 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;
        }
    
    }
    Ответ написан
    Комментировать
  • Почему персонаж идёт некоторое после отжатия кнопки?

    @DrRen7
    Ну как из 1 проблем у тебя контроллер.Move используется дважды, плюс лучше использовать в апдейте это не rb
    controller.Move(_walkDirection.normalized * (_speedWalk * Time.deltaTime) +
                                 new Vector3(0.0f, _verticalVelocity, 0.0f) * Time.deltaTime);

    как то так будет
    Ответ написан
    Комментировать
  • Как написать скрипт Unity 2d для машины?

    @DrRen7
    Времени сейчас расписывать нету. Сделал ассет, но он в 3д, плюс материалы надо переставить
    туть
    Ответ написан
    Комментировать
  • Как решить ошибку build в unity?

    @DrRen7
    Проверь что все нужные SDK стоят и актуальны в UnityHub. Далее в самом юнити зайти и проверь, что в Edit -> Preferences -> External Tools стоят галки у рекомендованных.
    6641ff1d53c34679543579.png

    Если ошибка не пропадет там проблема с SDK (с версиями и путями), я напишу как поправить если проблема останется
    Ответ написан
  • Почему зомби (NavMesh) стоят некоторое время а потом идут к цели?

    @DrRen7
    Думаю проблема, что агенты друг другу мешают.
    using UnityEngine;
    using UnityEngine.AI;
    
    public class DebugAI : MonoBehaviour
    {
        NavMeshAgent _agent;
        void Start()
        {
            _agent = GetComponent<NavMeshAgent>();
           
        }
        private void OnDrawGizmos()
        {
            NavMeshPath path = _agent.path;
            Vector3 nowpoint = transform.position;
            foreach (Vector3 point in path.corners)
            {
                Gizmos.color = Color.yellow;
                Gizmos.DrawSphere(point, 0.15f);
                Gizmos.color= Color.green;
                Gizmos.DrawLine(nowpoint, point);
                nowpoint = point;
            }
        }
    }

    Накинь скрипт и посмотри что там с путем агента.
    Если пути нету то проблема с порядком выполнения кода
    Ответ написан
  • Существует ли технология декларативной генерации модели здания?

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

    @DrRen7
    1) Компонент mesh Renderer => Cast Shadows => Shadows only и получается что ты рендеришь только тени.
    У камеры есть Culling Mask там можно выбрать какие слои будут рендерится.
    Ну условно тебе надо что б одна камера рендерила, а другая нет. Создаешь объект делаешь еду точно такой же дочерний просто кидаешь их на разные слои.
    2) Ну или написать шейдер, но я тут не подскажу)
    Ответ написан
    Комментировать
  • Почему так сильно падает FPS при уничтожений объектов?

    @DrRen7
    ну Destroy и Instantiate достаточно ресурсоемкие команды. Как вариант можно написать пулер для зомби что бы вместо удаление их выключать а вместо создания новых активация выключенных. Вот если прям надо что бы 200 было на одном экране я бы начал присматриваться к DOTS
    Ответ написан
    Комментировать
  • Как сделать так чтобы объект шёл рандомно от объекта к объекту?

    @DrRen7
    using System.Collections.Generic;
    using UnityEditor;
    using UnityEngine;
    
    public class Tester : MonoBehaviour
    {
        [SerializeField] List<Transform> _allPoint=new List<Transform>();
        Transform _targetPos;
        [SerializeField] Transform _playerPos;
        [SerializeField] float _playerTargetDis;
        [SerializeField] float _stopDistans;
        [SerializeField] float _speed;
        bool _isToPlayer;
    
        private void Start()
        {
            SetAllPoint();
            _targetPos = SelectRandom();
        }
    
        void SetAllPoint()
        {
            foreach (GameObject t in GameObject.FindGameObjectsWithTag("Point"))
            {
                _allPoint.Add(t.transform);
            }
        }
        Transform SelectRandom()
        {
            int rand = Random.Range(0, (_allPoint.Count));
            Debug.Log(rand);
            return _allPoint[rand];
        }
        private void Update()
        {
            if (_isToPlayer) MoveToPlayer();
            else MoveToPoint();
            
                  
        }
        private void FixedUpdate()
        {
            _isToPlayer = SeePlayer();
        }
        void MoveToPoint()
        {
            transform.position = Vector3.MoveTowards(transform.position, _targetPos.position, _speed * Time.deltaTime); //заменить мб движение по нашмешу
            if(Vector3.Distance(transform.position, _targetPos.position) < _stopDistans) _targetPos = SelectRandom();
        }
       void MoveToPlayer()
        {
            transform.position = Vector3.MoveTowards(transform.position, _playerPos.position, _speed * Time.deltaTime);
        }
    
        bool SeePlayer() //тут это от проекта зависит я сделал от дальности без поля зрения и тд
        {
            if (Vector3.Distance(transform.position, _playerPos.position) > _playerTargetDis) return false;
            return true;
        }
    
    }

    ну это самое простое решение, мало вводных как объект перемещает мб навмешь и тд плюс надо подумать поле зрения и тд
    Ответ написан
  • Не сохраняется переменная в Unity через PlayerPrefs?

    @DrRen7
    я особо не пользовался PlayerPrefs но если в игре все сохраняется тогда просто нет сейва в файл попробуй добавить
    PlayerPrefs.Save(); при сохранении изменений
    Ответ написан
  • Если переносить объект и держать долгое время и скидывать то он падает очень быстро. C# Что делать?

    @DrRen7
    По сути у тебе объект не двигается а просто телепортируется, если нужно что бы падало плавно домножь вектор падения на Time. deltaTime, ну и тогда логика скрипта поменяется потому как падения надо вызывать каждый кадр
    Плюс я что то не понимаю смысл этой реализации)
    Ответ написан
  • Почему в Unity очень низкое качество?

    @DrRen7
    Ну так есть сцена где ничего не работает вы выдается минимальная картинка что бы уменьшить нагрузку, и уже сцена из камеры (Game) и там уже примерно как будет выглядеть игра главное scale не трогать он обычно идет какой то % от вашего максимального.
    6630eb3675934289363681.png

    Да и юнити модульный нужна графика по лучше надо поменять рендер. Не все просто работают с графикой по умолчанию стоит стоковый рендер даж без пост процессинга(ну условно).
    6630eccd79058590022310.png
    Ответ написан
    1 комментарий
  • Как лучше хранить и доставать ресурсы в unity?

    @DrRen7
    хмм тут нужен контекст что бы разобраться полностью
    сначала создаем ScriptableObject, что главное что б в нем было все совпадающие поля , допустим если где то нету условной иконки спрайта но тут не должно быть этого .
    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;
    }

    Далее создаем то что будет создавать нам ассеты я как пример взял оружие
    using UnityEngine;
    [CreateAssetMenu]
    public class Weapon : Item
    {
        public float _damage;
        public float _speedAttack;
    }

    теперь его можно создавать правой кнопкой
    662ff298535c1517918359.png
    Ну а потом уже где все будет хранится
    using System.Collections.Generic;
    using UnityEngine;
    using static Item;
    
    public class ItemHolder : MonoBehaviour
    {
        [SerializeField]List<Item> _allITemList = new List<Item>();
    
        [SerializeField]List<Item> _sword=new List<Item>();
    
        private void Awake()  
        {
            CreateNewList(_sword, ObjType.Swords,false);
        }
        void CreateNewList(List<Item>newlist,ObjType type,bool delete) // как пример создания листа
        {
            foreach (var item in _allITemList)
            {
                if (item._Objtype == type)
                {
                    newlist.Add(item);
                    if(delete)_allITemList.Remove(item);
                }
            }
        }
    }

    ну и просто заполняешь лист созданными объектами
    Ответ написан
  • Как сделать переключение между двумя состояниями при каждом нажатии клавиши Z?

    @DrRen7
    if (Input.GetKeyDown(KeyCode.Z) && !isPressed)
    {
        target = turretParent;
        distance = dist;
        heightPosition = height;
        isPressed = true;
    }
    
    if (Input.GetKeyDown(KeyCode.Z) && isPressed)
    {
        target = turretBarrel;
        distance = 0f;
        heightPosition = 0f;
        isPressed = false;
    }

    щас будет работать при отпуске Z ,для при нажатии поменять GetKeyDown на GetKeyUp
    Ответ написан
    Комментировать
  • Как сделать инерцию при вращении камеры в юнити?

    @DrRen7
    using UnityEngine;
     
    public class Rotate : MonoBehaviour
    {
        float _currentSpeed;
        float _targetSpeed;
        [SerializeField] float _speedRotate;
        const float c_acceleration = 20f;
        const float c_di_acceleration = 10f;
        float _acceleration;
    
        private void Update()
        {
            _targetSpeed = Input.GetAxis("Mouse Y")*_speedRotate;
            _acceleration = _targetSpeed != 0 ? c_acceleration : c_di_acceleration;
            _currentSpeed = Mathf.MoveTowards(_currentSpeed, _targetSpeed, _acceleration * Time.deltaTime);
        }
    
    }

    с константами надо поиграть что бы не было задержки при вращении
    Ответ написан
    Комментировать
  • Instantiate создаёт два объекта в unity 2D C# Что делать?

    @DrRen7
    Скорее всего проблема в настойках Rigidbody, вероятно один объект попадает в другой и получается 2 и более столкновений, это если еще и скрипты правильно размещены, но сути у вас вообще не должно ничего создаваться из за удаления объекта до создания.

    Я поправил написал должно работать , то лучше collision.gameObject.name == plusname заменить на collision.gameObject.tag
    using UnityEngine; 
     
    public class Plus : MonoBehaviour
    {
        public string plusname;
        public GameObject ReadyBall;
        GameObject _colObj;
        bool _IsCol;
    
        private void Update()
        {
            if (_IsCol) Pluser();
        }
    
        void Pluser()
        {
            _colObj.SetActive(false);
            GameObject newObj= Instantiate(ReadyBall, (_colObj.transform.position), Quaternion.identity);
            newObj.transform.name = "CreateBy" + this.transform.name; ///For Debug
            Destroy(_colObj);
            Destroy(this.gameObject);
    
        }
        void OnCollisionEnter2D(Collision2D collision)
        {
            if (collision.gameObject.name == plusname&&!_IsCol)
            {
                _colObj = collision.gameObject;
                _IsCol = true;
            }
        }
    }
    Ответ написан
    Комментировать
  • Возможно ли сделать адаптивный UI с помощью grid layout group?

    @DrRen7
    Настройка канваса
    662d4af519eca987115416.png
    Цифры в скейле должны быть какие в gamemode при сборке
    Настройка гирда
    662d4b561d2d4402692646.png
    Ставим констрейн по строкам или столбцам
    Ответ написан
    Комментировать