diff --git a/Assets/Plugins/I18N.CJK.dll b/Assets/Plugins/I18N.CJK.dll new file mode 100644 index 0000000..f3741af Binary files /dev/null and b/Assets/Plugins/I18N.CJK.dll differ diff --git a/Assets/Plugins/I18N.CJK.dll.meta b/Assets/Plugins/I18N.CJK.dll.meta new file mode 100644 index 0000000..79b7b1d --- /dev/null +++ b/Assets/Plugins/I18N.CJK.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 668efe4a54d94f244a2f44a5a3947550 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/I18N.dll b/Assets/Plugins/I18N.dll new file mode 100644 index 0000000..1f713ff Binary files /dev/null and b/Assets/Plugins/I18N.dll differ diff --git a/Assets/Plugins/I18N.dll.meta b/Assets/Plugins/I18N.dll.meta new file mode 100644 index 0000000..ffa024b --- /dev/null +++ b/Assets/Plugins/I18N.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 0738b70a6f9235d4fa3ee1907af514cc +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/VMDRecorder/UnityCameraVMDRecorder.cs b/Assets/Scripts/VMDRecorder/UnityCameraVMDRecorder.cs index acd5e44..36e1968 100644 --- a/Assets/Scripts/VMDRecorder/UnityCameraVMDRecorder.cs +++ b/Assets/Scripts/VMDRecorder/UnityCameraVMDRecorder.cs @@ -1,8 +1,6 @@ using System; -using System.Collections; using System.Collections.Generic; using System.IO; -using System.Threading.Tasks; using UnityEngine; public class UnityCameraVMDRecorder : MonoBehaviour @@ -167,7 +165,7 @@ public class UnityCameraVMDRecorder : MonoBehaviour /// 呼び出す際は先にStopRecordingを呼び出すこと /// /// 保存先の絶対ファイルパス - public async void SaveVMD() + public void SaveVMD() { string fileName = Application.dataPath + "/../VMDRecords/" + string.Format("Camera_{0}.vmd", DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss")); if (IsRecording) @@ -184,104 +182,103 @@ public class UnityCameraVMDRecorder : MonoBehaviour bool isOrthographic = targetCamera.orthographic; Debug.Log(targetCameraTransform.name + "VMDファイル作成開始"); - await Task.Run(() => + + //ファイルの書き込み + using (FileStream fileStream = new FileStream(fileName, FileMode.Create)) + using (BinaryWriter binaryWriter = new BinaryWriter(fileStream)) { - //ファイルの書き込み - using (FileStream fileStream = new FileStream(fileName, FileMode.Create)) - using (BinaryWriter binaryWriter = new BinaryWriter(fileStream)) + try { - try + const string ShiftJIS = "shift_jis"; + const int intByteLength = 4; + + //ファイルタイプの書き込み + const int fileTypeLength = 30; + const string RightFileType = "Vocaloid Motion Data 0002"; + byte[] fileTypeBytes = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes(RightFileType); + binaryWriter.Write(fileTypeBytes, 0, fileTypeBytes.Length); + binaryWriter.Write(new byte[fileTypeLength - fileTypeBytes.Length], 0, fileTypeLength - fileTypeBytes.Length); + + //モーション名の書き込み、Shift_JISで保存 + const int motionNameLength = 20; + byte[] motionNameBytes = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes(modelName); + binaryWriter.Write(motionNameBytes, 0, Mathf.Min(motionNameBytes.Length, 20)); + if (motionNameLength - motionNameBytes.Length > 0) { - const string ShiftJIS = "shift_jis"; - const int intByteLength = 4; - - //ファイルタイプの書き込み - const int fileTypeLength = 30; - const string RightFileType = "Vocaloid Motion Data 0002"; - byte[] fileTypeBytes = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes(RightFileType); - binaryWriter.Write(fileTypeBytes, 0, fileTypeBytes.Length); - binaryWriter.Write(new byte[fileTypeLength - fileTypeBytes.Length], 0, fileTypeLength - fileTypeBytes.Length); - - //モーション名の書き込み、Shift_JISで保存 - const int motionNameLength = 20; - byte[] motionNameBytes = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes(modelName); - binaryWriter.Write(motionNameBytes, 0, Mathf.Min(motionNameBytes.Length, 20)); - if (motionNameLength - motionNameBytes.Length > 0) - { - binaryWriter.Write(new byte[motionNameLength - motionNameBytes.Length], 0, motionNameLength - motionNameBytes.Length); - } - - //全ボーンフレーム数の書き込み - byte[] allKeyFrameNumberByte = BitConverter.GetBytes(0); - binaryWriter.Write(allKeyFrameNumberByte, 0, intByteLength); - - //全モーフフレーム数の書き込み - byte[] faceFrameCount = BitConverter.GetBytes(0); - binaryWriter.Write(faceFrameCount, 0, intByteLength); - - //カメラの書き込み - byte[] cameraFrameCount = BitConverter.GetBytes((uint)(frameNumberSaved / KeyReductionLevel)); - binaryWriter.Write(cameraFrameCount, 0, intByteLength); - for (int i = 0; i < frameNumberSaved; i++) - { - if ((i % KeyReductionLevel) != 0) { continue; } - - byte[] frameNumberByte = BitConverter.GetBytes((ulong)i); - binaryWriter.Write(frameNumberByte, 0, intByteLength); - - byte[] cameraDistanceByte = BitConverter.GetBytes(0); - binaryWriter.Write(cameraDistanceByte, 0, intByteLength); - - Vector3 position = positionsSaved[i] * WorldScaleFix; - byte[] positionX = BitConverter.GetBytes(position.x); - binaryWriter.Write(positionX, 0, intByteLength); - byte[] positionY = BitConverter.GetBytes(position.y); - binaryWriter.Write(positionY, 0, intByteLength); - byte[] positionZ = BitConverter.GetBytes(position.z); - binaryWriter.Write(positionZ, 0, intByteLength); - - Vector3 rotation = rotationsSaved[i] * Mathf.Deg2Rad; - byte[] rotationX = BitConverter.GetBytes(rotation.x); - binaryWriter.Write(rotationX, 0, intByteLength); - byte[] rotationY = BitConverter.GetBytes(rotation.y); - binaryWriter.Write(rotationY, 0, intByteLength); - byte[] rotationZ = BitConverter.GetBytes(rotation.z); - binaryWriter.Write(rotationZ, 0, intByteLength); - - byte[] interpolateBytes = new byte[24]; - binaryWriter.Write(interpolateBytes, 0, 24); - - byte[] viewAngleByte = BitConverter.GetBytes((ulong)fieldOfView); - binaryWriter.Write(viewAngleByte, 0, intByteLength); - - byte perspectiveByte = Convert.ToByte(isOrthographic); - byte[] perspectiveBytes = new byte[] { perspectiveByte }; - binaryWriter.Write(new byte[] { perspectiveByte }, 0, perspectiveBytes.Length); - } - - //照明の書き込み - byte[] lightFrameCount = BitConverter.GetBytes(0); - binaryWriter.Write(lightFrameCount, 0, intByteLength); - - //セルフシャドウの書き込み - byte[] selfShadowCount = BitConverter.GetBytes(0); - binaryWriter.Write(selfShadowCount, 0, intByteLength); - - //IKの書き込み - byte[] ikCount = BitConverter.GetBytes(0); - binaryWriter.Write(ikCount, 0, intByteLength); + binaryWriter.Write(new byte[motionNameLength - motionNameBytes.Length], 0, motionNameLength - motionNameBytes.Length); } - catch (Exception ex) + + //全ボーンフレーム数の書き込み + byte[] allKeyFrameNumberByte = BitConverter.GetBytes(0); + binaryWriter.Write(allKeyFrameNumberByte, 0, intByteLength); + + //全モーフフレーム数の書き込み + byte[] faceFrameCount = BitConverter.GetBytes(0); + binaryWriter.Write(faceFrameCount, 0, intByteLength); + + //カメラの書き込み + byte[] cameraFrameCount = BitConverter.GetBytes((uint)(frameNumberSaved / KeyReductionLevel)); + binaryWriter.Write(cameraFrameCount, 0, intByteLength); + for (int i = 0; i < frameNumberSaved; i++) { - Debug.Log("VMD書き込みエラー" + ex.Message); - } - finally - { - binaryWriter.Close(); + if ((i % KeyReductionLevel) != 0) { continue; } + + byte[] frameNumberByte = BitConverter.GetBytes((ulong)i); + binaryWriter.Write(frameNumberByte, 0, intByteLength); + + byte[] cameraDistanceByte = BitConverter.GetBytes(0); + binaryWriter.Write(cameraDistanceByte, 0, intByteLength); + + Vector3 position = positionsSaved[i] * WorldScaleFix; + byte[] positionX = BitConverter.GetBytes(position.x); + binaryWriter.Write(positionX, 0, intByteLength); + byte[] positionY = BitConverter.GetBytes(position.y); + binaryWriter.Write(positionY, 0, intByteLength); + byte[] positionZ = BitConverter.GetBytes(position.z); + binaryWriter.Write(positionZ, 0, intByteLength); + + Vector3 rotation = rotationsSaved[i] * Mathf.Deg2Rad; + byte[] rotationX = BitConverter.GetBytes(rotation.x); + binaryWriter.Write(rotationX, 0, intByteLength); + byte[] rotationY = BitConverter.GetBytes(rotation.y); + binaryWriter.Write(rotationY, 0, intByteLength); + byte[] rotationZ = BitConverter.GetBytes(rotation.z); + binaryWriter.Write(rotationZ, 0, intByteLength); + + byte[] interpolateBytes = new byte[24]; + binaryWriter.Write(interpolateBytes, 0, 24); + + byte[] viewAngleByte = BitConverter.GetBytes((ulong)fieldOfView); + binaryWriter.Write(viewAngleByte, 0, intByteLength); + + byte perspectiveByte = Convert.ToByte(isOrthographic); + byte[] perspectiveBytes = new byte[] { perspectiveByte }; + binaryWriter.Write(new byte[] { perspectiveByte }, 0, perspectiveBytes.Length); } + + //照明の書き込み + byte[] lightFrameCount = BitConverter.GetBytes(0); + binaryWriter.Write(lightFrameCount, 0, intByteLength); + + //セルフシャドウの書き込み + byte[] selfShadowCount = BitConverter.GetBytes(0); + binaryWriter.Write(selfShadowCount, 0, intByteLength); + + //IKの書き込み + byte[] ikCount = BitConverter.GetBytes(0); + binaryWriter.Write(ikCount, 0, intByteLength); } - }); + catch (Exception ex) + { + Debug.Log("VMD書き込みエラー" + ex.Message); + } + finally + { + binaryWriter.Close(); + } + } Debug.Log(targetCameraTransform.name + "VMDファイル作成終了"); + Destroy(this); } /// diff --git a/Assets/Scripts/VMDRecorder/UnityHumanoidVMDRecorder.cs b/Assets/Scripts/VMDRecorder/UnityHumanoidVMDRecorder.cs index 63b8428..5e20f48 100644 --- a/Assets/Scripts/VMDRecorder/UnityHumanoidVMDRecorder.cs +++ b/Assets/Scripts/VMDRecorder/UnityHumanoidVMDRecorder.cs @@ -1,10 +1,8 @@ -using System.Collections; -using System.Collections.Generic; +using System.Collections.Generic; using UnityEngine; using System.IO; using System; using System.Linq; -using System.Threading.Tasks; using Gallop; //初期ポーズ(T,Aポーズ)の時点でアタッチ、有効化されている必要がある @@ -169,7 +167,7 @@ public class UnityHumanoidVMDRecorder : MonoBehaviour animator.Play(state.shortNameHash, 0, state.normalizedTime); } - + private void FixedUpdate() { @@ -197,7 +195,7 @@ public class UnityHumanoidVMDRecorder : MonoBehaviour Vector3 targetVector = Vector3.zero; if (UseCenterAsParentOfAll) { - if ((!UseAbsoluteCoordinateSystem && transform.parent != null) && IgnoreInitialPosition ) + if ((!UseAbsoluteCoordinateSystem && transform.parent != null) && IgnoreInitialPosition) { targetVector = Quaternion.Inverse(transform.parent.rotation) @@ -365,7 +363,7 @@ public class UnityHumanoidVMDRecorder : MonoBehaviour /// /// VMDファイルに記載される専用モデル名 /// 保存先の絶対ファイルパス - public async void SaveVMD(string modelName, string filePath) + public void SaveVMD(string modelName, string filePath) { if (IsRecording) { @@ -376,195 +374,191 @@ public class UnityHumanoidVMDRecorder : MonoBehaviour if (KeyReductionLevel <= 0) { KeyReductionLevel = 1; } Debug.Log(transform.name + "VMDファイル作成開始"); - await Task.Run(() => + //ファイルの書き込み + using (FileStream fileStream = new FileStream(filePath, FileMode.Create)) + using (BinaryWriter binaryWriter = new BinaryWriter(fileStream)) { - //ファイルの書き込み - using (FileStream fileStream = new FileStream(filePath, FileMode.Create)) - using (BinaryWriter binaryWriter = new BinaryWriter(fileStream)) + try { - try + const string ShiftJIS = "shift_jis"; + const int intByteLength = 4; + + //ファイルタイプの書き込み + const int fileTypeLength = 30; + const string RightFileType = "Vocaloid Motion Data 0002"; + byte[] fileTypeBytes = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes(RightFileType); + binaryWriter.Write(fileTypeBytes, 0, fileTypeBytes.Length); + binaryWriter.Write(new byte[fileTypeLength - fileTypeBytes.Length], 0, fileTypeLength - fileTypeBytes.Length); + + //モデル名の書き込み、Shift_JISで保存 + const int modelNameLength = 20; + byte[] modelNameBytes = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes(modelName); + //モデル名が長すぎたとき + modelNameBytes = modelNameBytes.Take(Mathf.Min(modelNameLength, modelNameBytes.Length)).ToArray(); + binaryWriter.Write(modelNameBytes, 0, modelNameBytes.Length); + binaryWriter.Write(new byte[modelNameLength - modelNameBytes.Length], 0, modelNameLength - modelNameBytes.Length); + + //全ボーンフレーム数の書き込み + void LoopWithBoneCondition(Action action) { - const string ShiftJIS = "shift_jis"; - const int intByteLength = 4; - - //ファイルタイプの書き込み - const int fileTypeLength = 30; - const string RightFileType = "Vocaloid Motion Data 0002"; - byte[] fileTypeBytes = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes(RightFileType); - binaryWriter.Write(fileTypeBytes, 0, fileTypeBytes.Length); - binaryWriter.Write(new byte[fileTypeLength - fileTypeBytes.Length], 0, fileTypeLength - fileTypeBytes.Length); - - //モデル名の書き込み、Shift_JISで保存 - const int modelNameLength = 20; - byte[] modelNameBytes = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes(modelName); - //モデル名が長すぎたとき - modelNameBytes = modelNameBytes.Take(Mathf.Min(modelNameLength, modelNameBytes.Length)).ToArray(); - binaryWriter.Write(modelNameBytes, 0, modelNameBytes.Length); - binaryWriter.Write(new byte[modelNameLength - modelNameBytes.Length], 0, modelNameLength - modelNameBytes.Length); - - //全ボーンフレーム数の書き込み - void LoopWithBoneCondition(Action action) + for (int i = 0; i < frameNumberSaved; i++) { - for (int i = 0; i < frameNumberSaved; i++) + if ((i % KeyReductionLevel) != 0) { continue; } + + foreach (BoneNames boneName in Enum.GetValues(typeof(BoneNames))) { - if ((i % KeyReductionLevel) != 0) { continue; } + if (!BoneDictionary.Keys.Contains(boneName)) { continue; } + if (BoneDictionary[boneName] == null) { continue; } + if (!UseParentOfAll && boneName == BoneNames.全ての親) { continue; } - foreach (BoneNames boneName in Enum.GetValues(typeof(BoneNames))) - { - if (!BoneDictionary.Keys.Contains(boneName)) { continue; } - if (BoneDictionary[boneName] == null) { continue; } - if (!UseParentOfAll && boneName == BoneNames.全ての親) { continue; } - - action(boneName, i); - } + action(boneName, i); } } - uint allKeyFrameNumber = 0; - LoopWithBoneCondition((a, b) => { allKeyFrameNumber++; }); - byte[] allKeyFrameNumberByte = BitConverter.GetBytes(allKeyFrameNumber); - binaryWriter.Write(allKeyFrameNumberByte, 0, intByteLength); + } + uint allKeyFrameNumber = 0; + LoopWithBoneCondition((a, b) => { allKeyFrameNumber++; }); + byte[] allKeyFrameNumberByte = BitConverter.GetBytes(allKeyFrameNumber); + binaryWriter.Write(allKeyFrameNumberByte, 0, intByteLength); - //人ボーンの書き込み - LoopWithBoneCondition((boneName, i) => + //人ボーンの書き込み + LoopWithBoneCondition((boneName, i) => + { + const int boneNameLength = 15; + string boneNameString = boneName.ToString(); + if (boneName == BoneNames.全ての親 && UseCenterAsParentOfAll) { - const int boneNameLength = 15; - string boneNameString = boneName.ToString(); - if (boneName == BoneNames.全ての親 && UseCenterAsParentOfAll) - { - boneNameString = CenterNameString; - } - if (boneName == BoneNames.センター && UseCenterAsParentOfAll) - { - boneNameString = GrooveNameString; - } - - byte[] boneNameBytes = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes(boneNameString); - binaryWriter.Write(boneNameBytes, 0, boneNameBytes.Length); - binaryWriter.Write(new byte[boneNameLength - boneNameBytes.Length], 0, boneNameLength - boneNameBytes.Length); - - byte[] frameNumberByte = BitConverter.GetBytes((ulong)i); - binaryWriter.Write(frameNumberByte, 0, intByteLength); - - Vector3 position = positionDictionarySaved[boneName][i]; - byte[] positionX = BitConverter.GetBytes(position.x); - binaryWriter.Write(positionX, 0, intByteLength); - byte[] positionY = BitConverter.GetBytes(position.y); - binaryWriter.Write(positionY, 0, intByteLength); - byte[] positionZ = BitConverter.GetBytes(position.z); - binaryWriter.Write(positionZ, 0, intByteLength); - Quaternion rotation = rotationDictionarySaved[boneName][i]; - byte[] rotationX = BitConverter.GetBytes(rotation.x); - binaryWriter.Write(rotationX, 0, intByteLength); - byte[] rotationY = BitConverter.GetBytes(rotation.y); - binaryWriter.Write(rotationY, 0, intByteLength); - byte[] rotationZ = BitConverter.GetBytes(rotation.z); - binaryWriter.Write(rotationZ, 0, intByteLength); - byte[] rotationW = BitConverter.GetBytes(rotation.w); - binaryWriter.Write(rotationW, 0, intByteLength); - - byte[] interpolateBytes = new byte[64]; - binaryWriter.Write(interpolateBytes, 0, 64); - }); - - //全モーフフレーム数の書き込み - morphRecorderSaved.DisableIntron(); - if (TrimMorphNumber) { morphRecorderSaved.TrimMorphNumber(); } - void LoopWithMorphCondition(Action action) + boneNameString = CenterNameString; + } + if (boneName == BoneNames.センター && UseCenterAsParentOfAll) { - for (int i = 0; i < frameNumberSaved; i++) - { - foreach (string morphName in morphRecorderSaved.MorphDrivers.Keys) - { - if (morphRecorderSaved.MorphDrivers[morphName].ValueList.Count == 0) { continue; } - if (i > morphRecorderSaved.MorphDrivers[morphName].ValueList.Count) { continue; } - //変化のない部分は省く - if (!morphRecorderSaved.MorphDrivers[morphName].ValueList[i].enabled) { continue; } - const int boneNameLength = 15; - string morphNameString = morphName.ToString(); - byte[] morphNameBytes = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes(morphNameString); - //名前が長過ぎた場合書き込まない - if (boneNameLength - morphNameBytes.Length < 0) { continue; } + boneNameString = GrooveNameString; + } - action(morphName, i); - } + byte[] boneNameBytes = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes(boneNameString); + binaryWriter.Write(boneNameBytes, 0, boneNameBytes.Length); + binaryWriter.Write(new byte[boneNameLength - boneNameBytes.Length], 0, boneNameLength - boneNameBytes.Length); + + byte[] frameNumberByte = BitConverter.GetBytes((ulong)i); + binaryWriter.Write(frameNumberByte, 0, intByteLength); + + Vector3 position = positionDictionarySaved[boneName][i]; + byte[] positionX = BitConverter.GetBytes(position.x); + binaryWriter.Write(positionX, 0, intByteLength); + byte[] positionY = BitConverter.GetBytes(position.y); + binaryWriter.Write(positionY, 0, intByteLength); + byte[] positionZ = BitConverter.GetBytes(position.z); + binaryWriter.Write(positionZ, 0, intByteLength); + Quaternion rotation = rotationDictionarySaved[boneName][i]; + byte[] rotationX = BitConverter.GetBytes(rotation.x); + binaryWriter.Write(rotationX, 0, intByteLength); + byte[] rotationY = BitConverter.GetBytes(rotation.y); + binaryWriter.Write(rotationY, 0, intByteLength); + byte[] rotationZ = BitConverter.GetBytes(rotation.z); + binaryWriter.Write(rotationZ, 0, intByteLength); + byte[] rotationW = BitConverter.GetBytes(rotation.w); + binaryWriter.Write(rotationW, 0, intByteLength); + + byte[] interpolateBytes = new byte[64]; + binaryWriter.Write(interpolateBytes, 0, 64); + }); + + //全モーフフレーム数の書き込み + morphRecorderSaved.DisableIntron(); + if (TrimMorphNumber) { morphRecorderSaved.TrimMorphNumber(); } + void LoopWithMorphCondition(Action action) + { + for (int i = 0; i < frameNumberSaved; i++) + { + foreach (string morphName in morphRecorderSaved.MorphDrivers.Keys) + { + if (morphRecorderSaved.MorphDrivers[morphName].ValueList.Count == 0) { continue; } + if (i > morphRecorderSaved.MorphDrivers[morphName].ValueList.Count) { continue; } + //変化のない部分は省く + if (!morphRecorderSaved.MorphDrivers[morphName].ValueList[i].enabled) { continue; } + const int boneNameLength = 15; + string morphNameString = morphName.ToString(); + byte[] morphNameBytes = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes(morphNameString); + //名前が長過ぎた場合書き込まない + if (boneNameLength - morphNameBytes.Length < 0) { continue; } + + action(morphName, i); } } - uint allMorphNumber = 0; - LoopWithMorphCondition((a, b) => { allMorphNumber++; }); - byte[] faceFrameCount = BitConverter.GetBytes(allMorphNumber); - binaryWriter.Write(faceFrameCount, 0, intByteLength); - - //モーフの書き込み - LoopWithMorphCondition((morphName, i) => - { - const int boneNameLength = 15; - string morphNameString = morphName.ToString(); - byte[] morphNameBytes = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes(morphNameString); - - binaryWriter.Write(morphNameBytes, 0, morphNameBytes.Length); - binaryWriter.Write(new byte[boneNameLength - morphNameBytes.Length], 0, boneNameLength - morphNameBytes.Length); - - byte[] frameNumberByte = BitConverter.GetBytes((ulong)i); - binaryWriter.Write(frameNumberByte, 0, intByteLength); - - byte[] valueByte = BitConverter.GetBytes(morphRecorderSaved.MorphDrivers[morphName].ValueList[i].value); - binaryWriter.Write(valueByte, 0, intByteLength); - }); - - //カメラの書き込み - byte[] cameraFrameCount = BitConverter.GetBytes(0); - binaryWriter.Write(cameraFrameCount, 0, intByteLength); - - //照明の書き込み - byte[] lightFrameCount = BitConverter.GetBytes(0); - binaryWriter.Write(lightFrameCount, 0, intByteLength); - - //セルフシャドウの書き込み - byte[] selfShadowCount = BitConverter.GetBytes(0); - binaryWriter.Write(selfShadowCount, 0, intByteLength); - - //IKの書き込み - //0フレームにキーフレーム一つだけ置く - byte[] ikCount = BitConverter.GetBytes(1); - byte[] ikFrameNumber = BitConverter.GetBytes(0); - byte modelDisplay = Convert.ToByte(1); - //右足IKと左足IKと右足つま先IKと左足つま先IKの4つ - byte[] ikNumber = BitConverter.GetBytes(4); - const int IKNameLength = 20; - byte[] leftIKName = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes("左足IK"); - byte[] rightIKName = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes("右足IK"); - byte[] leftToeIKName = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes("左つま先IK"); - byte[] rightToeIKName = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes("右つま先IK"); - byte ikOn = Convert.ToByte(1); - byte ikOff = Convert.ToByte(0); - binaryWriter.Write(ikCount, 0, intByteLength); - binaryWriter.Write(ikFrameNumber, 0, intByteLength); - binaryWriter.Write(modelDisplay); - binaryWriter.Write(ikNumber, 0, intByteLength); - binaryWriter.Write(leftIKName, 0, leftIKName.Length); - binaryWriter.Write(new byte[IKNameLength - leftIKName.Length], 0, IKNameLength - leftIKName.Length); - binaryWriter.Write(ikOff); - binaryWriter.Write(leftToeIKName, 0, leftToeIKName.Length); - binaryWriter.Write(new byte[IKNameLength - leftToeIKName.Length], 0, IKNameLength - leftToeIKName.Length); - binaryWriter.Write(ikOff); - binaryWriter.Write(rightIKName, 0, rightIKName.Length); - binaryWriter.Write(new byte[IKNameLength - rightIKName.Length], 0, IKNameLength - rightIKName.Length); - binaryWriter.Write(ikOff); - binaryWriter.Write(rightToeIKName, 0, rightToeIKName.Length); - binaryWriter.Write(new byte[IKNameLength - rightToeIKName.Length], 0, IKNameLength - rightToeIKName.Length); - binaryWriter.Write(ikOff); } - catch (Exception ex) + uint allMorphNumber = 0; + LoopWithMorphCondition((a, b) => { allMorphNumber++; }); + byte[] faceFrameCount = BitConverter.GetBytes(allMorphNumber); + binaryWriter.Write(faceFrameCount, 0, intByteLength); + + //モーフの書き込み + LoopWithMorphCondition((morphName, i) => { - Debug.Log("VMD書き込みエラー" + ex.Message); - } - finally - { - binaryWriter.Close(); - } + const int boneNameLength = 15; + string morphNameString = morphName.ToString(); + byte[] morphNameBytes = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes(morphNameString); + + binaryWriter.Write(morphNameBytes, 0, morphNameBytes.Length); + binaryWriter.Write(new byte[boneNameLength - morphNameBytes.Length], 0, boneNameLength - morphNameBytes.Length); + + byte[] frameNumberByte = BitConverter.GetBytes((ulong)i); + binaryWriter.Write(frameNumberByte, 0, intByteLength); + + byte[] valueByte = BitConverter.GetBytes(morphRecorderSaved.MorphDrivers[morphName].ValueList[i].value); + binaryWriter.Write(valueByte, 0, intByteLength); + }); + + //カメラの書き込み + byte[] cameraFrameCount = BitConverter.GetBytes(0); + binaryWriter.Write(cameraFrameCount, 0, intByteLength); + + //照明の書き込み + byte[] lightFrameCount = BitConverter.GetBytes(0); + binaryWriter.Write(lightFrameCount, 0, intByteLength); + + //セルフシャドウの書き込み + byte[] selfShadowCount = BitConverter.GetBytes(0); + binaryWriter.Write(selfShadowCount, 0, intByteLength); + + //IKの書き込み + //0フレームにキーフレーム一つだけ置く + byte[] ikCount = BitConverter.GetBytes(1); + byte[] ikFrameNumber = BitConverter.GetBytes(0); + byte modelDisplay = Convert.ToByte(1); + //右足IKと左足IKと右足つま先IKと左足つま先IKの4つ + byte[] ikNumber = BitConverter.GetBytes(4); + const int IKNameLength = 20; + byte[] leftIKName = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes("左足IK"); + byte[] rightIKName = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes("右足IK"); + byte[] leftToeIKName = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes("左つま先IK"); + byte[] rightToeIKName = System.Text.Encoding.GetEncoding(ShiftJIS).GetBytes("右つま先IK"); + byte ikOn = Convert.ToByte(1); + byte ikOff = Convert.ToByte(0); + binaryWriter.Write(ikCount, 0, intByteLength); + binaryWriter.Write(ikFrameNumber, 0, intByteLength); + binaryWriter.Write(modelDisplay); + binaryWriter.Write(ikNumber, 0, intByteLength); + binaryWriter.Write(leftIKName, 0, leftIKName.Length); + binaryWriter.Write(new byte[IKNameLength - leftIKName.Length], 0, IKNameLength - leftIKName.Length); + binaryWriter.Write(ikOff); + binaryWriter.Write(leftToeIKName, 0, leftToeIKName.Length); + binaryWriter.Write(new byte[IKNameLength - leftToeIKName.Length], 0, IKNameLength - leftToeIKName.Length); + binaryWriter.Write(ikOff); + binaryWriter.Write(rightIKName, 0, rightIKName.Length); + binaryWriter.Write(new byte[IKNameLength - rightIKName.Length], 0, IKNameLength - rightIKName.Length); + binaryWriter.Write(ikOff); + binaryWriter.Write(rightToeIKName, 0, rightToeIKName.Length); + binaryWriter.Write(new byte[IKNameLength - rightToeIKName.Length], 0, IKNameLength - rightToeIKName.Length); + binaryWriter.Write(ikOff); } - }); - + catch (Exception ex) + { + Debug.Log("VMD書き込みエラー" + ex.Message); + } + finally + { + binaryWriter.Close(); + } + } Destroy(this); } @@ -575,7 +569,7 @@ public class UnityHumanoidVMDRecorder : MonoBehaviour /// VMDファイルに記載される専用モデル名 /// 保存先の絶対ファイルパス /// キーの書き込み頻度を減らして容量を減らす - public void SaveVMD(string modelName, int keyReductionLevel = 3) + public void SaveVMD(string modelName, int keyReductionLevel = 3) { string fileName = Application.dataPath + "/../VMDRecords/" + string.Format("UMA_{0}.vmd", DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss")); Directory.CreateDirectory(Application.dataPath + "/../VMDRecords"); @@ -774,7 +768,7 @@ public class UnityHumanoidVMDRecorder : MonoBehaviour FacialMorphList.AddRange(facialTarget.EyeBrowMorphs); FacialMorphList.AddRange(facialTarget.EyeMorphs); FacialMorphList.AddRange(facialTarget.MouthMorphs); - for (int i = 0; i < FacialMorphList.Count; i++) + for (int i = 0; i < FacialMorphList.Count; i++) { string morphName = ConvertMorphName(FacialMorphList[i].name); @@ -818,9 +812,9 @@ public class UnityHumanoidVMDRecorder : MonoBehaviour case "Eye_5_L": return "ウィンク"; case "Eye_8_R": return "ウィンク右"; case "Eye_8_L": return "ウィンク"; - case "Eye_9_L": - case "Eye_10_L": - case "Eye_11_L": + case "Eye_9_L": + case "Eye_10_L": + case "Eye_11_L": case "Eye_18_L": return "キリッ"; case "Eye_16_L": return "なごみ"; case "Eye_12_L": return "びっくり"; @@ -835,11 +829,11 @@ public class UnityHumanoidVMDRecorder : MonoBehaviour case "Mouth_6_0": case "Mouth_7_0": case "Mouth_23_0": return "あ"; - case "Mouth_25_0": + case "Mouth_25_0": case "Mouth_8_0": return "い"; - case "Mouth_28_0": + case "Mouth_28_0": case "Mouth_16_0": return "う"; - case "Mouth_31_0": + case "Mouth_31_0": case "Mouth_10_0": case "Mouth_14_0": return "お"; case "Mouth_33_0": return "え"; @@ -847,7 +841,7 @@ public class UnityHumanoidVMDRecorder : MonoBehaviour case "Mouth_45_0": return "ぺろっ"; case "Mouth_54_0": return "口横広げ"; case "Mouth_55_0": return "口横狭い"; - default:return name; + default: return name; } } @@ -921,7 +915,7 @@ public class UnityHumanoidVMDRecorder : MonoBehaviour public void RecordMorph() { float val = 0; - foreach(var morph in Morphs) + foreach (var morph in Morphs) { val += morph.weight; }