세타 + Oculus에서 슬라이드 쇼 해 보았다. (스테이트 차트편)(코드 첨부)

동작




위와 같은 느낌의 Ricoh Theta로 촬영된 사진을 배경을 설정된 시간마다 전환합니다.
요점은 슬라이드 쇼입니다.
실은 애셋을 사용해 여러가지 이펙트를 만들고 있는 버전도 있습니다만
이번에는 코드도 포함하여 공개하기 위해 삭제했습니다.

샘플 코드
Your own risk.에서 적당히 사용하십시오.
htp // 보라 wl 롯. 네 t/u p/dl28986
소개 무비(니코니코 동영상)
h tp // w w. 니코 ゔ에서. jp/watch/sm22430710

스테이트 차트





구현적으로는 스테이트 차트를 중심으로 움직이고 있습니다.
그래서 이번 기사에서는 스테이트 차트의 디자인과 그것을 코드에 떨어뜨리기 위한
가류의 방법을 소개하고 싶습니다.

"P_SYOMEN_IN~P_SYOMEN_OUT"까지가 재생 전 조정용 상태가 됩니다.



1, P_SYOMEN_IN

페이드 인합니다.

2, P_SYOMEN

"정면"이라고 쓰여진 문자가 정면에 나옵니다.
조이스틱 버튼을 눌러 전면 위치를 재설정합니다.
조이스틱 버튼으로 재생이 시작(화살표 방향으로 전환)됩니다.

3, P_SYOMEN_OUT

페이드 아웃합니다.

"P_FADE_IN~P_FADE_OUT"까지 재생 중 상태가 됩니다.



4, P_FADE_IN

m_EnterPls를 보고 현재 이미지를 셰이더로 설정합니다.
페이드 인합니다.

5, P_PLAY

지정된 시간 분 이미지를 표시합니다.
중간에 버튼 입력이 있으면 강제 종료로 P_END_FADE_OUT으로 전환합니다.

6, P_FADE_OUT

페이드 아웃합니다.
다음 이미지로 진행하여 P_FADE_IN으로 전환합니다.

종료시의 처리



7, P_END_FADE_OUT

페이드 아웃합니다.
타이머에 의한 종료 후는 P_SYOMEN_IN으로 천이합니다.

구현



덧붙여서, 치타마에서는 Gof의 State 패턴이라고 하는 것이 유행하고 있는 것 같습니다만 나는 가류로 만들고 있습니다.
그 방법이라면 가득 클래스 만들지 않으면 안되기 때문에 수고가 걸립니다.
그래서 내 경우에는 하나의 함수에 하나의 상태를 할당합니다.
아래의 코드는 번잡한 부분을 생략한 골조만의 코드가 됩니다.

스테이트 차트

public class state : MonoBehaviour {

    //各ステートをenumで定義
    public enum STATE
    {
        P_BLANK,
        P_SYOMEN_IN,
        P_SYOMEN,
        P_SYOMEN_OUT,

        P_FADE_IN,
        P_PLAY,
        P_FADE_OUT,
        P_END_FADE_OUT
    }

    bool m_EnterPls;//状態遷移時の一回目の時だけtrueになります。
    public STATE m_State = STATE.P_SYOMEN_IN;//現在の状態を保持します。
    STATE m_StateOld = STATE.P_BLANK;//一個前に実行した状態を保持します。

    //ステートチャートの実装
    void StateChart()
    {
        //ステート変更後、enterを作りやすいために書いておきます。
        if (m_State != m_StateOld)
        {
            m_StateOld = m_State;
            m_EnterPls = true;
        }
        else
        {
            m_EnterPls = false;
        }

        //各ステート毎の関数へ割り振り
        switch (m_State )
        {
            case (STATE.P_SYOMEN_IN ):
                SSyomenIn();
                break;

            case (STATE.P_SYOMEN):
                SSsyomenPlay();
                break;

            case (STATE.P_SYOMEN_OUT):
                SSyomenOut();
                break;

            case (STATE.P_FADE_IN ):
                SFadeIn();
                break;

            case (STATE.P_PLAY ):
                SPlay();
                break;

            case (STATE.P_FADE_OUT ):
                SFadeOut();
                break;

            case (STATE.P_END_FADE_OUT):
                SEndFadeOut();
                break;
        }
    }

    //各種ステートの処理
    void SSyomenIn(){ }
    void SSsyomenPlay() { }
    void SSyomenOut(){ }
    void SFadeIn() { }
    void SPlay() { }
    void SFadeOut(){ }
    void SEndFadeOut() { }
}


포인트



상태 차트에서 중요한 기능은 몇 가지 있습니다.
1, 상태(스테이트)를 유지하고 그것을 천이시키는 것
2, 상태를 천이시켰을 때에 함수를 실행시킨다.
3, 상태가 가질 수 있는 하기 3점의 함수를 실행한다.
・Enter(상태에 들어갔을 때)
・Do(상태에 들어가 있는 동안 계속)
・Exit(상태를 나올 때)
이것들을 모두 실현 가능한 것이 요구됩니다.
위의 코드에서는 모두 실현 가능하게 되어 있습니다.

1, 상태(스테이트)를 유지하고 그것을 천이시키는 것



상태의 유지, 천이에 대해서는 「m_State」로 모두 실시하고 있습니다.
「m_State」에 수치를 대입하는 것으로 천이를 실시합니다.

2, 상태를 천이시켰을 때에 함수를 실행시킨다.



천이시킬 때의 처리는 정직한 곳 제대로 완비되어 있지 않습니다.
대용의 수단으로서 「m_State」에 수치를 대입하는 타이밍에서 동시에 처리를 실행합니다.
아래의 예에서는 천이하는 뒤에 수치에 0.0f를 대입하고 있습니다.


        if (m_SyomenTime > 1.0f)
        {
            m_State = STATE.P_SYOMEN;
            fadeAspect = 0.0f;
        }


3, 상태가 가질 수 있는 하기 3점의 함수를 실행한다.



단위 상태 구현을 보고 어떻게 구현하는지 확인합니다.
아래의 3개를 어떻게 실장되고 있는지 코멘트를 넣었습니다.
・Enter(상태에 들어갔을 때)
・Do(상태에 들어가 있는 동안 계속)
・Exit(상태를 나올 때)


    //各種ステートの処理
    void SSyomenIn()
    {
        //Enter(状態に入った時)
        if (m_EnterPls)
        {
            m_PictNowNum = 0;
            m_PictRend.material.SetTexture("_MainTex", m_ShomenTexture);
            m_PictSphere.transform.rotation = Quaternion.identity ;
            m_PictSphere.transform.localScale = new Vector3(50.0f,50.0f,50.0f);

            m_EffectManager.SetEffect( -1 );
            m_SyomenObj.SetActive(true);
            m_SyomenTime = 0.0f;

        }

        //Do(状態に入っている最中ずっと)
        m_SyomenTime += Time.deltaTime;


        float fadeAspect;
        if (m_SyomenTime > 1.0f)
        {
            //Exit(状態を出る時)
            m_State = STATE.P_SYOMEN;
            fadeAspect = 0.0f;
        }
        else
        {
            //Do(状態に入っている最中ずっと)
            fadeAspect = 1.0f - (m_SyomenTime / 1.0f);
        }
        //Do(状態に入っている最中ずっと)
        m_BlackRend.materials[0].SetColor("_TintColor", new Color(0.5f, 0.5f, 0.5f, fadeAspect * 0.5f));
    }

끝에



이상으로 스테이트 차트의 조금 바뀐 구현 방법의 설명은 끝이 됩니다.
실제의 사용 방법은 샘플 코드를 확인해 본다 or 자신도 시험해 보세요.

사진에 대해서는 @Tomohang 씨 촬영이 됩니다.
음악에 대해서는 우에 씨보다 빌리고 있습니다.

좋은 웹페이지 즐겨찾기