Live 2D 동작에 대한 State Machine Behaviours 제어
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.csusing 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.csusing 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와 게임을 합니다.
Reference
이 문제에 관하여(Live 2D 동작에 대한 State Machine Behaviours 제어), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/naotaro0123/items/b5f9ee0acb54ad04f51b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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;
}
}
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();
}
}
Reference
이 문제에 관하여(Live 2D 동작에 대한 State Machine Behaviours 제어), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/naotaro0123/items/b5f9ee0acb54ad04f51b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)