Unity 2D Как сделать множественную входную атаку - PullRequest
0 голосов
/ 29 апреля 2020

Я делаю компьютерную игру, в которой есть две кнопки. Я хочу сделать так, чтобы вы могли связать воедино эти кнопки. Например, используя кнопку 1 и кнопку 2, я хочу, чтобы пользователь мог нажать 1, затем 2, затем 1 и заставить его сделать что-то еще (в этом случае просто выведите 3).

Для лучшее объяснение:

Button 1 prints "1"
Button 2 prints "2"

Button 1, then 2, then 1 prints "3"

Я не совсем уверен, как go об этом. Буду признателен за любые идеи и помощь.

PS Если это не достаточно ясно, дайте мне знать, чтобы я мог редактировать этот пост.

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Вы можете сделать это по-разному, но, например, общий подход c к этому может быть:

abstract class Chain<T> {
    /// returns if its time to return
    public abstract bool Update ( double deltaTime );

    public abstract T GetValue ();
}
class ButtonChain<T> : Chain<T> {
    double time;
    double maxTime;
    T output;
    public Key key;

    List<ButtonChain<T>> next = new List<ButtonChain<T>();
    ButtonChain<T> chained;

    public ButtonChain ( double maxTime, Key key, T output ) {
        this.output = output;
        this.maxTime = maxTime;
        this.key = key;
    }

    public override bool Update ( double deltaTime ) {
        if ( chained != null ) return chained.Update( deltaTime );
        foreach ( var i in chained ) {
            if ( Input.Pressed( i.key ) ) {
                chained = i;
                return false;
            }
        }

        time += deltaTime;
        if ( time >= maxTime ) {
            return true;
        }
        retrun false;
    }

    public override T GetValue () => ( chained is null ) ? output : chained.GetValue();

    public ButtonChain Then ( ButtonChain chain ) {
        next.Add( chain );
        return this;
    }
}
class Player {
    ...
    List<ButtonChain<Attack>> attacks = new List<ButtonChain<Attack>>();
    ButtonChain<Attack> active;

    public void Update ( double deltaTime ) {
        ...
        if ( active != null ) {
            if ( active.Update( deltaTime ) ) {
                UseAttack( active.GetValue() );
                active = null;
            }
        } else {
            foreach ( var i in attacks ) {
                if ( Input.Pressed( i.key ) ) {
                    active = i;
                }
            }
        }
        ...
    }

    public void Start () {
        ...
        attacks.Add( 
            new ButtonChain<Attack>( 0.2, Key.Q, Attack.StandardAttack )
            .Then( 
                new ButtonChain<Attack>( 0.2, Key.W, Attack.SpinAttack )
                .Then(
                    new ButtonChain<Attack>( 0.2, Key.Q, Attack.UltraAttack )
                )
            )
        );
        ...
    }
    ...
}
1 голос
/ 29 апреля 2020

существует множество решений, вы можете поиграть со временем, чтобы клавиша 1 отделила действие для этой кнопки, я провел несколько тестов, но вы можете настроить как хотите ..:

private float elapse = 0f;

private bool b1 = false;
private bool b2 = false;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Alpha1))
    {
        elapse = 0;
        if (b1 && b2)               // phase 1 & 2 On?
        {
            Debug.Log("3");  //yes phase 3 print 3     
            return;
        }

        if (b1)           //you press 1 then 1
        {
            Debug.Log("1");
        }
    }
    if (Input.GetKey(KeyCode.Alpha1))
        elapse += Time.deltaTime;

    if (Input.GetKeyUp(KeyCode.Alpha1))
    {
        if (b1 && b2)       //set Off phase 1 & 2
        {
            b1 = false;
            b2 = false;
            return;
        }

        if (b1 && !b2)
        {
            b1 = false;
            return;
        }
        if (elapse > 0.5f) //key 1 down > 0.5seconds?
        {
            Debug.Log("1");//yes print 1
            b1 = false;
        }
        else
        {
            b1 = true;    //phase 1 is On
        }
    }
    if (Input.GetKeyDown(KeyCode.Alpha2))
    {
        b2 = b1;
        if(!b2)
            Debug.Log("2");
    }
...