Unity에서 버튼을 연타하고 동시에 누르는 대책을 고려하다

평소 UI 주변을 만지지 않고(만지지 않고) UI 시리즈를 만져봤다.
두 번은 몰랐어.
처음에는 이거였어요.
UI의 긴 문자열 처리 고려

일의 발단


• 단독 버튼으로 모듈 단일 연격 및 압력조절 대책 강구
・그리고 눌렀을 때 표지를 세우고, 그 표지가 서 있을 때는 눌러도 처리하지 않는다
· static로 표시되면 다른 독립된 단추 구성 요소도 동작하지 않습니다
・버튼을 누르면 콜백은 비동기 처리가 가능하며 종료 후 깃발을 꺾으면 처리를 기다리셔도 됩니다
나는 이와 같은 물건을 만들고 싶다. 아무 생각도 하지 않고 그것을 매개 변수에 맡기고 싶다
움직였어!
기쁘지만 아이누마레이터는 재활용이 안 되기 때문에 두 번째 이후로는 움직이지 않는다.
아무튼 그렇습니다. 잘 모르는 asyn await를 시도해 보세요.
나는 이것이 시작이라고 생각한다.

자기도 놀란 장작타로의 처리


IEnumarator 를 적절하게 매개변수로 사용
public void SetOnClick(IEnumerator onClick){
태그 작업 전후 처리
IEnumerator OnClick(System.Collections.IEnumerator onClick)
{
    _isProgress = true;
    yield return onClick;
    _isProgress = false;
}
그걸 버튼 청취자에 등록하세요.
_button.onClick.AddListener(
    () =>
    {
        PlaySe(SeList.TestSe);
        if (_isProgress) return;
        StartCoroutine(OnClick(onClick));
    });
그에게 3초를 기다리게 하다
이렇게 등록하는 느낌.
public IEnumerator OnClickButton3()
{
    Debug.Log("OnClickButton3 Start");
    yield return new WaitForSeconds(3);
    Debug.Log("OnClickButton3 End");
}
이렇게 누르면 버튼 → 누를 수 없음 → 통신 대기 → 결과 처리 후 버튼 유효화
유사한 하류를 형성하다
예정했어
처음이었으면 좋겠다.

아싸 아싸 해보자.


일단 Async/await에 대해서 원래 이해를 못했기 때문에.
https://www.slideshare.net/UnityTechnologiesJapan/unite-tokyo-2018asyncawait
완전히 이해하다
이해하고 싶어!
매개변수 변경
public void SetOnClick(Func<Task> onClick)
청중에게 async로 단추를 등록하고 await on Click 앞뒤에 태그 동작을 추가합니다
 _button.onClick.AddListener(
    async () =>
    {
        PlaySe((int)SeList.TestSe);
        if (_isProgress) return;
        _isProgress = true;
        await onClick();
        _isProgress = false;
    });
3초만 기다려주세요.
private async Task AsyncMethod()
{
    Debug.Log("AsyncMethod Start");
    await Task.Delay(3000);
    Debug.Log("AsyncMethod End");
}
그런 단추를 생성합니다.
button = AddComponent<ButtonBase>(_rootObject.transform);
    button.Setup(
        res,
        new Vector2(120, 250),
        new Vector2(200f, 50f),
        "Async Method Callback");
    button.SetOnClick(AsyncMethod);
    button.FrameIn(SceneComponent.FrameInStartPos.Left);

무심결에 움직였어!

async/await 하기 어려운 일


어쨌든, 이렇게 하면 버튼 내부에서 처리를 기다릴 수 있다
자원 읽기 등 처리를 할 때 이엘드 리턴에서 자주 기다리죠. (안 해요?)
에서 이 단추를 등록하는 방법은 자원 읽기 등을 통해 완료를 기다리는 것입니다
        var ret = Resources.LoadAsync<T>(path);
        ret.completed += res =>
        {
            if (res.isDone)
            {
                progress = false;
                Debug.Log("LoadAsync isDone");
            }
        };
        bool isCancel = false;
        var cancelToken = tokenSource.Token;
        await Task.Run(() =>
        {
            //クソオブクソ処理
            while (progress)
            {
                if (cancelToken.IsCancellationRequested)
                {
                    isCancel = true;
                    return;
                }
            }
        }, cancelToken);
이렇게 되게 그런 고민이 있어요.
UniRx는 WaitWhile 이런 것도 되고요. await.
종교적인 이유로 도입이 안 될 때.
그리고 Task는 WebGL이 움직이지 않기 때문에 반드시 별도로 고려해야 한다
응,응
Await 리소스로 읽을 수 있도록 만들까요?

끝맺다


항목에 따라 버튼을 누르는 동시에 제어도 크게 다르다
어느 것이나 다 좋은 점도 있고 나쁜 점도 있다
그리고 나쁜 점이 많아요.
일반적인 동시에, 연속 대책을 어떻게 하면 좋을까
이번 버튼 자체는 로고를 들고 있지만 이벤트시스템에서는 사용하는 게 좋을까요?
만약 개별적으로 사용하지 않는다면,interactable를 가짜로 설정할 수 있다고 생각합니다
스태프들이 UI의 유효하지 않은 제어를 일부러 쓰게 하면 설정과 해제를 잊어버릴 수도 있어요.
개인적으로 이 부분은 체계적으로 이해해 주셨으면 좋겠습니다.

좋은 웹페이지 즐겨찾기