[Unity(C#)] 점프 기능이 있는 텍스트를 UniRx로 한 글자씩 표시하는 설치를 시도했지만 미묘했습니다.

UniRx


Unity에서 사용할 수 있는 Reactive Extension인 것 같습니다.
이 설명이라면 나도 무슨 뜻인지 모르니 링크의 말을 참고하여 설명해 주십시오.
이벤트에 대한 반응을 확장하는 라이브러리
어떤 활동(버튼 누르기, 플레이어 이동 등 무엇이든)에 대한 반응
간단하게 쓸 수 있을 것 같아요.
제가 원본 코드를 보러 갈게요.
나는 "네, 그렇습니다."라고 말할 수 있는 수준을 이해할 수 없다.
Rx가 채택한 디자인 모델에는 Observer 모드가 있습니다.
그것에 관해서 다른 사람에게 설명할 수 있는 부분을 이해할 수 있다면 총괄해 보고 싶습니다.
이번에는 사용하면서 기억하세요.
이런 의도는 조사하면서 하면 유감스럽게도 완성되기 때문에 그것을 노트에 남겨 두어야 한다.

텍스트를 한 글자씩 표시하다


GIF에서 본 만화라는 뜻이에요.

이미 몇 년 전에 실시된 선구자가 있다.
[참조 링크]: UniRX에서 uGUI 텍스트 애니메이션하기
모든 문자 표시 기능 자체는 참고 링크로 이루어진다
이번에는 UniRx에 건너뛰기 기능을 설치합니다.

코드


텍스트 구성 요소가 있는 객체에 부착
using UniRx;
using System;
using UnityEngine;
using UniRx.Triggers;
using UnityEngine.UI;

public class TextPerOneWrite : MonoBehaviour
{
    [SerializeField]
    float m_textInterval = 0.2f;

    [SerializeField]
    KeyCode m_keyCode = KeyCode.Space;

    Text m_windowText;

    IDisposable m_textDispose;
    IDisposable m_updateDispose;

    void Start()
    {
        m_windowText = this.gameObject.GetComponent<Text>();
        m_windowText.text = "";

        //実行サンプル 文字を1文字ずつ出す
        ShowPerOne("ウホウホバナナヨコセ");
        ShowPerOne("ウホウホバナナヨコセ(早口)", 0.1f);

    }

    void ShowPerOne(string commentText)
    {
        m_windowText.text = "";

        if (m_textDispose != null)
        {
            m_textDispose.Dispose();
            m_updateDispose.Dispose();
        }

        m_textDispose = Observable.Interval(TimeSpan.FromSeconds(m_textInterval))
            .Take(commentText.Length)
            .Select(_ => 1)
            .Scan((accumulation, newValue) => accumulation + newValue)
            .DoOnCompleted(() => m_updateDispose.Dispose())
            .SubscribeToText(m_windowText, length => commentText.Substring(0, length))
            .AddTo(this);

        //特定のキー入力で文字を1文字ずつ出す機能を止める
        m_updateDispose =  this.UpdateAsObservable()
            .FirstOrDefault(_ => Input.GetKeyDown(m_keyCode))
            .Subscribe(_ =>
            {
                m_textDispose.Dispose();
                m_windowText.text = commentText;
            });
    }

    void ShowPerOne(string commentText, double textInterval)
    {
        m_windowText.text = "";

        if (m_textDispose != null)
        {
            m_textDispose.Dispose();
            m_updateDispose.Dispose();
        }

        m_textDispose = Observable.Interval(TimeSpan.FromSeconds(textInterval))
            .Take(commentText.Length)
            .Select(_ => 1)
            .Scan((accumulation, newValue) => accumulation + newValue)
            .DoOnCompleted(()=>m_updateDispose.Dispose())
            .SubscribeToText(m_windowText, length => commentText.Substring(0, length))
            .AddTo(this);

        //特定のキー入力で文字を1文字ずつ出す機能を止める
        m_updateDispose =  this.UpdateAsObservable()
           .FirstOrDefault(_ => Input.GetKeyDown(m_keyCode))
           .Subscribe(_ =>
           {
               m_textDispose.Dispose();
               m_windowText.text = commentText;
           });
    }
}
특정 키를 누르면 모든 문자가 흐르는 문자를 단숨에 뛰어넘어 표시할 수 있다.

Observable.Interval


매개변수에 시간을 지정한 경우 지정된 간격(처리)에 따라 값을 지정할 수 있습니다.
참고로 TimeSpan.FromSeconds C# 기능인 것 같아요.
시간을 지정할 때 자주 사용하는 것 같아요.
[참조 링크]: TimeSpan.자체 보안 방법

Scan


스캔이라는 이름의 작업자는 마지막으로 발표된 값과 현재 발표된 값을 축소할 수 있습니다.
쉽게 말하면 겹쳐진 인상이다.
.Scan((accumulation, newValue) => accumulation + newValue)
accumulation 저축, 누산 등의 뜻이 있어 말의 뜻으로 기억하면 이해하기 쉽다.
누적된 값에 받은 값(newValue)을 더하는 거죠.
[참조 링크]: UniRx 사용

수명 관리


uniRx가 굉장히 편리해요.
사용 시 주의해야 할 점은 흐름의 수명 관리다.
흐름
정보 전달 경로, 구조, 기구
그런 것 같습니다.(일명 Observable)
【인용원】: Observer 모드에서 시작하는 UniRx
이 흐름에서 미션을 끝내는 단계입니다.
나는 너를 도와 구독을 완성해야 한다.
만약 이렇게 하지 않는다면 성능이 떨어질 것이다
더 이상 존재하지 않는 GameObject를 참조하는 동안 오류가 발생했습니다.
[참조 링크]: UniRx 시작 2 - 메시지 유형/흐름 수명

Dispose


언제든지 흐르는 구독을 완성할 수 있습니다.
한 번에 변수를 넣어서 좋아할 때 부르면 되잖아.

AddTo


활용AddTo 방법
이전에 언급한 더 이상 존재하지 않는 GameObject가 미연에 인용되는 것을 방지할 수 있습니다.
매개변수에 제공된 GameObject가 삭제되면 Dispose가 자동으로 호출됩니다.

OnCompleted


만약 이 소식이 발행된다면 구독은 끝날 것 같다.
이번에는 아무 데도 안 썼어요Subscribe.
어쨌든 OnCompleted 지정된 횟수의 정보가 통과될 때 발행
마지막 Subscribe가 온 것 같습니다.
(아닐지도 몰라, 이상한 말로 다시 쓰기)

많은 질문이 흘러요.


이전 흐름이 실행 중이더라도 다음 흐름을 같은 변수에 삽입하면
이전 흐름을 멈추고 다음 흐름을 실행할 수 있습니다!
안돼.따라서 변수에 저장된 것이 있는지 확인하십시오
들어가면 흐름을 멈춘다.
    if (m_textDispose != null)
    {
        m_textDispose.Dispose();
        m_updateDispose.Dispose();
    }
Take하나의 흐름만 생성하고 이전 흐름은 멈추지 않습니다...알겠습니다.

흐름 감시 흐름이 안 좋아요.


강인한 사람이 볼 때 지적을 받았지만, 상당히 엉망진창이었다.
혼자 해도 느껴져요.
· 흐름 처리에 대한 조건 분할
· 중도에서 동태적으로 흐름을 바꾸고 싶은 행위
이런 요구사항을 UniRx를 사용할 때 넣으면
'흐름 B'에서'흐름 A'를 감시하는 그런 상태가 되기 때문에.
흐름은 조건의 지점과 바꾸고 싶은 행위의 수를 증가시킨다.
그래서 이번처럼m_textDispose = Observable.IntervalObservable.Interval부터 임의의 타이밍에 중지
편리한 Rx를 사용했지만 복잡해졌습니다.
초보자가 있는 것 같으니 다음부터는 이것도 조심해야 한다.

참조 링크


UniRx 엔트리 레벨 디렉터리
UniRx 운영자 반전
UniRx의 "Take(1)와 First()의 차이점 풀기"
【Unity】【UniRx】Observable.Doxxx()계 방법의 동작 요약
[Unity] UniRx 시작 링크 세트
유니티에서 산비둘기 같은 게임을 만들어서 튜토리얼 앞으로 나아가자 Part8  

좋은 웹페이지 즐겨찾기