/// <summary> /// ストリームからモーションを生成する /// </summary> /// <param name="stream">ストリーム</param> /// <param name="setting_motion_item">CubismModelSettingJsonのこのモーションの設定</param> /// <param name="id_manager">IDマネージャー</param> public CubismMotion(Stream stream, CubismModelSettingJson.FileReferencesItem.MotionItem setting_motion_item, CubismModel model) { // モーションデータを読み込む var json = CubismMotionJson.Create(stream); Duration = json.Meta.Duration; CanLoop = json.Meta.Loop; // 標準のフェード時間を取得する。 // モデルのjsonファイルで指定されている値を優先的に適用するが、 // 無かったらモーションのjsonファイルの値を使う。 GlobalFadeInSeconds = (setting_motion_item != null) ? setting_motion_item.FadeInTime : 0.0; GlobalFadeInSeconds = !double.IsNaN(GlobalFadeInSeconds) ? GlobalFadeInSeconds : json.Meta.FadeInTime; GlobalFadeInSeconds = !double.IsNaN(GlobalFadeInSeconds) ? GlobalFadeInSeconds : 0.0; GlobalFadeOutSeconds = (setting_motion_item != null) ? setting_motion_item.FadeOutTime : 0.0; GlobalFadeOutSeconds = !double.IsNaN(GlobalFadeOutSeconds) ? GlobalFadeOutSeconds : json.Meta.FadeOutTime; GlobalFadeOutSeconds = !double.IsNaN(GlobalFadeOutSeconds) ? GlobalFadeOutSeconds : 0.0; // モーションカーブを内部形式に変換する var curve_list = new List <CubismMotionCurve>(); foreach (var item in json.Curves) { var curve = ParseCurve(item, model); if (curve == null) { continue; } if (curve.Target == CubismMotionCurve.TargetType.Model) { // ターゲットがモデルのとき、エフェクトIDが対象となる // これらはパラメータや不透明度を対象としたカーブより先に処理しなければいけないため別に管理する EffectCurves[curve.Effect] = curve; } else { curve_list.Add(curve); } } Curves = curve_list.ToArray(); // ユーザーデータを読み込む if ((json.UserData != null) && (json.Meta.UserDataCount == json.UserData.Length)) { int userdata_count = json.Meta.UserDataCount; Events = new CubismMotionEvent[userdata_count]; for (int index = 0; index < userdata_count; index++) { var userdata = new CubismMotionEvent(); userdata.FireTime = json.UserData[index].Time; userdata.Value = json.UserData[index].Value; Events[index] = userdata; } } else { Events = new CubismMotionEvent[0]; } }
/// <summary> /// ストリームから'.motion3.json'形式のモーションを読み込む。 /// </summary> /// <param name="stream">ストリーム</param> /// <param name="motion_item">モデル設定ファイル中の設定値</param> /// <returns>モーション</returns> internal CubismMotion LoadMotion(Stream stream, CubismModelSettingJson.FileReferencesItem.MotionItem motion_item) { // モーションを作成する var motion = new CubismMotion(stream, motion_item, Model); // パラメータグループをエフェクトに適用する foreach (var parameter_group in ParameterGroups) { var effect_id = motion.GetEffect(parameter_group.Key); if (effect_id != null) { motion.SetEffectParameters(effect_id, parameter_group.Value); } } return(motion); }