public override void DrawUI(Rect rect) { if (GUILayout.Button("加载预览")) { var prefab = AssetDatabase.LoadAssetAtPath <GameObject>(AVATAR_PATH); PreviewInstance = EditorHelper.InstantiateGoByPrefab(prefab, null); PreviewInstance.hideFlags = HideFlags.HideAndDontSave; _previewAnimator = AssetDatabase.LoadAssetAtPath <AnimatorController>(PREVIEW_ANIMCONTROLLER_PATH); _animationClip = AssetDatabase.LoadAssetAtPath <AnimationClip>(CLIP_PATH); var states = _previewAnimator.layers[0].stateMachine.states; foreach (var item in states) { if (item.state.name == "Preview") { _animatorState = item.state; break; } } InitController(); _avatarPreview = new AvatarPreview(_animator, _animationClip); _avatarPreview.OnAvatarChangeFunc = SetPreviewAvatar; _avatarPreview.fps = Mathf.RoundToInt(_animationClip.frameRate); _avatarPreview.ShowIKOnFeetButton = (_animationClip as Motion).isHumanMotion; _avatarPreview.ResetPreviewFocus(); // force an update on timeControl if AvatarPreviewer is closed when creating/editing animation curves // prevent from having a nomralizedTime == -inf if (_avatarPreview.timeControl.currentTime == Mathf.NegativeInfinity) { _avatarPreview.timeControl.Update(); } } if (null != _avatarPreview) { GUILayout.Label("", GUILayout.Height(300), GUILayout.Width(500)); if (Event.current.type == EventType.Repaint) { _avatarPreview.timeControl.loop = true; _avatarPreview.timeControl.Update(); AnimationClipSettings previewInfo = AnimationUtility.GetAnimationClipSettings(_animationClip); float normalizedTime = previewInfo.stopTime - previewInfo.startTime != 0 ? (_avatarPreview.timeControl.currentTime - previewInfo.startTime) / (previewInfo.stopTime - previewInfo.startTime) : 0.0f; _avatarPreview.Animator.Play(0, 0, normalizedTime); _avatarPreview.Animator.Update(_avatarPreview.timeControl.deltaTime); } _avatarPreview.DoAvatarPreview(PREVIEW_RECT, Constants.preBackgroundSolid); } }
public void OnInteractivePreviewGUI(Rect r, GUIStyle background) { if (m_AvatarPreview != null && m_Controller != null) { if (m_LastEvalTime != m_AvatarPreview.timeControl.currentTime && Event.current.type == EventType.Repaint) { m_AvatarPreview.Animator.playbackTime = m_AvatarPreview.timeControl.currentTime; m_AvatarPreview.Animator.Update(0); m_LastEvalTime = m_AvatarPreview.timeControl.currentTime; } m_AvatarPreview.DoAvatarPreview(r, background); } }