/// <summary> /// カメラがシーンにレンダリング後に呼ばれる /// </summary> void OnRenderObject() { if (live2DModel == null) { return; } live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos); // アプリが終了していた場合 if (!Application.isPlaying) { live2DModel.update(); live2DModel.draw(); return; } // 再生中のモーションからモデルパラメータを更新 if (motionManager != null) { motionManager.updateParam(live2DModel); } // ポーズの設定 if (pose != null) { pose.updateParam(live2DModel); } // 物理演算の設定 if (physics != null) { physics.updateParam(live2DModel); } // 頂点の更新 live2DModel.update(); // モデルの描画 live2DModel.draw(); }
void Update() { //if (live2DModel == null) load(); if (live2DModel == null) { return; } live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos); if (!Application.isPlaying) { live2DModel.update(); return; } double timeSec = UtSystem.getUserTimeMSec() / 1000.0; double t = timeSec * 2 * Math.PI; live2DModel.setParamFloat("PARAM_BREATH", (float)(0.5f + 0.5f * Math.Sin(t / 3.0))); // live2DModel.setParamFloat("PARAM_ANGLE_X", PARAM_ANGLE.x); live2DModel.setParamFloat("PARAM_ANGLE_Y", PARAM_ANGLE.y); live2DModel.setParamFloat("PARAM_ANGLE_Z", PARAM_ANGLE.z); live2DModel.setParamFloat("PARAM_EYE_L_OPEN", PARAM_EYE_L_OPEN); live2DModel.setParamFloat("PARAM_EYE_R_OPEN", PARAM_EYE_R_OPEN); live2DModel.setParamFloat("PARAM_EYE_BALL_X", PARAM_EYE_BALL_X); live2DModel.setParamFloat("PARAM_EYE_BALL_Y", PARAM_EYE_BALL_Y); live2DModel.setParamFloat("PARAM_BROW_L_Y", PARAM_BROW_L_Y); live2DModel.setParamFloat("PARAM_BROW_R_Y", PARAM_BROW_R_Y); live2DModel.setParamFloat("PARAM_MOUTH_OPEN_Y", PARAM_MOUTH_OPEN_Y); live2DModel.setParamFloat("PARAM_MOUTH_SIZE", PARAM_MOUTH_SIZE); live2DModel.setParamFloat("PARAM_MOUTH_FORM", 0.0f); // if (physics != null) { physics.updateParam(live2DModel); } if (pose != null) { pose.updateParam(live2DModel); } live2DModel.update(); }
void Update() { if (live2DModel == null && !Load()) { return; } live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos); if (!Application.isPlaying) { live2DModel.update(); return; } if (live2dPose != null) { live2dPose.updateParam(live2DModel); } live2DModel.update(); }
void Awake() { chVoice = GetComponent <AudioSource> (); // myRender = gameObject.GetComponentInChildren<MeshRenderer> (); lipSyncValue = 0f; //초기화 페이즈// Live2D.init(); //json 파일 불러와서 속성 값들 리스트로 뽑아 옴 model = Live2DModelUnity.loadModel(mocData.bytes); //모션 데이터 할당 motionDataManager = GetComponent <MotionDataManager> (); //만약 숨쉬는 모션이 있으면 if (breathMotion != null) { breathMotion_ = Live2DMotion.loadMotion(breathMotion.bytes); } //텍스쳐 세팅 for (int i = 0; i < textureList.Length; i++) { model.setTexture(i, textureList [i]); } // 포즈 파일은 필수적인 것은 아님. if (poseData) { l2dPose = L2DPose.load(poseData.bytes); } if (physicsData) { l2dPhysics = L2DPhysics.load(physicsData.bytes); } //모션을 식별할때 이 스크립트는 string을 사용했지만 enum을 쓰든 뭘 쓰든 모션 식별자로 뭘 써도 무방. //아까 초기화한 모델의 가로 사이즈 받아옴. var width = model.getCanvasWidth(); //캔버스 지정 canvasMatrix = Matrix4x4.Ortho(0.0f, width, width, 0.0f, -50.0f, 50.0f); //모션 매니저들 할당. 사실 얘들은 모션들의 우선순위를 정해주는 등의 역할이 있으나 복잡해서 거의 안쓴다. //주 역활은 자기가 가지고 있는 주모션 하나를 모델 인스턴스에 적용해주는 것. //얘들에게 모션을 주고 여러 설정자들로 모션의 속성들을 설정해줄 수 있다. 그외에 우선순위를 정해주고 등등 기능 있으나 자주 안쓰임. //모션 매니저에 현재 모션을 지정해준다고 모델의 모션이 업데이트되지 않는다. //반드시 L2D매니저.UpdateParam(모델 인스턴스) 를 호출해줘야 모델 인스턴스의 움직임이 갱신됨. l2dMotionManager = new L2DMotionManager(); l2dExpressioNMotionManager = new L2DMotionManager(); //모션 재생 시작 //모델의 모션 업데이트 l2dPose.updateParam(model); transformCache = transform; }