예제 #1
0
        void StoreSet()
        {
            wasController  = animator.runtimeAnimatorController;
            wasRootMotion  = animator.applyRootMotion;
            wasCullingMode = animator.cullingMode;
            wasEnabled     = animator.enabled;

#if UNITY_5_6_OR_NEWER
            animator.applyRootMotion = false;
            animator.cullingMode     = AnimatorCullingMode.AlwaysAnimate;
#else
            if (Application.isPlaying && animator.runtimeAnimatorController != null)
            {
                StoreAnimatorInfo();
            }

            //if we dont set controller null, unity does not initialize deactivated animators when they enable and also cause animator crashes.
            //if we do set controller null, unity crashes for already activated animators.
            //checking isInitialized does not work, thus checking gameobject active seems only solution until animator fixed.
            if (!animator.gameObject.activeInHierarchy)
            {
                animator.runtimeAnimatorController = null;
            }
            animator.applyRootMotion = false;
            animator.cullingMode     = AnimatorCullingMode.AlwaysAnimate;
            animator.enabled         = false;
#endif
        }
예제 #2
0
 public static void SetApplyCullMode(this AnimatorComponent com, AnimatorCullingMode mode)
 {
     if (com.animator != null)
     {
         com.animator.cullingMode = mode;
     }
 }
예제 #3
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="component">Animatorオブジェクト</param>
        public AnimatorKun(Component component) : base(component)
        {
            componentKunType          = ComponentKunType.Animator;
            runtimeAnimatorController = "None";
            avatar = "None";
            var animator = component as Animator;

            if (animator)
            {
                if (animator.runtimeAnimatorController != null)
                {
                    runtimeAnimatorController = animator.runtimeAnimatorController.name;
                }
                else
                {
                    runtimeAnimatorController = "None";
                }

                if (animator.avatar != null)
                {
                    avatar = animator.avatar.name;
                }
                else
                {
                    avatar = "None";
                }
                applyRootMotion = animator.applyRootMotion;
                updateMode      = animator.updateMode;
                cullingMode     = animator.cullingMode;
            }
        }
예제 #4
0
        void Awake()
        {
            if (CheckForControllerError())
            {
                return;
            }

            ragdollOnCollision.InitializeRagdollOnCollisions(this);

            animator = GetComponent <Animator>();

            // store original culling mode
            originalAnimatorCullingMode = animator.cullingMode;

            // store master hip bone
            masterHips = animator.GetBoneTransform(HumanBodyBones.Hips);

            // get all the master renderers to switch off when going ragdoll
            masterRenderers = GetComponentsInChildren <Renderer>();

            // set the ragdolls follow target (assumes same bone setup...)
            ragdoll.SetFollowTarget(animator);

            // tell the ragdoll it's being controlled
            ragdoll.SetController(this);

            // initialize animation following
            InitializeJointFollowing();
            InitializeVelocitySetValues();

            GetUpImmediate(false);

            //subscribe to receive a callback on ragdoll bone collision
            ragdoll.onCollisionEnter += OnRagdollCollisionEnter;
        }
예제 #5
0
    static int IntToEnum(IntPtr L)
    {
        int arg0 = (int)LuaDLL.lua_tonumber(L, 1);
        AnimatorCullingMode o = (AnimatorCullingMode)arg0;

        LuaScriptMgr.PushEnum(L, o);
        return(1);
    }
 public static void InitializeCharacterOptimizations(GameObject player, float genitalRange, float hairRange, float clothingRange, float bodyRange, AnimatorCullingMode cullingMode)
 {
     _playerObject = player;
     _cullingMode  = cullingMode;
     SetColliderRanges(genitalRange, hairRange, clothingRange, bodyRange);
     BuildCharacterList();
     UpdateAnimatorCulling(_cullingMode);
 }
예제 #7
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="binaryReader"></param>
 public override void Deserialize(BinaryReader binaryReader)
 {
     base.Deserialize(binaryReader);
     mRuntimeAnimatorController = binaryReader.ReadString();
     mAvatar          = binaryReader.ReadString();
     mApplyRootMotion = binaryReader.ReadBoolean();
     mUpdateMode      = (AnimatorUpdateMode)binaryReader.ReadInt32();
     mCullingMode     = (AnimatorCullingMode)binaryReader.ReadInt32();
 }
예제 #8
0
        void StoreSet()
        {
            wasController  = animator.runtimeAnimatorController;
            wasRootMotion  = animator.applyRootMotion;
            wasCullingMode = animator.cullingMode;
            wasEnabled     = animator.enabled;

            animator.applyRootMotion = false;
            animator.cullingMode     = AnimatorCullingMode.AlwaysAnimate;
        }
예제 #9
0
 public static void CreateAnimator(GameObject root, UmaTPose umaTPose, RuntimeAnimatorController controller,bool applyRootMotion, bool animatePhysics,AnimatorCullingMode cullingMode)
 {
     umaTPose.DeSerialize();
     var animator = root.AddComponent<Animator>();
     animator.avatar = CreateAvatar(root, umaTPose);
     animator.runtimeAnimatorController = controller;
     animator.applyRootMotion = applyRootMotion;
     animator.animatePhysics = animatePhysics;
     animator.cullingMode = cullingMode;
 }
예제 #10
0
 public static Animator CreateAnimator(UMAData umaData, UmaTPose umaTPose, RuntimeAnimatorController controller, bool applyRootMotion, bool animatePhysics, AnimatorCullingMode cullingMode)
 {
     umaTPose.DeSerialize();
     var animator = umaData.umaRoot.AddComponent<Animator>();
     animator.avatar = CreateAvatar(umaData, umaTPose);
     animator.runtimeAnimatorController = controller;
     animator.applyRootMotion = applyRootMotion;
     animator.animatePhysics = animatePhysics;
     animator.cullingMode = cullingMode;
     return animator;
 }
예제 #11
0
        public virtual void UpdateAvatar(UMAData umaData)
        {
            if (umaData)
            {
                AnimationState[] snapshot = null;
                if (umaData.animationController)
                {
                    var animator = umaData.animator;

                    bool animating                  = false;
                    bool applyRootMotion            = false;
                    bool animatePhysics             = false;
                    AnimatorCullingMode cullingMode = AnimatorCullingMode.AlwaysAnimate;

                    if (animator)
                    {
                        animating       = animator.enabled;
                        applyRootMotion = animator.applyRootMotion;
                        animatePhysics  = animator.animatePhysics;
                        cullingMode     = animator.cullingMode;

                        if (umaData.animationController == animator.runtimeAnimatorController)
                        {
                            snapshot = new AnimationState[animator.layerCount];
                            for (int i = 0; i < animator.layerCount; i++)
                            {
                                var state = animator.GetCurrentAnimatorStateInfo(i);
                                snapshot[i].stateHash = state.nameHash;
                                snapshot[i].stateTime = Mathf.Max(0, state.normalizedTime - Time.deltaTime / state.length);
                            }
                        }

                        Object.DestroyImmediate(animator);
                    }
                    var oldParent = umaData.umaRoot.transform.parent;
                    umaData.umaRoot.transform.parent = null;
                    animator         = CreateAnimator(umaData, umaData.umaRecipe.raceData.TPose, umaData.animationController, applyRootMotion, animatePhysics, cullingMode);
                    umaData.animator = animator;
                    umaData.umaRoot.transform.parent = oldParent;
                    if (snapshot != null)
                    {
                        for (int i = 0; i < animator.layerCount; i++)
                        {
                            animator.Play(snapshot[i].stateHash, i, snapshot[i].stateTime);
                        }

                        animator.Update(0);
                        animator.enabled = animating;
                    }
                }
            }
        }
예제 #12
0
        //...
        protected override void OnReverseEnter()
        {
            if (isMasterTrack)
            {
                wasCullingMode           = animator.cullingMode;
                animator.cullingMode     = AnimatorCullingMode.AlwaysAnimate;
                wasRootMotion            = animator.applyRootMotion;
                animator.applyRootMotion = false;

                CreateAndPlayTree();
                //DO NOT Re-Bake root motion
            }
        }
예제 #13
0
        public static void UpdateAnimatorCulling(AnimatorCullingMode cullingMode)
        {
            List <Animator> buildingAnimators = BuildAnimatorList();

            if (buildingAnimators.IsNullOrEmpty())
            {
                return;
            }

            foreach (var animator in buildingAnimators)
            {
                animator.cullingMode = cullingMode;
            }
        }
        void Awake()
        {
            if (!profile)
            {
                Debug.LogWarning("No Controller Profile on " + name);
                return;
            }
            if (!ragdoll)
            {
                Debug.LogWarning("No Ragdoll for " + name + " to control...");
                return;
            }

            eventPlayer = GetComponent <AssetObjectsPacks.EventPlayer>();

            eventPlayer.AddParameter(new AssetObjectsPacks.CustomParameter("OnFront", false));

            animator = GetComponent <Animator>();

            // store original culling mode
            originalAnimatorCullingMode = animator.cullingMode;

            // store master hip bone
            masterHips = animator.GetBoneTransform(HumanBodyBones.Hips);

            // get all the master renderers to switch off when going ragdoll
            masterRenderers = GetComponentsInChildren <Renderer>();

            // set the ragdolls follow target (assumes same bone setup...)
            ragdoll.SetFollowTarget(animator);

            // tell the ragdoll it's being controlled
            ragdoll.SetController(this);

            // initialize animation following
            InitializeJointFollowing();
            InitializeVelocitySetValues();

            // disable physics
            ragdoll.UseGravity(false);
            //ragdoll.OverrideDepenetrationSpeed(-1);
            ragdoll.IgnoreSelfCollisions(true);

            ResetToAnimated();
            ResetBoneDecays();

            //subscribe to receive a callback on ragdoll bone collision
            ragdoll.onCollisionEnter += OnRagdollCollisionEnter;
        }
예제 #15
0
        public static void UpdateAnimatorCulling(AnimatorCullingMode cullingMode)
        {
            var animalRoot = GameObject.Find("CommonSpace/MapRoot/SpawnPoint/AnimalRoot");

            if (animalRoot == null)
            {
                return;
            }

            var animalAnimators = animalRoot.GetComponentsInChildren <Animator>(true);

            foreach (var animator in animalAnimators)
            {
                animator.cullingMode = cullingMode;
            }
        }
        public static void UpdateAnimatorCulling(AnimatorCullingMode cullingMode)
        {
            var worldData = GameObject.Find("map00_Beach");

            if (worldData == null)
            {
                return;
            }

            var worldAnimators = worldData.GetComponentsInChildren <Animator>(true);

            foreach (var animator in worldAnimators)
            {
                animator.cullingMode = cullingMode;
            }
        }
예제 #17
0
    private static bool SetAnimatorCullingMode(GameObject obj, AnimatorCullingMode mode)
    {
        var animator = obj.GetComponentInChildren <Animator>();

        if (null == animator)
        {
            return(false);
        }
        bool rt = false;

        if (animator.cullingMode != mode)
        {
            rt = true;
            animator.cullingMode = mode;
            Debug.Log("SetAnimatorCullingMode succ:" + obj.name + " " + mode);
        }
        return(rt);
    }
예제 #18
0
 public static Animator CreateAnimator(UMAData umaData, UmaTPose umaTPose, RuntimeAnimatorController controller, bool applyRootMotion, bool animatePhysics, AnimatorCullingMode cullingMode)
 {
     var animator = umaData.umaRoot.AddComponent<Animator>();
     switch (umaData.umaRecipe.raceData.umaTarget)
     {
         case RaceData.UMATarget.Humanoid:
             umaTPose.DeSerialize();
             animator.avatar = CreateAvatar(umaData, umaTPose);
             break;
         case RaceData.UMATarget.Generic:
             animator.avatar = CreateGenericAvatar(umaData);
             break;
     }
     animator.runtimeAnimatorController = controller;
     animator.applyRootMotion = applyRootMotion;
     animator.animatePhysics = animatePhysics;
     animator.cullingMode = cullingMode;
     return animator;
 }
예제 #19
0
        public void EnterState_JumpScene(xc.Machine.State s) // JumpScene State
        {
            Debug.Log("EnterState_JumpScene");
            mJumpTime = Time.time;
            if (mOwner.AnimationCtrl != null)
            {
                mCullingMode = mOwner.AnimationCtrl.CullMode;
                mOwner.AnimationCtrl.CullMode = AnimatorCullingMode.AlwaysAnimate;
            }

            if (mOwner.HasAnimation(mJumpSceneAnimation))
            {
                mOwner.Play(mJumpSceneAnimation);
                mJumpMaxTime = 3.0f;
            }
            else
            {
                mJumpMaxTime = 1.0f;
            }
        }
예제 #20
0
        //...
        protected override void OnEnter()
        {
            if (isMasterTrack)
            {
                wasCullingMode           = animator.cullingMode;
                animator.cullingMode     = AnimatorCullingMode.AlwaysAnimate;
                wasRootMotion            = animator.applyRootMotion;
                animator.applyRootMotion = false;

                siblingTracks = parent.children.OfType <AnimatorTrack>().Where(t => t.isActive).Reverse().ToList();
                var wasActive = animator.gameObject.activeSelf;
                animator.gameObject.SetActive(true);
                CreateAndPlayTree();
                if (useRootMotion)
                {
                    BakeRootMotion();
                }
                animator.gameObject.SetActive(wasActive);
            }
        }
예제 #21
0
			public void SaveAnimatorState(Animator animator)
			{
				animating = animator.enabled;
				applyRootMotion = animator.applyRootMotion;
				updateMode = animator.updateMode;
				cullingMode = animator.cullingMode;

				int layerCount = animator.layerCount;
				stateHashes = new int[layerCount];
				stateTimes = new float[layerCount];
				for (int i = 0; i < layerCount; i++)
				{
					var state = animator.GetCurrentAnimatorStateInfo(i);
#if UNITY_4_6
					stateHashes[i] = state.nameHash;
#else
					stateHashes[i] = state.fullPathHash;
#endif
					stateTimes[i] = Mathf.Max(0, state.normalizedTime - Time.deltaTime / state.length);
				}
			}
        protected override void ReadFromImpl(object obj)
        {
            base.ReadFromImpl(obj);
            Animator uo = (Animator)obj;

            rootPosition                         = uo.rootPosition;
            rootRotation                         = uo.rootRotation;
            applyRootMotion                      = uo.applyRootMotion;
            updateMode                           = uo.updateMode;
            stabilizeFeet                        = uo.stabilizeFeet;
            feetPivotActive                      = uo.feetPivotActive;
            speed                                = uo.speed;
            cullingMode                          = uo.cullingMode;
            recorderStartTime                    = uo.recorderStartTime;
            recorderStopTime                     = uo.recorderStopTime;
            runtimeAnimatorController            = ToID(uo.runtimeAnimatorController);
            layersAffectMassCenter               = uo.layersAffectMassCenter;
            logWarnings                          = uo.logWarnings;
            fireEvents                           = uo.fireEvents;
            keepAnimatorControllerStateOnDisable = uo.keepAnimatorControllerStateOnDisable;
        }
예제 #23
0
            public void SaveAnimatorState(Animator animator)
            {
                animating       = animator.enabled;
                applyRootMotion = animator.applyRootMotion;
                updateMode      = animator.updateMode;
                cullingMode     = animator.cullingMode;

                int layerCount = animator.layerCount;

                stateHashes = new int[layerCount];
                stateTimes  = new float[layerCount];
                for (int i = 0; i < layerCount; i++)
                {
                    var state = animator.GetCurrentAnimatorStateInfo(i);
#if UNITY_4_6
                    stateHashes[i] = state.nameHash;
#else
                    stateHashes[i] = state.fullPathHash;
#endif
                    stateTimes[i] = Mathf.Max(0, state.normalizedTime - Time.deltaTime / state.length);
                }
            }
        public static void UpdateAnimatorCulling(AnimatorCullingMode cullingMode)
        {
            if (_playerCharacter != null)
            {
                _playerCharacter.animBody.cullingMode = cullingMode;
            }

            if (_characters.IsNullOrEmpty())
            {
                return;
            }

            foreach (var character in _characters)
            {
                if (character == null)
                {
                    continue;
                }

                character.animBody.cullingMode = cullingMode;
            }
        }
예제 #25
0
    private static void CheckPrefabAnimatorCore(string prefabPath, AnimatorCullingMode cullingMode = AnimatorCullingMode.CullCompletely)
    {
        GameObject instanceObj = PrefabUtility.LoadPrefabContents(prefabPath);
        var        animators   = instanceObj.GetComponentsInChildren <Animator>(true);
        bool       change      = false;

        if (animators != null)
        {
            foreach (var animator in animators)
            {
                if (animator.cullingMode == AnimatorCullingMode.AlwaysAnimate)
                {
                    animator.cullingMode = cullingMode;
                    change = true;
                    Debug.Log(prefabPath + "    " + animator.gameObject.name);
                }
            }
        }
        if (change)
        {
            PrefabUtility.SaveAsPrefabAsset(instanceObj, prefabPath);
        }
        PrefabUtility.UnloadPrefabContents(instanceObj);
    }
예제 #26
0
        public static Animator CreateAnimator(UMAData umaData, UmaTPose umaTPose, RuntimeAnimatorController controller, bool applyRootMotion, bool animatePhysics, AnimatorCullingMode cullingMode)
        {
            var animator = CreateAnimator(umaData, umaTPose, controller);

            animator.applyRootMotion = applyRootMotion;
            animator.animatePhysics  = animatePhysics;
            animator.cullingMode     = cullingMode;
            return(animator);
        }
예제 #27
0
 public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
 {
     mOldMode             = animator.cullingMode;
     animator.cullingMode = mode;
 }
예제 #28
0
		public static Animator CreateAnimator(UMAData umaData, UmaTPose umaTPose, RuntimeAnimatorController controller, bool applyRootMotion, bool animatePhysics, AnimatorCullingMode cullingMode)
		{
			var animator = CreateAnimator(umaData, umaTPose, controller);
			animator.applyRootMotion = applyRootMotion;
			animator.animatePhysics = animatePhysics;
			animator.cullingMode = cullingMode;
			return animator;
		}
예제 #29
0
        protected override void OnEnter()
        {
            animator = actor.GetComponent <Animator>();
            if (animator == null)
            {
                return;
            }

            if (Application.isPlaying || layerOrder != 0)     //only 0 MecanimTrack layer does the recording
            {
                animator = null;
                return;
            }

            wasCullingMode       = animator.cullingMode;
            animator.cullingMode = AnimatorCullingMode.AlwaysAnimate;

            var updateInterval = (1f / RECORDING_FRAMERATE);

            animator.recorderStartTime = this.startTime;
            animator.recorderStopTime  = this.endTime + updateInterval;
            animator.StartRecording(0);


            var clips = new List <IDirectable>();

            foreach (var track in (parent as CutsceneGroup).tracks.OfType <MecanimTrack>().Where(t => t.isActive).Reverse())
            {
                clips.AddRange(track.clips.OfType <ActionClips.MecanimBaseClip>().Where(a => a.isValid).Cast <IDirectable>());
            }
            clips = clips.OrderBy(a => a.startTime).ToList();

            var lastTime = -1f;

            for (var i = startTime; i <= endTime + updateInterval; i += updateInterval)
            {
                foreach (var clip in clips)
                {
                    if (i >= clip.startTime && lastTime < clip.startTime)
                    {
                        clip.Enter();
                        clip.Update(0, 0);
                    }

                    if (i >= clip.startTime && i <= clip.endTime)
                    {
                        clip.Update(i - clip.startTime, i - clip.startTime - updateInterval);
                    }

                    if (i > clip.endTime && lastTime <= clip.endTime)
                    {
                        clip.Update(clip.endTime - clip.startTime, Mathf.Max(0, lastTime - clip.startTime));
                        clip.Exit();
                    }
                }

                animator.Update(updateInterval);
                lastTime = i;
            }

            animator.StopRecording();
            animator.StartPlayback();
        }
예제 #30
0
        public static Animator CreateAnimator(UMAData umaData, UmaTPose umaTPose, RuntimeAnimatorController controller, bool applyRootMotion, bool animatePhysics, AnimatorCullingMode cullingMode)
        {
            var animator = umaData.umaRoot.AddComponent <Animator>();

            switch (umaData.umaRecipe.raceData.umaTarget)
            {
            case RaceData.UMATarget.Humanoid:
                umaTPose.DeSerialize();
                animator.avatar = CreateAvatar(umaData, umaTPose);
                break;

            case RaceData.UMATarget.Generic:
                animator.avatar = CreateGenericAvatar(umaData);
                break;
            }
            animator.runtimeAnimatorController = controller;
            animator.applyRootMotion           = applyRootMotion;
            animator.animatePhysics            = animatePhysics;
            animator.cullingMode = cullingMode;
            return(animator);
        }
예제 #31
0
        /// <summary>
        /// Bake the Mecanim preview data.
        /// </summary>
        public void Bake()
        {
            if (Actor == null || Application.isPlaying)
            {
                return;
            }
            Animator animator = Actor.GetComponent <Animator>();

            if (animator == null)
            {
                return;
            }

            AnimatorCullingMode cullingData = animator.cullingMode;

            animator.cullingMode = AnimatorCullingMode.AlwaysAnimate;

            List <RevertInfo> revertCache = new List <RevertInfo>();

            // Build the cache of revert info.
            MonoBehaviour[] mb = this.GetComponentsInChildren <MonoBehaviour>();
            for (int i = 0; i < mb.Length; i++)
            {
                IRevertable revertable = mb[i] as IRevertable;
                if (revertable != null)
                {
                    revertCache.AddRange(revertable.CacheState());
                }
            }

            Vector3    position = Actor.transform.localPosition;
            Quaternion rotation = Actor.transform.localRotation;
            Vector3    scale    = Actor.transform.localScale;

            Cutscene cutScene   = GetCutScene();
            float    frameRate  = 30;
            int      frameCount = (int)((cutScene.Duration * frameRate) + 2);

            animator.StopPlayback();
            animator.recorderStartTime = 0;
            animator.StartRecording(frameCount);

            base.SetRunningTime(0);

            for (int i = 0; i < frameCount - 1; i++)
            {
                List <TimelineTrack> tracks = GetTracks();
                for (int j = 0; j < tracks.Count; j++)
                {
                    tracks[j].UpdateTrack(i * (1.0f / frameRate), (1.0f / frameRate));
                }
                animator.Update(1.0f / frameRate);
            }
            animator.recorderStopTime = frameCount * (1.0f / frameRate);
            animator.StopRecording();
            animator.StartPlayback();

            hasBeenBaked = true;

            // Return the Actor to his initial position.
            Actor.transform.localPosition = position;
            Actor.transform.localRotation = rotation;
            Actor.transform.localScale    = scale;

            for (int i = 0; i < revertCache.Count; i++)
            {
                RevertInfo revertable = revertCache[i];
                if (revertable != null)
                {
                    if ((revertable.EditorRevert == RevertMode.Revert && !Application.isPlaying) ||
                        (revertable.RuntimeRevert == RevertMode.Revert && Application.isPlaying))
                    {
                        revertable.Revert();
                    }
                }
            }
            animator.cullingMode = cullingData;
            base.Initialize();
        }
예제 #32
0
        private void Change(bool change)
        {
            var t             = gameObject.transform;
            var localPosition = t.localPosition;
            var localRotation = t.localRotation;
            var localScale    = t.localScale;

            Undo.RecordObject(this, "Change Animator Controller");
            Undo.RecordObject(animatorCache, "Change Animator Controller");
            if (change)
            {
                Assert.IsFalse(changed);
                animatorCache.hideFlags |= HideFlags.NotEditable;

                originalAnimatorApplyRootMotion = animatorCache.applyRootMotion;
                originalAnimatorUpdateMode      = animatorCache.updateMode;
                originalAnimatorCullingMode     = animatorCache.cullingMode;

                animatorCache.applyRootMotion = false;
                animatorCache.updateMode      = AnimatorUpdateMode.Normal;
                animatorCache.cullingMode     = AnimatorCullingMode.AlwaysAnimate;

                #region AnimatorController
                {
                    originalRuntimeAnimatorController = animatorCache.runtimeAnimatorController;
                    tmpAnimatorController             = new UnityEditor.Animations.AnimatorController();
                    tmpAnimatorController.name        = "Very Animation Temporary Controller";
                    tmpAnimatorController.hideFlags  |= HideFlags.HideAndDontSave;
                    {
                        tmpAnimatorController.AddLayer("Very Animation Layer");
                        layers = tmpAnimatorController.layers;
                        foreach (var layer in layers)
                        {
                            layer.iKPass = true;
                            var stateMachine = layer.stateMachine;
                            stateMachine.hideFlags |= HideFlags.HideAndDontSave;
                            {
                                state            = stateMachine.AddState("Animation");
                                state.hideFlags |= HideFlags.HideAndDontSave;
                                stateNameHash    = state.nameHash;
                            }
                            layer.stateMachine = stateMachine;
                        }
                        tmpAnimatorController.layers = layers;
                    }
                    UnityEditor.Animations.AnimatorController.SetAnimatorController(animatorCache, tmpAnimatorController);
                }
                #endregion
                changed = true;
            }
            else
            {
                Assert.IsTrue(changed);
                animatorCache.hideFlags &= ~HideFlags.NotEditable;

                animatorCache.applyRootMotion = originalAnimatorApplyRootMotion;
                animatorCache.updateMode      = originalAnimatorUpdateMode;
                animatorCache.cullingMode     = originalAnimatorCullingMode;

                #region AnimatorController
                {
                    {
                        var layerCount = tmpAnimatorController.layers.Length;
                        for (int i = 0; i < layerCount; i++)
                        {
                            tmpAnimatorController.RemoveLayer(0);
                        }
                    }
                    DestroyImmediate(tmpAnimatorController);
                    tmpAnimatorController = null;
                    animatorCache.runtimeAnimatorController = originalRuntimeAnimatorController;
                }
                #endregion

                originalRuntimeAnimatorController = null;

                changed = false;
            }

            //Cause unknown. It does not allow initialization.
            {
                t.localPosition = localPosition;
                t.localRotation = localRotation;
                t.localScale    = localScale;
            }
        }
예제 #33
0
 public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
 {
     this.lastMode        = animator.cullingMode;
     animator.cullingMode = this.cullingMode;
 }
예제 #34
0
        protected override bool BuildInternal()
        {
            _tracksCached = GetAnimationTracks();

            _validFrameRanges.Clear();

            if (_tracksCached.Count == 0)
            {
                return(false);
            }

            // build preview
#if FLUX_DEBUG
            Debug.LogWarning("Creating Preview");
#endif

            FSequence sequence = Track.Sequence;

            if (_tracksCached[0].Snapshot != null)
            {
                _tracksCached[0].Snapshot.Restore();
            }

            _snapshot = Application.isPlaying ? null : new GameObjectSnapshot(Track.Owner.gameObject);

            bool ownerIsActive = Track.Owner.gameObject.activeSelf;

            if (!ownerIsActive)
            {
                HideFlags hideFlags = Track.Owner.gameObject.hideFlags;
                Track.Owner.gameObject.hideFlags |= HideFlags.DontSave;
                Track.Owner.gameObject.SetActive(true);
                Track.Owner.gameObject.hideFlags = hideFlags;
            }

            float speed = sequence.Speed;
            if (speed != 1)
            {
                sequence.Speed = 1f;
            }

            Animator.speed = 1f;

            int  currentFrame = sequence.CurrentFrame;
            bool isPlaying    = sequence.IsPlaying;

            if (!sequence.IsStopped)
            {
                sequence.Stop();
            }

            if (!sequence.IsInit)
            {
                sequence.Init();
            }

            FrameRange currentFrameRange = new FrameRange();

            foreach (FAnimationTrack animTrack in _tracksCached)
            {
                animTrack.Cache = null;
                animTrack.Stop();                 // we need to force stop them to clear the currentEvent index
            }

//			RuntimeAnimatorController controller = Animator.runtimeAnimatorController;
//			Animator.runtimeAnimatorController = null;
//			Animator.runtimeAnimatorController = controller;

            // set culling to get around Unity bug of recording at the start
            AnimatorCullingMode animatorCullingMode = Animator.cullingMode;
            Animator.cullingMode = AnimatorCullingMode.AlwaysAnimate;

            Animator.enabled = true;

            for (int i = 0; i != Animator.layerCount; ++i)
            {
                Animator.SetLayerWeight(i, 0f);
            }

            Animator.StartRecording(-1);

            bool success = Animator.recorderMode == AnimatorRecorderMode.Record;

            if (success)
            {
                Animator.enabled = false;

                float delta = 1f / sequence.FrameRate;
                int   frame = 0;

                while (frame <= sequence.Length)
                {
                    bool wasEnabled = Animator.enabled;
                    foreach (FAnimationTrack animTrack in _tracksCached)
                    {
                        animTrack.UpdateEvents(frame, frame * delta);
                    }
                    if (wasEnabled)
                    {
                        currentFrameRange.End += 1;
                        if (Animator.enabled)
                        {
                            Animator.Update(delta);
                        }
                        else
                        {
                            Animator.enabled = true;
                            Animator.Update(delta);
                            Animator.enabled = false;
                            _validFrameRanges.Add(currentFrameRange);
                        }
                    }
                    else if (Animator.enabled)
                    {
                        Animator.Update(0);
                        currentFrameRange = new FrameRange(frame, frame);
                    }

                    ++frame;
                }

                foreach (FAnimationTrack animTrack in _tracksCached)
                {
                    animTrack.Cache = this;
                }

                Track = _tracksCached[0];

                Animator.StopRecording();

                sequence.Stop(true);

                if (_snapshot != null)
                {
                    _snapshot.Restore();
                }
            }

            if (!ownerIsActive)
            {
                HideFlags hideFlags = Track.Owner.gameObject.hideFlags;
                Track.Owner.gameObject.hideFlags |= HideFlags.DontSave;
                Track.Owner.gameObject.SetActive(false);
                Track.Owner.gameObject.hideFlags = hideFlags;
            }

            if (speed != 1)
            {
                sequence.Speed = speed;
            }

            Animator.cullingMode = animatorCullingMode;

            if (currentFrame >= 0)
            {
                if (isPlaying)
                {
                    sequence.Play(currentFrame);
                }
                else
                {
                    sequence.SetCurrentFrame(currentFrame);
                }
            }

            return(success);
        }
        public static void InitializeWorldOptimizations(float detailDistance, bool castShadows, GameLayers.LayerStrategy layerStrategy, bool drawTrees, LightShadows spotLightShadows, LightShadows pointLightShadows, bool enableCityPointLights, float citySpotLightIntensity, AnimatorCullingMode cullingMode)
        {
            terrain = GetTerrain();

            if (terrain == null)
            {
                return;
            }

            SetTerrainDetailDistance(detailDistance);
            SetTerrainShadows(castShadows);
            EnableTreeRendering(drawTrees);

            AdjustTerrainLayer(layerStrategy);
            AdjustCullingMasks(layerStrategy);

            SetCityLightShadows(spotLightShadows, pointLightShadows);
            EnableCityPointLights(enableCityPointLights);
            SetCitySpotLightIntensity(citySpotLightIntensity);

            UpdateAnimatorCulling(cullingMode);
        }