Задать вопрос
Ответы пользователя по тегу Unity
  • Как сделать так чтобы объект шёл рандомно от объекта к объекту?

    @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 комментария
  • Невозможно передать аргументы в Initialize класса с MonoBehaviour?

    @DrRen7
    1) private void Awake()
    {
    Instantiate
    }
    void Start()
    {
    Initialize
    }
    2) сделать из _playerMovement.Method(); корутину с WaitForFixedUpdate()
    Ответ написан
    Комментировать