Ответы пользователя по тегу Unity
  • Как остановить движение объекта после соприкосновения с коллайдером другого?

    @devmikhalev
    OnTriggerEnter2D вызывается один раз, при столкновении с триггером, когда как Update вызывается каждый кадр.
    Таким образом согласно Вашему коду при столкновении Вы один раз останавливаете движение Вашего препятствия, после чего тут же снова запускаете его в Update. Можно просто при столкновении установить скорость = 0.

    Также вместо сравнения с помощью оператора "==" лучше сравнивать тег с помощью CompareTag(). Работать будет и так и так, но лучше сразу приучать себя делать правильно (положительно повлияет на скорость выполнения кода).

    И обратите внимание, что если используете стандартные теги Unity, то тег игрока там не "player", а "Player". Заглавные буквы в данном случае критичны, и если у объекта тег "Player", то при сравнении по "player" код не отработает.

    Вот пример кода:

    public class Map : MonoBehaviour
            {
                public float speed;
                void Update()
                {
                    transform.Translate(Vector2.left * (speed * Time.deltaTime)); //Движение объекта
                }
                private void OnTriggerEnter2D(Collider2D collision)
                {
                    if (collision.CompareTag("Player"))
                    {
                        speed = 0;
                    }
                }
            }
    Ответ написан
    1 комментарий
  • Почему TMPro не импортирует знаки препинания?

    @devmikhalev
    Потому что в Hex вы начинаете с цифры 0 (0030), как раз пропуская знаки препинания. Укажите вместо этого 0020-007F.
    Ответ написан
    1 комментарий
  • Как заставить сцену перезапускаться при достижении игрока в определенную координату?

    @devmikhalev
    OnTriggerEnter2D вызывается один раз, при соприкосновении с триггером, т.е. из Вашего кода исходит, что if (transform.position.y.Equals(-3)) выполнится только тогда, когда позиция равна -3 в момент столкновения, а не после него.

    Если триггер включает в себя указанную Вами позицию (-3), т.е. при достижении этой позиции объект не перестает быть внутри триггера, то Вы можете использовать OnTriggerStay2D, который постоянно вызывается, пока объект находится внутри триггера. В него нужно вынести условие перезапуска сцены, а все остальное оставить внутри OnCollisionEnter2D.

    Однако правильнее будет не привязывать условие к триггеру. Например так:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEditor.U2D;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class PlayerControl : MonoBehaviour
    {
        private bool _isAlive = true;  // введем булевую переменную указывающую на то, что персонаж жив
        public float force;
        public float speed;
        public Sprite astronaut_2;
        void Update()
        {
             if (Input.GetMouseButtonDown(0))
            {
                Jump();
            }
            // указываем, что если позиция равна -3, и персонаж не жив (_isAlive не равно true), то перезапускаем сцену
            if (!_isAlive && transform.position.y.Equals(-3))
            {                                                     
                    SceneManager.LoadScene("level_1");
            }
        }
        void Jump()
        { 
            GetComponent<Rigidbody2D>().velocity = new Vector2(speed, 0f);
            GetComponent<Rigidbody2D>().AddForce(Vector2.up * force);            //управление персонажа
        }
        private void OnTriggerEnter2D(Collider2D collision)
        {
            
            if (collision.tag == "Enemy")
            
            {
                GetComponent<Rigidbody2D>().velocity = new Vector2(-7f, 0f);
                GetComponent<Rigidbody2D>().AddForce(Vector2.up * 300);             //отбрасывание персонажа после соприкосновения с препятсвием
                gameObject.GetComponent<SpriteRenderer>().sprite = astronaut_2;     //смена спрайта игрока после соприкосновения с препятсвием
                _isAlive = false;  // после столкновения переключаем переменную в значение false, указывая на то, что персонаж погиб
    
            }
        }
    }


    Также можно проверять, что позиция не равна -3, а меньше или больше (в зависимости от того, в какую сторону отбрасывает Вашего персонажа), т.к. если персонаж пролетит заданную точку слишком быстро, то условие может не отработать. Это краткие рекомендации, остальной код оставлен исходным, советую постараться подробнее разобраться самостоятельно для лучшего понимания. Удачи!
    Ответ написан
    4 комментария
  • Как изменить Scale объекта увеличив его лишь в одну сторону?

    @devmikhalev
    Самый простой способ сделать то, о чем Вы говорите, это создать пустой GameObject и сделать трансформируемый объект дочерним пустому. Обратите внимание, что в указанном на скриншоте месте (1) должно быть указано Pivot, а не Center.

    Т.е. в иерархии у Вас сначала идет куб, в нем пустой объект (TubePivot на скриншоте), а внутри труба, которую нужно растягивать.

    Поместите трубу внутри пустого объекта так, чтобы нижний край трубы (который не должен "пробивать дно куба") был ровно по центру пустого объекта (2). После этого изменяя Scale пустого объекта Вы добьетесь нужного эффекта. Обратите внимание, изменять Scale нужно именно у пустого объекта, а не у дочернего, в котором расположен меш самой модели.
    6505a21823f62668147081.png
    Ответ написан
    Комментировать