public async void Should_SetOptionsAsync() { var id = "id"; var animation = new MorphAnimation(id, _jsRuntime.Object); var options = new MorphAnimationOptions(); await animation.SetOptionsAsync(options); _jsRuntime.Verify(runtime => runtime.InvokeVoidAsync(Constants.JsConstants.Methods.Animation.SetOptions.ToAnimationNamespace(), id, options), Times.Once); _jsRuntime.VerifyNoOtherCalls(); }
public void Init(MorphAnimation ma) { _morphAnimation = ma; _currentFrame = null; _currentBone = null; _currentBoneParent = null; _boneDistance = 0f; _frameEdit = false; _isPreview = false; _previewIndex = 0; _previewLocation = 0f; _buttonSize = new Vector2(100, 30); _labelSize = new Vector2(100, 20); _isRename = false; _newName = ""; _previewButton = new GUIContent("", "Preview Animation"); _addFrameButton = new GUIContent("", "Add Frame To TimeLine"); _height = 100; _space = 2; EditorApplication.update += Update; }
private void OnEnable() { _morphAnimation = target as MorphAnimation; _transform = _morphAnimation.transform; _boneSize = 0.1f; ReSet(); if (!_morphAnimation.IsApprove) { return; } if (_morphAnimation.IsDone) { return; } _skinnedMeshRenderer = _transform.GetComponent <SkinnedMeshRenderer>(); _mesh = _skinnedMeshRenderer.sharedMesh; _meshCollider = _transform.GetComponent <MeshCollider>(); _currentCheckedBone = null; _currentCheckedMorphBone = null; _currentCheckedVertex = null; _MAEditType = MAEditType.Bone; _MATool = MATool.Move; _vertexHandleType = HandleType.Wire; _vertexIconSize = 0.01f; _reNameBone = false; _newNameBone = ""; _showMorphSetting = true; _showRenderSetting = true; _showMaterials = false; SaveMorphMesh(); }
/// <summary> /// 创建变形动画 /// </summary> private void GenerateMorphAnimation() { GUI.backgroundColor = Color.cyan; if (GUILayout.Button("Generate Morph Animation")) { Mesh mesh = Instantiate(_meshFilter.sharedMesh); mesh.name = _meshFilter.sharedMesh.name + "(Morph)"; string path = "Assets/" + mesh.name + ".asset"; AssetDatabase.CreateAsset(mesh, path); AssetDatabase.SaveAssets(); Mesh meshAsset = AssetDatabase.LoadAssetAtPath(path, typeof(Mesh)) as Mesh; //生成蒙皮网格组件 _skinnedMeshRenderer = _meshFilter.transform.GetComponent <SkinnedMeshRenderer>(); if (_skinnedMeshRenderer) { DestroyImmediate(_skinnedMeshRenderer); } _skinnedMeshRenderer = _meshFilter.transform.gameObject.AddComponent <SkinnedMeshRenderer>(); _skinnedMeshRenderer.hideFlags = HideFlags.HideInInspector; _skinnedMeshRenderer.sharedMesh = meshAsset; _skinnedMeshRenderer.rootBone = _meshFilter.transform; _skinnedMeshRenderer.sharedMaterial = _meshRenderer ? _meshRenderer.sharedMaterial : null; _skinnedMeshRenderer.enabled = true; //生成网格碰撞器 MeshCollider mc = _meshFilter.transform.GetComponent <MeshCollider>(); if (mc) { DestroyImmediate(mc); } mc = _meshFilter.transform.gameObject.AddComponent <MeshCollider>(); mc.sharedMesh = meshAsset; mc.enabled = true; //生成变形动画组件 MorphAnimation ma = _meshFilter.transform.GetComponent <MorphAnimation>(); if (ma) { DestroyImmediate(ma); } ma = _meshFilter.transform.gameObject.AddComponent <MorphAnimation>(); ma.IsApprove = true; //处理顶点 ma.Vertexs = new List <MorphVertex>(); List <int> repetitionVertices = new List <int>(); for (int i = 0; i < meshAsset.vertices.Length; i++) { EditorUtility.DisplayProgressBar("请稍等", "处理顶点(" + i + "/" + meshAsset.vertices.Length + ")......", 1.0f / meshAsset.vertices.Length * i); if (repetitionVertices.Contains(i)) { continue; } List <int> verticesGroup = new List <int>(); verticesGroup.Add(i); for (int j = i + 1; j < meshAsset.vertices.Length; j++) { if (meshAsset.vertices[i] == meshAsset.vertices[j]) { verticesGroup.Add(j); repetitionVertices.Add(j); } } ma.Vertexs.Add(new MorphVertex(_meshFilter.transform.localToWorldMatrix.MultiplyPoint3x4(meshAsset.vertices[i]), verticesGroup)); } //处理三角面 List <int> allTriangles = new List <int>(meshAsset.triangles); ma.Triangles = new List <MorphTriangle>(); for (int i = 0; (i + 2) < allTriangles.Count; i += 3) { EditorUtility.DisplayProgressBar("请稍等", "处理三角面(" + i + "/" + allTriangles.Count + ")......", 1.0f / allTriangles.Count * i); MorphVertex mv1 = GetVertexByIndex(ma.Vertexs, allTriangles[i]); MorphVertex mv2 = GetVertexByIndex(ma.Vertexs, allTriangles[i + 1]); MorphVertex mv3 = GetVertexByIndex(ma.Vertexs, allTriangles[i + 2]); MorphTriangle mt = new MorphTriangle(ma.Triangles.Count, ref mv1, ref mv2, ref mv3); ma.Triangles.Add(mt); } //默认生成一条骨骼(根骨骼) Transform[] bones = new Transform[1]; Matrix4x4[] bindPoses = new Matrix4x4[1]; GameObject go = new GameObject("BoneRoot"); go.AddComponent <MorphBone>(); go.GetComponent <MorphBone>().hideFlags = HideFlags.HideInInspector; go.hideFlags = HideFlags.HideInHierarchy; bones[0] = go.transform; bones[0].SetParent(_skinnedMeshRenderer.transform); bones[0].localPosition = Vector3.zero; bones[0].localRotation = Quaternion.identity; bindPoses[0] = bones[0].worldToLocalMatrix * _skinnedMeshRenderer.transform.localToWorldMatrix; _skinnedMeshRenderer.bones = bones; _skinnedMeshRenderer.sharedMesh.bindposes = bindPoses; EditorUtility.ClearProgressBar(); if (_meshFilter.transform.GetComponent <Collider>() != null) { _meshFilter.transform.GetComponent <Collider>().enabled = false; } if (_meshRenderer) { _meshRenderer.enabled = false; _meshRenderer.hideFlags = HideFlags.HideInInspector; } DestroyImmediate(_meshFilter); } }