(C#, Unity)Как заблокировать управление?

243
06 апреля 2022, 13:00

Вот у меня есть код(Без смеха):

    void Start()
{
    rb = GetComponent<Rigidbody2D>();
    fill = 0.5f;
}
// Update is called once per frame
void Update()
{
    bar.fillAmount = fill;
}
void OnTriggerEnter2D(Collider2D col)
{
if (col.gameObject.name == "dieCollider")
{
    if (transform.position.x > 9.93f)
    {
        rb.AddForce(new Vector2(+5.0f, 0),ForceMode2D.Impulse);
    }
    if (transform.position.x < 9.92f)
    {
        rb.AddForce(new Vector2(-5.0f, 0),ForceMode2D.Impulse);
    }
    fill = fill - 0.1f;
}

if (fill <= 0)
{
    Destroy(gameObject);
    Debug.Log("Print");
    Application.LoadLevel (Application.loadedLevel);
}
}
void OnTriggerStay2D(Collider2D col)
{
    fill = fill - 0.01f;
    if (fill <= 0)
{
    Destroy(gameObject);
    Debug.Log("Print");
    Application.LoadLevel (Application.loadedLevel);
}
}

И

void Start()
{
    rb = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void FixedUpdate()
{
    if (Input.GetKey(KeyCode.A))
    {
        speedX = -horizontalSpeed;
    }
    else if (Input.GetKey(KeyCode.D))
    {
        speedX = horizontalSpeed;
    }
    if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
    {
        rb.AddForce(new Vector2(0, verticalImpulse), ForceMode2D.Impulse);
    }
    if (transform.position.y <= -4.57f)
    {
        Destroy(gameObject);
    }
    transform.Translate(speedX, 0, 0);
    speedX = 0;
}
private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.tag == "Ground")
      isGrounded = true;
}
private void OnCollisionExit2D(Collision2D collision)
{
    if (collision.gameObject.tag == "Ground")
     isGrounded = false;
}

Как сделать так,чтобы когда персонаж заходил в триггер,и на пару секунд у него блокировалось управление.

Answer 1

Можете попробовать изучить и реализовать паттерн "Состояние". Если коротко - у вас, например, есть отдельный абстрактный класс, отвечающий за обработку ввода (например BaseInputController). От него наследуются, например DefaultInputController и StunInputController, первый имеет стандартную логику передвижения, а второй игнорирует весь ввод (а там уже меняйте, как хотите). Реализация будет какая-нибудь такая (абсолютно случайный пример из головы):

using System;
using System.Collections;
using UnityEngine;
public class Test : MonoBehaviour
{
    BaseInputController _currentController;
    private void Start()
    {
        _currentController = new DefaultInputController();
    }
    private void FixedUpdate()
    {
        _currentController.UpdateControll();
    }
    public void DoStun(float duration)
    {
        _currentController = new StunInputController();
        StartCoroutine(DelayedActionRoutine(duration, () => _currentController = new DefaultInputController()));
    }

    IEnumerator DelayedActionRoutine(float delay, Action action)
    {
        yield return new WaitForSeconds(delay);
        action?.Invoke();
    }
    abstract class BaseInputController
    {
        public abstract void UpdateControll();
    }
    class DefaultInputController : BaseInputController
    {
        public DefaultInputController() { }        
        public override void UpdateControll()
        {
            //Здесь будет обработка управления вашим персонажем. Можете передавать его параметры в конструктор класса и управлять ими здесь
        }
    }
    class StunInputController : BaseInputController
    {
        public override void UpdateControll()
        {
            //Можно, например, показывать всплывающее сообщение над персонажем при попытке его сдвинуть
        }
    }
}

Таким образом можно клепать сколько угодно "особых" состояний-типов-управления и переходить между ними через какие-то условия верхнего класса. Параметры, которые требуется обрабатывать конкретному типу управления можно передавать в его конструктор (например, для базового - можете передавать базовую скорость и прочие параметры)

Answer 2

Сам недавно начал изучать. Я бы сделал так: Получи объект к которому прикреплен скрипт и выключи его

object.GetComponent<NameScript>().enabled = false;

Создай метод в котором включай обратно скрипт спустя пару сек

Invoke("NameMethod", 2f)
READ ALSO
Создание Control в рамках паттерна MVVM

Создание Control в рамках паттерна MVVM

Доброго времени суток!

87
Нумерация слайдов в slick slider

Нумерация слайдов в slick slider

У меня есть слайдер написанный на slick slider(там есть клавиши переключения, но речь не о них)У меня в макете есть цифры переключения слайдера(картинка...

70
Как изменить фоновое видео на HTML-странице через определенное время?

Как изменить фоновое видео на HTML-странице через определенное время?

Я бы хотел сделать 2 фоновое видео на страницуПервое видео фиксируется на указанный период времени, второе после предыдущего и является постоянным

201