Live 2D 동작에 대한 State Machine Behaviours 제어

13834 단어 Live2DUnity
전에 쓴 Live 2D 동작 제어하기인데 버그가 좀 있어요.

Mecanim의 parameter 값을 변경하는 순간 다음 동작 파일 이름을 얻었습니다. 이전 동작 파일 이름을 얻지 못했습니다.
이 문제는 Unity 5에 추가된 State Machine Behaviours에서 해결했습니다.
State Machine Behaviours는 코드를 통해 Mecanim의 State를 제작하거나 상태 마이그레이션 시간을 자세히 확인할 수 있습니다.

State Machine Behaviours로 제어하려면


이번에도 라이브 2D Unity SDK의 모션 프로젝트를 사용하겠습니다.
(sample\Motion\Assets\Scene\Sample.unity)
1) Live 2D 모델에 Animatior 추가

2) [Assets]-[Create]에서 Animator Controller를 제작하여 첨부

3) Hirarchy가 Live 2DModel을 선택한 상태에서 [Window]-[Animation]을 열고 [Create New Clip]로 2개의 새 Animation을 만듭니다.

하나는 idle.anim, 또 다른 motion1.anim으로 저장합니다.
4) Add Property 버튼을 누르고 Motion File의 + 버튼을 누릅니다.

5) 1:00 키프레임 Delete, 0:00 선택, Inspector의 Motion File 지정


6) 다른 동작도 마찬가지다


7) MakeTransition 연결로 매개변수 만들기

8) Transition의 화살표 선택, Motion=1의 경우 motion1, Motion=0의 경우 idle 선택


9) Animator의 Base Layer의 Inspector를 통해 Add Behaviour 버튼을 눌러 Script 만들기

10) Machine 단계는 다음과 같습니다.
MotionBehaviour.cs
using UnityEngine;
using System.Collections;

public class MotionBehaviour : StateMachineBehaviour {

    public bool changeflg = false;   // モーションチェンジフラグ

    // 次のステートに移り変わる直前に実行される
    public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        changeflg = true;
    }
}
11) 주요 출처도 다음과 같다
SimpleModel.cs
using UnityEngine;
using System;
using System.IO;
using System.Collections;
using live2d;

[ExecuteInEditMode]
public class SimpleModel: MonoBehaviour 
{
    private Live2DModelUnity live2DModel;
    private Live2DMotion motion;
    private MotionQueueManager motionMgr;

    private Matrix4x4 live2DCanvasPos;

    public TextAsset mocFile ;
    public Texture2D[] textureFiles ;
    public TextAsset motionFile;

    private Animator anim;    // Animator
    private MotionBehaviour mtnBehaviour;    // MotionBehaviour

    void Start () 
    {
        Live2D.init();
        // Animatorを取得
        anim = GetComponent<Animator>();
        // State Machine Behavioursを取得
        mtnBehaviour = anim.GetBehaviour<MotionBehaviour>();

        live2DModel = Live2DModelUnity.loadModel(mocFile.bytes);

        for (int i = 0; i < textureFiles.Length; i++)
        {
            live2DModel.setTexture(i, textureFiles[i]);
        }

        float modelWidth = live2DModel.getCanvasWidth();
        live2DCanvasPos = Matrix4x4.Ortho(0, modelWidth, modelWidth, 0, -50.0f, 50.0f);

        motionMgr = new MotionQueueManager();
        motion = Live2DMotion.loadMotion(motionFile.bytes);
    }


    void OnRenderObject()
    {
        if (live2DModel == null) return;
        live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos);

        if ( ! Application.isPlaying)
        {
            live2DModel.update();
            live2DModel.draw();
            return;
        }

        // モーションが終了していたら or フラグが更新されていたら
        if (motionMgr.isFinished() || mtnBehaviour.changeflg == true)
        {
            // モーションのロード
            motion = Live2DMotion.loadMotion(motionFile.bytes);
            // モーションスタート
            motionMgr.startMotion(motion);
            // フラグをOFFにする
            mtnBehaviour.changeflg = false;
        }

        motionMgr.updateParam(live2DModel);

        live2DModel.update();
        live2DModel.draw();
    }
}
12) 이렇게 하면 동작이 순식간에 바뀐다!

참조 페이지


Unity Doctent-State Machine Behaviour는
Unity Document - State Machine Behaviour
Unity5.0의 새 애니메이션 기능
Mecanim을 사용하여 Unity 소스를 구동하여 의문점을 해결해 보십시오.
Unity 5 Mecanim의 State Machine Behaviour와 게임을 합니다.

좋은 웹페이지 즐겨찾기