О кнопках пользовательского интерфейса в единстве с условиями - PullRequest
0 голосов
/ 18 февраля 2019

Проблема с единичными кнопками пользовательского интерфейса с условиями

попытка заменить клавиши кнопками

void SlashAttack () 
{
    // We look for the current state looking at the information of the animator
    AnimatorStateInfo stateInfo = anim.GetCurrentAnimatorStateInfo(0);
    bool loading = stateInfo.IsName("Player_Slash");

    // Ataque a distancia
    if (Input.GetKeyDown("p") || Input.GetKeyDown(KeyCode.Z))
    { 
        anim.SetTrigger("loading");
        aura.AuraStart();
    } 
    else if (Input.GetKeyUp("p") || Input.GetKeyUp(KeyCode.Z))
    { 
        anim.SetTrigger("attacking");
        if (aura.IsLoaded()) 
        {
            // Para que se mueva desde el principio tenemos que asignar un
            // valor inicial al movX o movY en el edtitor distinto a cero
            float angle = Mathf.Atan2(anim.GetFloat("movY"), anim.GetFloat("movX")) * Mathf.Rad2Deg;

            GameObject slashObj = Instantiate(slashPrefab, transform.position, Quaternion.AngleAxis(angle, Vector3.forward));

            Slash slash = slashObj.GetComponent<Slash>();
            slash.mov.x = anim.GetFloat("movX");
            slash.mov.y = anim.GetFloat("movY");
        }

        aura.AuraStop();
        StartCoroutine(EnableMovementAfter(0.4f));
    } 

    // Prevenimos el movimiento mientras cargamos
    if (loading) 
    { 
        movePrevent = true;
    }
}

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Быстрый ответ: вы не можете, потому что UI.Button не имеет обратных вызовов для чего-то вроде button down или button up


Вы можете написать свой собственный компонент, используя IPointerDownHandler и IPointerUpHandler , если вы действительно не хотите изменять текущую структуру кода, например, как

using UnityEngine;
using UnityEngine.EventSystems;

public class Example : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
    public bool isDown;
    public bool isUp;

    //Detect current clicks on the GameObject (the one with the script attached)
    public void OnPointerDown(PointerEventData pointerEventData)
    {
        isDown = true;
    }

    //Detect if clicks are no longer registering
    public void OnPointerUp(PointerEventData pointerEventData)
    {
        isUp = true;
    }

    // reset both in LateUpdate
    private void LateUpdate()
    {
        isDown = false;
        isUp = false;
    }
}

Прикрепите это к своим кнопкам.

Чем в вашейссылка на код в соответствии с компонентом

public Example PButton;

void SlashAttack () 
{
    // ...

    // Ataque a distancia
    if (Input.GetKeyDown("p") || Input.GetKeyDown(KeyCode.Z) || PButton.isDown)
    { 
        // ...
    } 
    else if (Input.GetKeyUp("p") || Input.GetKeyUp(KeyCode.Z) || PButton.isUp)
    { 
        // ...
    } 

    // ...
}

Примечание

Убедитесь, что в сцене есть EventSystem, чтобы разрешить обнаружение указателя.Для обнаружения указателя на не-UI GameObjects убедитесь, что PhysicsRaycaster присоединено к камере.

0 голосов
/ 18 февраля 2019

Прежде всего разделите функциональность на отдельные методы, например:

public void OnKeyDown()
{
     anim.SetTrigger("loading");
     aura.AuraStart();
}

public void OnKeyUp()
{
    anim.SetTrigger("attacking");
    if (aura.IsLoaded()) 
    {
        // Para que se mueva desde el principio tenemos que asignar un
        // valor inicial al movX o movY en el edtitor distinto a cero
        float angle = Mathf.Atan2(anim.GetFloat("movY"), anim.GetFloat("movX")) * Mathf.Rad2Deg;

        GameObject slashObj = Instantiate(slashPrefab, transform.position, Quaternion.AngleAxis(angle, Vector3.forward));

        Slash slash = slashObj.GetComponent<Slash>();
        slash.mov.x = anim.GetFloat("movX");
        slash.mov.y = anim.GetFloat("movY");
    }

    aura.AuraStop();
    StartCoroutine(EnableMovementAfter(0.4f));
}

void SlashAttack () 
{
    // We look for the current state looking at the information of the animator
    AnimatorStateInfo stateInfo = anim.GetCurrentAnimatorStateInfo(0);
    bool loading = stateInfo.IsName("Player_Slash");

    // Ataque a distancia
    if (Input.GetKeyDown("p") || Input.GetKeyDown(KeyCode.Z))
    { 
       OnKeyDown();
    } 
    else if (Input.GetKeyUp("p") || Input.GetKeyUp(KeyCode.Z))
    { 
        OnKeyUp();
    } 

    // Prevenimos el movimiento mientras cargamos
    if (loading) 
    { 
        movePrevent = true;
    }
}

Поскольку мы сделали методы общедоступными, теперь вы можете связать их с пользовательским интерфейсом.Поскольку стандартная кнопка единства поддерживает только щелчок, а ваш код зависит от отпускания кнопки, вы можете использовать компонент EventTrigger, чтобы выделить события, на которые вы хотите связать

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...