Как можно реализовать автоматический перезапуск сцены, когда игрок достигает определенных координат?

Как заставить сцену в Unity перезагружаться, когда персонаж достигает определенной координаты после столкновения с препятствием? Вот пример моего скрипта.
  • 15 сентября 2023 г. 20:56
Ответы на вопрос 2
Вы можете реализовать автоматический перезапуск сцены, когда игрок достигает определенных координат, используя следующий код:

```c#
using UnityEngine;
using UnityEngine.SceneManagement;

public class RestartSceneOnReachCoordinate : MonoBehaviour
{
    public Vector3 targetCoordinate;
    
    private void OnTriggerEnter(Collider other)
    {
        if(other.CompareTag("Player"))
        {
            if(other.transform.position == targetCoordinate)
            {
                SceneManager.LoadScene(SceneManager.GetActiveScene().name);
            }
        }
    }
}
```

В этом скрипте используется коллайдер с объявленным тегом "Player" и метод OnTriggerEnter для обнаружения столкновений с препятствием. Если персонаж достигает координаты, указанной в переменной targetCoordinate, сцена перезагружается с помощью SceneManager.LoadScene.

Поместите этот скрипт на игровой объект, содержащий коллайдер, который служит препятствием. Настройте targetCoordinate, чтобы указать на необходимые координаты, при достижении которых сцена будет перезагружаться.

Пожалуйста, обратите внимание, что в вашей игре может быть несколько сцен, и в таком случае вам может понадобиться изменить параметры загрузки сцены в коде для достижения желаемого результата.
OnTriggerEnter2D вызывается один раз, при соприкосновении с триггером. В коде, который предоставлен, условие if (transform.position.y.Equals(-3)) выполнится только тогда, когда позиция объекта равна -3 в момент столкновения, а не после. Если триггер включает в себя указанную позицию (-3) и объект продолжает находиться внутри триггера, то можно использовать OnTriggerStay2D, который будет вызываться постоянно, пока объект находится внутри триггера. Вы можете вынести условие перезапуска сцены в 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();
        }

        if (!_isAlive && transform.position.y.Equals(-3))
        {                                                     
                SceneManager.LoadScene("level_1");
        }
    }

    void Jump()
    { 
        GetComponent().velocity = new Vector2(speed, 0f);
        GetComponent().AddForce(Vector2.up * force);
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.tag == "Enemy")
        {
            GetComponent().velocity = new Vector2(-7f, 0f);
            GetComponent().AddForce(Vector2.up * 300);
            gameObject.GetComponent().sprite = astronaut_2;
            _isAlive = false;
        }
    }
}

Кроме того, можно проверять, что позиция не равна -3, а меньше или больше в зависимости от направления отбрасывания персонажа. Это поможет избежать проблем, когда персонаж пролетает через заданную точку слишком быстро, и условие не успевает выполниться. Это всего лишь рекомендации, лучше самостоятельно разобраться в коде для лучшего понимания. Удачи!
Похожие вопросы