/// <summary> /// 現在のデータが正常(実行できる状態)か返す /// </summary> /// <returns></returns> public override Define.Error VerifyData() { var baseError = base.VerifyData(); if (baseError != Define.Error.None) { return(baseError); } if (sharedMesh == null) { return(Define.Error.SharedMeshNull); } if (sharedMesh.isReadable == false) { return(Define.Error.SharedMeshCannotRead); } #if UNITY_EDITOR // メッシュ最適化タイプが異なる場合は頂点順序が変更されているのでNG // またモデルインポート設定を参照するので実行時は判定しない if (!Application.isPlaying && meshOptimize != 0 && meshOptimize != EditUtility.GetOptimizeMesh(sharedMesh)) { return(Define.Error.MeshOptimizeMismatch); } #endif return(Define.Error.None); }
/// <summary> /// 現在のデータが正常(実行できる状態)か返す /// </summary> /// <returns></returns> public override Define.Error VerifyData() { var baseError = base.VerifyData(); if (baseError != Define.Error.None) { return(baseError); } if (sharedMesh == null) { return(Define.Error.SharedMeshNull); } if (sharedMesh.isReadable == false) { return(Define.Error.SharedMeshCannotRead); } var targetMesh = GetTargetSharedMesh(); if (MeshData != null && targetMesh != null && MeshData.vertexCount != targetMesh.vertexCount) { return(Define.Error.SharedMeshDifferentVertexCount); // 設定頂点数と現在のメッシュの頂点数が異なる } // 最大頂点数は65535(要望が多いようなら拡張する) if (sharedMesh.vertexCount > 65535) { return(Define.Error.MeshVertexCount65535Over); } #if UNITY_EDITOR // メッシュ最適化タイプが異なる場合は頂点順序が変更されているのでNG // またモデルインポート設定を参照するので実行時は判定しない if (!Application.isPlaying && meshOptimize != 0 && meshOptimize != EditUtility.GetOptimizeMesh(sharedMesh)) { return(Define.Error.MeshOptimizeMismatch); } #endif return(Define.Error.None); }
//========================================================================================= /// <summary> /// 事前データ作成(エディット時のみ) /// ※RenderDeformerはマルチ選択+コンポーネントアタッチで自動生成する必要があるのでこちらに配置する /// </summary> public void CreateData() { Debug.Log("Started creating. [" + this.name + "]"); var serializedObject = new SerializedObject(this); // ターゲットオブジェクト serializedObject.FindProperty("deformer.targetObject").objectReferenceValue = gameObject; serializedObject.FindProperty("deformer.dataHash").intValue = 0; // 共有データ作成 var meshData = ShareDataObject.CreateShareData <MeshData>("RenderMeshData_" + this.name); // renderer var ren = GetComponent <Renderer>(); if (ren == null) { Debug.LogError("Creation failed. Renderer not found."); return; } Mesh sharedMesh = null; if (ren is SkinnedMeshRenderer) { meshData.isSkinning = true; var sren = ren as SkinnedMeshRenderer; sharedMesh = sren.sharedMesh; } else { meshData.isSkinning = false; var meshFilter = ren.GetComponent <MeshFilter>(); if (meshFilter == null) { Debug.LogError("Creation failed. MeshFilter not found."); return; } sharedMesh = meshFilter.sharedMesh; } // 頂点 meshData.vertexCount = sharedMesh.vertexCount; // 頂点ハッシュ var vlist = sharedMesh.vertices; List <ulong> vertexHashList = new List <ulong>(); for (int i = 0; i < vlist.Length; i++) { var vhash = DataHashExtensions.GetVectorDataHash(vlist[i]); //Debug.Log("[" + i + "] (" + (vlist[i] * 1000) + ") :" + vhash); vertexHashList.Add(vhash); } meshData.vertexHashList = vertexHashList.ToArray(); // トライアングル meshData.triangleCount = sharedMesh.triangles.Length / 3; // レンダーデフォーマーのメッシュデータにはローカル座標、法線、接線、UV、トライアングルリストは保存しない // 不要なため // ボーン int boneCount = meshData.isSkinning ? sharedMesh.bindposes.Length : 1; meshData.boneCount = boneCount; // メッシュデータの検証とハッシュ meshData.CreateVerifyData(); serializedObject.FindProperty("deformer.sharedMesh").objectReferenceValue = sharedMesh; serializedObject.FindProperty("deformer.meshData").objectReferenceValue = meshData; serializedObject.FindProperty("deformer.meshOptimize").intValue = EditUtility.GetOptimizeMesh(sharedMesh); serializedObject.ApplyModifiedProperties(); // デフォーマーデータの検証とハッシュ Deformer.CreateVerifyData(); serializedObject.ApplyModifiedProperties(); // コアコンポーネントの検証とハッシュ CreateVerifyData(); serializedObject.ApplyModifiedProperties(); EditorUtility.SetDirty(meshData); // 変更後数 Debug.Log("Creation completed. [" + this.name + "]"); }