コード例 #1
0
        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);
            }
        }