NAZYuy
@NAZYuy
Начинаю изучать Unity + C#

Как заставить сцену перезапускаться при достижении игрока в определенную координату?

В данный момент создаю игру похожую на flappy bird и столкнулся с такой проблемой. Я хочу заставить сцену перезагружаться, когда коллайдер персонажа доходит до определенной координаты карты после соприкосновения с коллайдером препятствия.
Скрипт прилагаю -
using System.Collections;
using System.Collections.Generic;
using UnityEditor.U2D;
using UnityEngine;
using UnityEngine.SceneManagement;

public class PlayerControl : MonoBehaviour
{
    public float force;
    public float speed;
    public Sprite astronaut_2;
    void Update()
    {
         if (Input.GetMouseButtonDown(0))
        {
            Jump();
        }
    }
    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;     //смена спрайта игрока после соприкосновения с препятсвием

        }
        {
            if (transform.position.y.Equals(-3))
            {                                                     //перезапуск сцены
                SceneManager.LoadScene("level_1");
            }
        }
    }
}
  • Вопрос задан
  • 106 просмотров
Решения вопроса 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, а меньше или больше (в зависимости от того, в какую сторону отбрасывает Вашего персонажа), т.к. если персонаж пролетит заданную точку слишком быстро, то условие может не отработать. Это краткие рекомендации, остальной код оставлен исходным, советую постараться подробнее разобраться самостоятельно для лучшего понимания. Удачи!
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы