Ответы пользователя по тегу Unity
  • Как решить ошибку build в unity?

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

    Если ошибка не пропадет там проблема с SDK (с версиями и путями), я напишу как поправить если проблема останется
    Ответ написан
    9 комментариев
  • Почему зомби (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
    Ставим констрейн по строкам или столбцам
    Ответ написан
    Комментировать
  • Почему текстуры с blockbench в unity ломаются?

    @DrRen7
    из за маленького размера надо отключить компрессию текстуры
    662cc4c9ec1bf572082853.png
    Вкл
    662cc5571e25e186596945.png
    Выкл
    Ответ написан
    1 комментарий
  • Как сделать так чтобы при запуске сцены счётчик очков обнулялся?

    @DrRen7
    void Start() //добавляем в старт что бы все отнулялость при запуске сцены
     {
         SetScoreZero();
     }
    
     public void SetScoreZero()
     {
         MyScore = 0;      //MyScore - это переменная где хранятся очки
     }

    добавляем на кнопку
    662c0371db76a208159214.png
    Ответ написан
  • Как правильно настроить считывание клавиш?

    @DrRen7
    Тут больше надо работать с аниматором. Про состояния а зачем их столько? Чем бег, ходьба и айдл отличаются друг от друга?
    Я б оставил только 3 состояния OnGround, OnAir, Crouch это я б единственное, что оставил в Bool в аниматоре. Атаку можно передать как триггер, ну а движение это флот.
    И да все инпуты должны быть в Update
    Ответ написан
  • Отклик при соприкосновении с коллайдером 2D?

    @DrRen7
    using UnityEngine;
    public class Player2dTest : MonoBehaviour
    {
        [SerializeField] Transform _wallLeft;
        [SerializeField] Transform _wallRight;
        Vector3 _targetTransf;
        [SerializeField] float _speed = 5f;
        Collider2D _myCol;
        bool _isMove = true;
        [SerializeField]bool _isWin;
        private void Start()
        {
            _myCol= GetComponent<Collider2D>();
            _targetTransf = _wallLeft.position;
        }
        private void Update()
        {
            if (_isMove)
            {
                _myCol.transform.position = Vector2.MoveTowards(_myCol.transform.position, _targetTransf, _speed * Time.deltaTime);
                if (_myCol.transform.position == _targetTransf) NewTargetMove();
            }
            if (Input.GetKeyDown(KeyCode.Space))
            {
                EndGame();
            }
        }
        void NewTargetMove()
        {
            if (_targetTransf != _wallRight.position) _targetTransf = _wallRight.position;
            else _targetTransf = _wallLeft.position;
        }
        void EndGame()
        {
            _isMove = false;
            if (_isWin) Debug.Log("You Win");
            else Debug.Log("You Lose");
    
        }
        private void OnTriggerEnter2D(Collider2D collision)
        {
            if (collision.tag=="FirstPart") _isWin = true;
        }
        private void OnTriggerExit2D(Collider2D collision)
        {
            if(_isWin)_isWin = false;
        }
    }

    Фото сцены и "бегающего объекта" 66284bf469039539456906.png

    можно заменить триггеры на boxcast в EndGame()
    Ответ написан
  • Почему коллайдеры деревьев на террайне съезжают?

    @DrRen7
    хмм интересно.
    1)Попробуй создать префабу родительский объект
    2)Присвоить террейну и деверьям разные LayerMask и убрать взаимодействия друг с другом.
    66282b6e7889d145251307.png
    как пример
    Ответ написан
  • Как сделать переход на другую сцену при подборе 15 предметов на юнити?

    @DrRen7
    using UnityEngine;
    using UnityEngine.SceneManagement; 
    
    public class GoNextStage : MonoBehaviour
    {
        int item;
        void PickUpIntem()
        {
            item++;
            if (!(item < 15)) Loader();
        }
    
        void Loader()
        {
            SceneManager.LoadScene("Second"); //<=Название след сцены
        }
    
        private void OnTriggerEnter(Collider other)
        {
            if (other.tag == "Item")
            {
                other.gameObject.SetActive(false);
                PickUpIntem();         
            }
        }
    }
    Ответ написан
    2 комментария