Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (1)

Лучшие ответы пользователя

Все ответы (4)
  • Как остановить движение объекта после соприкосновения с коллайдером другого?

    @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 комментарий
  • Как заставить сцену перезапускаться при достижении игрока в определенную координату?

    @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 комментария
  • Почему TMPro не импортирует знаки препинания?

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