コード例 #1
0
        public void UnloadAsset(AssetInfo asset)
        {
#if !UnitTest
            if (Logger.IsDebugEnabled)
            {
                Logger.DebugFormat("unload asset {0}", asset);
            }
#endif
            if (_loadedGo.ContainsKey(asset))
            {
                var unityObj = _loadedGo[asset];

                _loadedGo.Remove(asset);
                _assetManager.Recycle(unityObj);
            }
            else
            {
                if (_loadKeys.ContainsKey(asset))
                {
                    var key = _loadKeys[asset];
                    _assetManager.LoadCancel(key);
                    _loadKeys.Remove(asset);
                }
                else
                {
                    Logger.ErrorFormat("no load key for asset {0}", asset);
                }
            }
        }
コード例 #2
0
 public virtual void Recycle(IUnityAssetManager assetManager)
 {
     if (UnityObject != null)
     {
         assetManager.Recycle(UnityObject);
     }
 }
コード例 #3
0
ファイル: LevelManager.cs プロジェクト: yangfan111/common
        private void ProcessUnloadRequests()
        {
            var goCount    = _cachedUnloadGoRequest.Count;
            var sceneCount = _cachedUnloadSceneRequest.Count;

            for (int i = 0; i < goCount; i++)
            {
                var go = _cachedUnloadGoRequest.Dequeue();

                if (BeforeGoUnloaded != null)
                {
                    BeforeGoUnloaded(go);
                }

                if (GoUnloaded != null)
                {
                    GoUnloaded.Invoke(go);
                }

                _assetManager.Recycle(go);

                --NotFinishedRequests;
            }

            for (int i = 0; i < sceneCount; i++)
            {
                var scene = _cachedUnloadSceneRequest.Dequeue();
                SceneManager.UnloadSceneAsync(scene);
                _logger.InfoFormat("unload scene {0}", scene);
            }
        }
コード例 #4
0
        public override void OnLoadResources(IUnityAssetManager assetManager)
        {
            base.OnLoadResources(assetManager);
            foreach (var entity in _player.GetEntities())
            {
                if (entity.hasAppearanceInterface)
                {
                    var loadRequests = entity.appearanceInterface.Appearance.GetLoadRequests();
                    foreach (var request in loadRequests)
                    {
                        var intercept = _interceptPool.Get();
                        intercept.SetParam(entity, request.GetHandler <PlayerEntity>());
                        assetManager.LoadAssetAsync(entity, request.AssetInfo, intercept.Call);
                    }

                    var recycleRequests = entity.appearanceInterface.Appearance.GetRecycleRequests();
                    foreach (var request in recycleRequests)
                    {
                        entity.RemoveAsset(request);
                        assetManager.Recycle(request);
                    }

                    entity.appearanceInterface.Appearance.ClearRequests();
                }
            }
        }
コード例 #5
0
        public override void OnLoadResources(IUnityAssetManager assetManager)
        {
            base.OnLoadResources(assetManager);
            foreach (var entity in _player.GetEntities())
            {
                if (!entity.hasAppearanceInterface)
                {
                    continue;
                }
                var loadRequests = entity.appearanceInterface.Appearance.GetLoadRequests();
                if (loadRequests.Count > 0)
                {
                    var call = _assetsAsyncCallPool.Get();
                    call.CreateCallFuncMapping(entity, loadRequests);
                    CreateAssetInfos(loadRequests);
                    assetManager.LoadAssetsAsync(entity, _assetInfos,
                                                 call.CallFunc);
                }

                var recycleRequests = entity.appearanceInterface.Appearance.GetRecycleRequests();
                foreach (var request in recycleRequests)
                {
                    entity.RemoveAsset(request);
                    assetManager.Recycle(request);
                }

                entity.appearanceInterface.Appearance.ClearRequests();
            }
        }
コード例 #6
0
 public virtual void Recycle(IUnityAssetManager assetManager)
 {
     foreach (var asset in LoadedAssets)
     {
         if (asset.Value != null)
         {
             assetManager.Recycle(asset.Value);
         }
     }
 }
コード例 #7
0
        public void AddToGameObjectPool(Object obj)
        {
            var unityObj = obj as UnityObject;

            if (unityObj == null)
            {
                unityObj = UnityObject.GetUnityObject(obj as GameObject);
            }

            _assetManager.Recycle(unityObj);
        }
コード例 #8
0
        public void Recycle(IUnityAssetManager assetManager)
        {
            foreach (var unityObject in _unityObjects.Values)
            {
                assetManager.Recycle(unityObject);
            }

            _unityObjects.Clear();
            _effects.Clear();
            _globalEffects.Clear();
        }
コード例 #9
0
        private static void ProcessOldResources(Queue <RemoveAssetStatus> resOldResource, IUnityAssetManager assetManager)
        {
            while (resOldResource.Count > 0)
            {
                var removeAssetStatus = resOldResource.Dequeue();
                var res = removeAssetStatus.Status;

                if (res.Status == EAssetLoadStatus.Loaded)
                {
                    var actions = removeAssetStatus.Actions;
                    actions.Recycle(res);
                    assetManager.Recycle(res.Object);
                }
                else if (res.Status == EAssetLoadStatus.UnInit)
                {
                    assetManager.Recycle(res.Object);
                }

                res.ReleaseReference();
            }
        }
コード例 #10
0
        public void RemoveLocalEffect(string effectName, IUnityAssetManager assetManager)
        {
            UnityObject ret;

            if (_unityObjects.TryGetValue(effectName, out ret))
            {
                _effects[effectName].Recycle();
                _unityObjects.Remove(effectName);
                _effects.Remove(effectName);

                assetManager.Recycle(ret);
            }
        }
コード例 #11
0
        public void OnLoadSucc(string source, UnityObject unityObj)
        {
#if !UnitTest
            if (Logger.IsDebugEnabled)
            {
                Logger.DebugFormat("OnLoadSucc {0}", unityObj.Address);
            }
#endif
            if (!_loadKeys.ContainsKey(unityObj.Address))
            {
                _assetManager.Recycle(unityObj);
                return;
            }
            _loadKeys.Remove(unityObj.Address);
            var go = unityObj.AsGameObject;
            _loadedGo[unityObj.Address] = unityObj;
            AppearanceUtils.EnableRender(go);
            if (null != _loadedCb)
            {
                _loadedCb(unityObj.Address, go);
            }
        }
コード例 #12
0
        public void OnGoLoadSucc(int[] para, UnityObject unityObj)
        {
            var obj = unityObj.AsGameObject;

            if (null == obj)
            {
                _logger.ErrorFormat("Asset {0}:{1} Load GameObject Fialed ", unityObj.Address.BundleName, unityObj.Address.AssetName);
                return;
            }

            if (para == null || para.Length != 2)
            {
                return;
            }

            try
            {
                EAssetType atype = (EAssetType)para[0];
                switch (atype)
                {
                case EAssetType.AUDIO:
                {
                    //Sound
                    int soundId = para[1];
                    if (!_dictSounds.ContainsKey(soundId))
                    {
                        AudioSource audio = obj.GetComponent <AudioSource>();
                        if (null != audio)
                        {
                            _dictSounds.Add(soundId, audio.clip);
                        }
                    }
                    break;
                }

                case EAssetType.EFFECT:
                {
                    //Effect
                    int effectId = para[1];
                    _effectPool.AddEffectPrefab(effectId, obj);
                    break;
                }
                }

                _assetManager.Recycle(unityObj);
            }
            catch (Exception e)
            {
                _logger.ErrorFormat(e.Message);
            }
        }
コード例 #13
0
        public void Recycle(IUnityAssetManager assetManager)
        {
            foreach (var go in _goCollection)
            {
                assetManager.Recycle(go.Value);
            }
            _goCollection.Clear();

            if (PlayerRoot != null)
            {
                ResLogger.InfoFormat("Destroy PlayerRoot {0}", PlayerRoot.name);
                // gameoobject through new when player loaded
                Object.DestroyImmediate(PlayerRoot);
                ResLogger.InfoFormat("Destroy PlayerRoot End");
            }

            PlayerRoot = null;
        }
コード例 #14
0
        private void OnLoadSucc(AssetRequestSource assetRequestSource, UnityObject u)
        {
            var obj           = u.AsGameObject;
            var isSourceExist = false;


            var comp   = GetComponent(assetRequestSource);
            var entity = GetEntity(assetRequestSource.EntityKey);

            if (comp != null)
            {
                var assetStatus = comp.Resources[assetRequestSource.ResIndex];
                if (assetStatus.LastRequestTime == assetRequestSource.TimeLine)
                {
                    isSourceExist = true;
                    var actions = GetActions(assetRequestSource.ResIndex);
                    if (obj == null)
                    {
                        actions.OnLoadFailed(entity, assetStatus);
                        assetStatus.Status = EAssetLoadStatus.Failed;
                    }
                    else
                    {
                        assetStatus.Object = u;

                        if (actions.CanInit(entity, assetStatus))
                        {
                            actions.Init(entity, assetStatus);
                            assetStatus.Status = EAssetLoadStatus.Loaded;
                        }
                        else
                        {
                            assetStatus.Status = EAssetLoadStatus.UnInit;
                        }
                    }
                }
            }

            if (!isSourceExist)
            {
                _loadRequestManager.Recycle(u);
            }
        }
コード例 #15
0
ファイル: PreLoadState.cs プロジェクト: yangfan111/common
        public void OnLoadSucc(string source, UnityObject unityObj)
        {
            SingletonManager.Get <SubProgressBlackBoard>().Step();
            _loadingCount--;

            if (unityObj.AsObject == null)
            {
                _logger.ErrorFormat("Preload asset {0} failed", unityObj.Address);
            }
            else
            {
                _assetManager.Recycle(unityObj);
            }

            if (_loadingCount <= 0)
            {
                _sessionState.FullfillExitCondition(typeof(PreLoadSystem));
            }
        }
コード例 #16
0
        private void ProcessUnloadRequests()
        {
            var goCount    = _cachedUnloadGoRequest.Count;
            var sceneCount = _cachedUnloadSceneRequest.Count;

            for (int i = 0; i < goCount; i++)
            {
                var go = _cachedUnloadGoRequest.Dequeue();

                if (BeforeGoUnloaded != null)
                {
                    BeforeGoUnloaded(go);
                }

                RemoveRequest(LevelRequestEnum.UnloadGo, go.Address.ToString());

                if (GoUnloaded != null)
                {
                    GoUnloaded.Invoke(go);
                }
                if (!SharedConfig.DisableRecycleSetramingGo)
                {
                    _assetManager.Recycle(go);
                }
                else
                {
                    UnityEngine.Object.Destroy(go);
                }

                --NotFinishedRequests;
            }

            for (int i = 0; i < sceneCount; i++)
            {
                var scene = _cachedUnloadSceneRequest.Dequeue();
                SceneManager.UnloadSceneAsync(scene);
                _logger.InfoFormat("unload scene {0}", scene);
            }
        }
コード例 #17
0
        public void OnLoadSucc(PlayerEntity player, UnityObject unityObj)
        {
            if (null == unityObj || null == unityObj.AsGameObject)
            {
                Logger.ErrorFormat("CharacterLog-- playerEntity:  {0}  unityObj is Null", player.entityKey);
            }

            GameObject go = unityObj;

            if (player.hasThirdPersonModel)
            {
                _assetManager.Recycle(player.thirdPersonModel.UnityObjectValue);
                player.RemoveAsset(player.thirdPersonModel.UnityObjectValue);
            }

            player.ReplaceThirdPersonModel(go, unityObj);

            var provider = SingletonManager.Get <HitBoxTransformProviderCache>()
                           .GetProvider(player.thirdPersonModel.Value);

            HitBoxComponentUtility.InitHitBoxComponent(player.entityKey.Value, player, provider);

            RemoveRagdollOnServerSide(go, provider.GetHitBoxColliders().Values.ToList());

            HandleLoadedModel(player, go);

            InitCharacterControllerSetting(player);

            player.AddAsset(unityObj);

            go.name = go.name.Replace("(Clone)", "");

            go.transform.SetParent(GetThirdModelParent(player.RootGo().transform));
            go.transform.localPosition = new Vector3(0, 0, 0);
            go.transform.localRotation = Quaternion.identity;
            go.transform.localScale    = Vector3.one;
            Logger.InfoFormat("CharacterLog-- P3 loaded: {0}", player.entityKey);

            BoneTool.CacheTransform(go);

            player.ReplaceBones(null, null, null);

            player.bones.Head  = BoneMount.FindChildBoneFromCache(go, BoneName.CharacterHeadBoneName);
            player.bones.Spine = BoneMount.FindChildBoneFromCache(go, BoneName.CharacterSpineName);

            player.ReplaceThirdPersonAnimator(go.GetComponent <Animator>());

            if (player.hasFsmInputRelateInterface)
            {
                player.fsmInputRelateInterface.Relate.InitLimit();
                player.fsmInputRelateInterface.Relate.CreateAllLimitFsmInput(player.thirdPersonAnimator.UnityAnimator);
            }

            var ik = go.AddComponent <PlayerIK>();

            ik.SetAnimator(AvatarIKGoal.LeftHand, player.thirdPersonAnimator.UnityAnimator);
            ik.SetIKLayer(AvatarIKGoal.LeftHand, NetworkAnimatorLayer.ThirdPersonIKPassLayer);
            ik.SetAnimator(AvatarIKGoal.RightHand, player.thirdPersonAnimator.UnityAnimator);
            ik.SetIKLayer(AvatarIKGoal.RightHand, NetworkAnimatorLayer.ThirdPersonIKPassLayer);

            if (player.isFlagSelf)
            {
                var animationEvent = go.AddComponent <AnimationClipEvent>();
                animationEvent.Player = player;
                player.animatorClip.ClipManager.SetAnimationCleanEventCallback(animationEvent
                                                                               .InterruptAnimationEventFunc);
            }
            else
            {
                go.AddComponent <ThirdPersonAnimationClipEvent>();
            }

            // 设置大厅传入的roleId和avatarId
            player.appearanceInterface.Appearance.SetRoleModelIdAndInitAvatar(player.playerInfo.RoleModelId,
                                                                              player.playerInfo.AvatarIds);

            player.characterControllerInterface.CharacterController.SetCharacterRoot(player.characterContoller.Value
                                                                                     .gameObject);
            player.appearanceInterface.Appearance.SetRootGo(player.RootGo());
            player.appearanceInterface.Appearance.SetThirdPersonCharacter(go);
            player.appearanceInterface.Appearance.SetRagDollComponent(player.ragDoll);
            player.characterControllerInterface.CharacterController.SetThirdModel(player.thirdPersonModel.Value);

            player.characterBoneInterface.CharacterBone.SetCharacterRoot(player.characterContoller.Value
                                                                         .gameObject);
            player.characterBoneInterface.CharacterBone.SetThirdPersonCharacter(go);
            ForceCrouch(player.thirdPersonAnimator.UnityAnimator);
            player.characterBoneInterface.CharacterBone.SetStableCrouchPelvisRotation();
            ForceStand(player.thirdPersonAnimator.UnityAnimator);
            player.characterBoneInterface.CharacterBone.SetStableStandPelvisRotation();

            player.appearanceInterface.Appearance.SetAnimatorP3(player.thirdPersonAnimator.UnityAnimator);

            player.appearanceInterface.Appearance.PlayerReborn();
            player.characterControllerInterface.CharacterController.PlayerReborn();
            if (player.hasStateInterface)
            {
                player.stateInterface.State.PlayerReborn();
            }
            if (player.hasPlayerInfo)
            {
                player.playerInfo.InitTransform();
            }

            player.ReplaceNetworkAnimator(
                NetworkAnimatorUtil.CreateAnimatorLayers(player.thirdPersonAnimator.UnityAnimator),
                NetworkAnimatorUtil.GetAnimatorParams(player.thirdPersonAnimator.UnityAnimator));

            player.networkAnimator.SetEntityName(player.entityKey.ToString());

            player.ReplaceOverrideNetworkAnimator();

            if (SharedConfig.IsServer)
            {
                player.ReplaceNetworkAnimatiorServerTime(0);
            }

            // 禁用非可见状态下的动画更新,在获取Stable状态之后
            if (SharedConfig.IsServer || !player.isFlagSelf)
            {
                player.thirdPersonAnimator.UnityAnimator.cullingMode = AnimatorCullingMode.CullUpdateTransforms;
            }
            else
            {
                player.thirdPersonAnimator.UnityAnimator.cullingMode = AnimatorCullingMode.AlwaysAnimate;
            }

            //人物变身、换肤时,清空特效数据
            if (player.hasEffects)
            {
                player.effects.ResetEffects();
            }

            // 处理显隐
            if (player.hasGamePlay)
            {
                PlayerEntityUtility.SetVisibility(go, player.gamePlay.Visibility);
            }
        }
コード例 #18
0
        public void OnLoadSucc(PlayerEntity player, UnityObject unityObj)
        {
            GameObject go = unityObj;

            HandleLoadedModel(player, go);

            if (player.hasFirstPersonModel)
            {
                _assetManager.Recycle(player.firstPersonModel.UnityObjectValue);
                player.RemoveAsset(player.firstPersonModel.UnityObjectValue);
            }

            player.ReplaceFirstPersonModel(go, unityObj);

            player.AddAsset(unityObj);

            player.appearanceInterface.FirstPersonAppearance =
                new FirstPersonAppearanceManager(player.firstPersonAppearance);

            go.name = "P1_" + player.entityKey;
            go.transform.SetParent(player.RootGo().transform);
            go.transform.localPosition = new Vector3(0, player.firstPersonAppearance.FirstPersonHeight,
                                                     player.firstPersonAppearance.FirstPersonForwardOffset);
            go.transform.localRotation = Quaternion.identity;
            go.transform.localScale    = Vector3.one;
            Logger.InfoFormat("P1 loaded: {0}", player.entityKey);

            player.ReplaceFirstPersonAnimator(go.GetComponent <Animator>());

            var ik = go.AddComponent <PlayerIK>();

            ik.SetAnimator(AvatarIKGoal.LeftHand, player.firstPersonAnimator.UnityAnimator);
            ik.SetIKLayer(AvatarIKGoal.LeftHand, NetworkAnimatorLayer.FirstPersonIKPassLayer);
            ik.SetAnimator(AvatarIKGoal.RightHand, player.firstPersonAnimator.UnityAnimator);
            ik.SetIKLayer(AvatarIKGoal.RightHand, NetworkAnimatorLayer.FirstPersonIKPassLayer);

            BoneTool.CacheTransform(go);

            if (player.isFlagSelf)
            {
                var animationEvent = go.AddComponent <AnimationClipEvent>();
                animationEvent.Player = player;
                player.animatorClip.ClipManager.SetAnimationCleanEventCallback(animationEvent
                                                                               .InterruptAnimationEventFunc);
            }
            else
            {
                go.AddComponent <ThirdPersonAnimationClipEvent>();
            }

            player.firstPersonAnimator.UnityAnimator.Update(0);

            player.appearanceInterface.Appearance.SetFirstPersonCharacter(go);
            player.appearanceInterface.FirstPersonAppearance.SetFirstPersonCharacter(go);

            player.appearanceInterface.Appearance.SetAnimatorP1(player.firstPersonAnimator.UnityAnimator);

            player.stateInterface.State.SetName(player.RootGo().name);

            player.characterBoneInterface.CharacterBone.SetFirstPersonCharacter(go);

            player.ReplaceFpAnimStatus(
                NetworkAnimatorUtil.CreateAnimatorLayers(player.firstPersonAnimator.UnityAnimator),
                NetworkAnimatorUtil.GetAnimatorParams(player.firstPersonAnimator.UnityAnimator));

            // 禁用非可见状态下的动画更新
            if (!player.isFlagSelf)
            {
                player.firstPersonAnimator.UnityAnimator.cullingMode = AnimatorCullingMode.CullUpdateTransforms;
            }
            else
            {
                player.firstPersonAnimator.UnityAnimator.cullingMode = AnimatorCullingMode.AlwaysAnimate;
            }
        }