예제 #1
0
        //----- method -----

        public void Initialize(string decryptKey)
        {
            #if ENABLE_CRIWARE_ADX || ENABLE_CRIWARE_SOFDEC
            // CRIの管理GameObject名にリネーム.
            gameObject.transform.name = CriWareManageObjectName;

            // CriAtomServer → CriAtomの順で初期化しないとCriAtomにCriAtomServerを生成されてしまう.
            CriAtomServer.CreateInstance();

            if (Initializer == null)
            {
                // Acfを管理する為自動初期化を無効化.
                var source            = initializerPrefab.Source;
                var initializerSource = UnityUtility.GetComponent <CriWareInitializer>(source);
                initializerSource.dontInitializeOnAwake = true;

                // 生成.
                Initializer = initializerPrefab.Instantiate <CriWareInitializer>();
                Initializer.transform.name = "Initializer";

                //========================================================
                // ライブラリ初期化(この処理完了後にCRIが有効化される).
                //========================================================

                // 手動管理する為無効化.
                Initializer.dontDestroyOnLoad = false;

                // ※ ADX2-LEは自動で暗号化処理が掛かるのでdecrypterConfig自体が存在しない.

                #if !ENABLE_CRIWARE_ADX_LE
                // 認証キー.
                Initializer.decrypterConfig.key = decryptKey;
                #endif

                // ファイルハンドルの使用数を節約する為、ファイルアクセスが行われるタイミングでのみハンドルを利用するよう変更.
                // ※ 逐次オープンとなるためファイルアクセスの性能は低下する.
                Initializer.fileSystemConfig.numberOfBinders             = 65535;
                Initializer.fileSystemConfig.minimizeFileDescriptorUsage = true;

                // 同時インストール可能数を設定.
                Initializer.fileSystemConfig.numberOfInstallers = 65535;

                // 初期化実行.
                Initializer.Initialize();
            }

            if (ErrorHandler == null)
            {
                var errorHandlerObject = UnityUtility.CreateEmptyGameObject(gameObject, "ErrorHandler");

                UnityUtility.SetActive(errorHandlerObject, false);

                // Awakeが実行されないように非アクティブでAddComponent.
                ErrorHandler = errorHandlerObject.AddComponent <CriWareErrorHandler>();
                ErrorHandler.dontDestroyOnLoad = false;

                UnityUtility.SetActive(errorHandlerObject, true);
            }

            if (!CriWareInitializer.IsInitialized())
            {
                Initializer.Initialize();
            }

            #if ENABLE_CRIWARE_FILESYSTEM
            // CriFsServerはライブラリの初期化後に生成.
            CriFsServer.CreateInstance();
            #endif

            // CriAtomはライブラリの初期化後に生成.
            var criAtom = gameObject.AddComponent <CriAtom>();

            // CriAtomのSetupが隠蔽されているので手動で初期化する.
            criAtom.acfFile = Initializer.atomConfig.acfFileName;

            if (!string.IsNullOrEmpty(criAtom.acfFile))
            {
                var acfPath = PathUtility.Combine(global::CriWare.streamingAssetsPath, criAtom.acfFile);

                acfPath += CriAssetDefinition.AcfExtension;

                CriAtomEx.RegisterAcf(null, acfPath);
            }
            #endif
        }
예제 #2
0
        private IEnumerator UpdateContentsInternal(bool keepScrollPosition)
        {
            var scrollPosition = ScrollPosition;

            if (itemSize == -1)
            {
                var rt = UnityUtility.GetComponent <RectTransform>(itemPrefab);
                itemSize = direction == Direction.Vertical ? rt.rect.height : rt.rect.width;
            }

            //----- Contentのサイズ設定 -----

            scrollRect.content.anchorMin = direction == Direction.Vertical ? new Vector2(0f, 0.5f) : new Vector2(0.5f, 0f);
            scrollRect.content.anchorMax = direction == Direction.Vertical ? new Vector2(1f, 0.5f) : new Vector2(0.5f, 1f);
            scrollRect.content.pivot     = new Vector2(0.5f, 0.5f);

            var delta = scrollRectTransform.rect.size;

            switch (scrollType)
            {
            case ScrollType.Loop:
            {
                scrollRect.movementType = ScrollRect.MovementType.Unrestricted;

                // ※ UIScrollViewのautoScrollDisableに引っかからないように領域を拡張.

                if (direction == Direction.Vertical)
                {
                    delta.x  = 0f;
                    delta.y += 1f;
                }
                else
                {
                    delta.y  = 0f;
                    delta.x += 1f;
                }

                scrollRect.content.sizeDelta = delta;
            }
            break;

            case ScrollType.Limited:
            {
                if (scrollRect.movementType == ScrollRect.MovementType.Unrestricted)
                {
                    scrollRect.movementType = ScrollRect.MovementType.Elastic;
                }

                var sizeDelta = Mathf.Abs(edgeSpacing) * 2 + itemSize * Contents.Count + itemSpacing * (Contents.Count - 1);

                if (direction == Direction.Vertical)
                {
                    var scrollHeight = scrollRectTransform.rect.height;
                    delta.x = 0f;
                    delta.y = sizeDelta < scrollHeight ? scrollHeight : sizeDelta;
                }
                else
                {
                    var scrollWidth = scrollRectTransform.rect.width;
                    delta.x = sizeDelta < scrollWidth ? scrollWidth : sizeDelta;
                    delta.y = 0f;
                }

                scrollRect.content.sizeDelta = delta;
            }
            break;
            }

            //----- ヒットボックス初期化 -----

            SetupHitBox();

            //----- 足りない分を生成 -----

            var requireCount = GetRequireCount();

            var createCount = requireCount - itemList.Count;

            if (0 < createCount)
            {
                var addItems = UnityUtility.Instantiate <VirtualScrollItem <T> >(scrollRect.content.gameObject, itemPrefab, createCount).ToArray();

                itemList.AddRange(addItems);

                // 全アイテム非アクティブ化.
                addItems.ForEach(x => UnityUtility.SetActive(x, false));

                // 生成したインスタンス初期化.

                var initializeObservers = new IObservable <Unit> [addItems.Length];

                for (var i = 0; i < addItems.Length; i++)
                {
                    var item = addItems[i];

                    initializeObservers[i] = Observable.Defer(() => Observable.FromMicroCoroutine(() => InitializeItem(item)));
                }

                var initializeYield = initializeObservers.WhenAll().ToYieldInstruction(false);

                while (!initializeYield.IsDone)
                {
                    yield return(null);
                }

                if (initializeYield.HasError)
                {
                    Debug.LogException(initializeYield.Error);
                }
            }

            // 要素数が少ない時はスクロールを無効化.
            scrollRect.enabled = ScrollEnable();

            var scrollbar = direction == Direction.Vertical ? scrollRect.verticalScrollbar : scrollRect.horizontalScrollbar;

            if (scrollbar != null)
            {
                UnityUtility.SetActive(scrollbar.gameObject, ScrollEnable());
            }

            var updateObservers = new IObservable <Unit> [itemList.Count];

            // 配置初期位置(中央揃え想定なのでItemSize * 0.5f分ずらす).
            var basePosition = direction == Direction.Vertical ?
                               scrollRect.content.rect.height * 0.5f - itemSize * 0.5f - edgeSpacing :
                               -scrollRect.content.rect.width * 0.5f + itemSize * 0.5f + edgeSpacing;

            // 位置、情報を更新.
            for (var i = 0; i < itemList.Count; i++)
            {
                var index = i;
                var item  = itemList[i];

                var offset = itemSize * i;

                offset += 0 < i ? itemSpacing * i : 0;

                item.RectTransform.anchoredPosition = direction == Direction.Vertical ?
                                                      new Vector2(0, basePosition - offset) :
                                                      new Vector2(basePosition + offset, 0);

                updateObservers[i] = Observable.Defer(() => UpdateItem(item, index));
            }

            //----- リストアイテム更新 -----

            var updateItemYield = updateObservers.WhenAll().ToYieldInstruction(false);

            while (!updateItemYield.IsDone)
            {
                yield return(null);
            }

            if (updateItemYield.HasError)
            {
                Debug.LogException(updateItemYield.Error);
            }

            //----- スクロール位置設定 -----

            if (keepScrollPosition)
            {
                ScrollPosition = scrollPosition;
            }
            else
            {
                ScrollToItem(0, ScrollTo.First);
            }

            //----- 並べ替え -----

            UpdateSibling();

            //-----  更新イベント -----

            OnUpdateContents();

            if (onUpdateContents != null)
            {
                onUpdateContents.OnNext(Unit.Default);
            }
        }
예제 #3
0
        private DynValue CommandFunction(string identifier, string fileIdentifier, Vector2?size, int?priority = null,
                                         float duration = 0, string easingType = null, bool wait = true)
        {
            var returnValue = DynValue.Nil;

            try
            {
                var advEngine = AdvEngine.Instance;

                var advSprite = advEngine.ObjectManager.Create <AdvSprite>(identifier);

                var fileName = advEngine.Resource.FindFileName <AdvSprite>(fileIdentifier);

                if (advSprite != null)
                {
                    advSprite.SetPriority(priority.HasValue ? priority.Value : 0);

                    var width  = size.HasValue ? (float?)size.Value.x : null;
                    var height = size.HasValue ? (float?)size.Value.y : null;

                    advSprite.Show(fileName, width, height);
                }

                var canvasGroup = UnityUtility.GetComponent <CanvasGroup>(advSprite);

                if (canvasGroup != null)
                {
                    if (duration != 0)
                    {
                        TweenCallback onComplete = () =>
                        {
                            if (wait)
                            {
                                advEngine.Resume();
                            }
                        };

                        var ease = EnumExtensions.FindByName(easingType, Ease.Linear);

                        canvasGroup.alpha = 0f;

                        var tweener = canvasGroup.DOFade(1f, duration)
                                      .SetEase(ease)
                                      .OnComplete(onComplete);

                        advEngine.SetTweenTimeScale(tweener);

                        returnValue = wait ? YieldWait : DynValue.Nil;
                    }
                    else
                    {
                        canvasGroup.alpha = 1f;
                    }
                }
            }
            catch (Exception e)
            {
                Debug.LogException(e);
            }

            return(returnValue);
        }
예제 #4
0
        //----- property -----

        //----- method -----

        void Awake()
        {
            animator = UnityUtility.GetComponent <Animator>(gameObject);
        }
 private ParticleSystemRenderer GetParticleSystemRenderer()
 {
     return(particleSystemRenderer ?? (particleSystemRenderer = UnityUtility.GetComponent <ParticleSystemRenderer>(gameObject)));
 }
예제 #6
0
        private IEnumerator UpdateContentsInternal()
        {
            if (itemSize == -1)
            {
                var rt = UnityUtility.GetComponent <RectTransform>(itemPrefab);
                itemSize = direction == Direction.Vertical ? rt.rect.height : rt.rect.width;
            }

            // Contentのサイズ設定.
            scrollRect.content.anchorMin = direction == Direction.Vertical ? new Vector2(0f, 0.5f) : new Vector2(0.5f, 0f);
            scrollRect.content.anchorMax = direction == Direction.Vertical ? new Vector2(1f, 0.5f) : new Vector2(0.5f, 1f);
            scrollRect.content.pivot     = new Vector2(0.5f, 0.5f);

            // Hitboxは全域使用.
            if (hitBox != null)
            {
                hitBox.anchorMin = new Vector2(0f, 0f);
                hitBox.anchorMax = new Vector2(1f, 1f);
                hitBox.pivot     = new Vector2(0.5f, 0.5f);
            }

            switch (scrollType)
            {
            case ScrollType.Loop:
            {
                scrollRect.movementType = ScrollRect.MovementType.Unrestricted;

                var delta = scrollRectTransform.rect.size;

                if (direction == Direction.Vertical)
                {
                    delta.x = 0;
                }
                else
                {
                    delta.y = 0f;
                }

                scrollRect.content.sizeDelta = delta;
            }
            break;

            case ScrollType.Limited:
            {
                if (scrollRect.movementType == ScrollRect.MovementType.Unrestricted)
                {
                    scrollRect.movementType = ScrollRect.MovementType.Elastic;
                }

                var delta = scrollRect.content.sizeDelta;

                var sizeDelta = Mathf.Abs(edgeSpacing) * 2 + itemSize * Contents.Length + itemSpacing * (Contents.Length - 1);

                if (direction == Direction.Vertical)
                {
                    var scrollHeight = scrollRectTransform.rect.height;
                    delta.y = sizeDelta < scrollHeight ? scrollHeight : sizeDelta;
                }
                else
                {
                    var scrollWidth = scrollRectTransform.rect.width;
                    delta.x = sizeDelta < scrollWidth ? scrollWidth : sizeDelta;
                }

                scrollRect.content.sizeDelta = delta;
            }
            break;
            }

            var requireCount = GetRequireCount();

            // 配置初期位置(中央揃え想定なのでItemSize * 0.5f分ずらす).
            var basePosition = direction == Direction.Vertical ?
                               scrollRect.content.rect.height * 0.5f - itemSize * 0.5f - edgeSpacing :
                               -scrollRect.content.rect.width * 0.5f + itemSize * 0.5f + edgeSpacing;

            // 足りない分を生成.
            var createCount = requireCount - itemList.Count;
            var addItems    = UnityUtility.Instantiate <VirtualScrollItem <T> >(scrollRect.content.gameObject, itemPrefab, createCount, false);

            itemList.AddRange(addItems);

            // 先に登録して非アクティブ化.
            foreach (var item in addItems)
            {
                UnityUtility.SetActive(item, false);
            }

            // 生成したインスタンス初期化.
            foreach (var item in addItems)
            {
                UnityUtility.SetActive(item, true);

                if (onCreateItem != null)
                {
                    onCreateItem.OnNext(item.gameObject);
                }

                yield return(item.Initialize().ToYieldInstruction());

                UnityUtility.SetActive(item, false);
            }

            // 要素数が少ない時はスクロールを無効化.
            scrollRect.enabled = ScrollEnable();

            var scrollbar = direction == Direction.Vertical ? scrollRect.verticalScrollbar : scrollRect.horizontalScrollbar;

            if (scrollbar != null)
            {
                UnityUtility.SetActive(scrollbar.gameObject, ScrollEnable());
            }

            // 位置、情報を更新.
            for (var i = 0; i < itemList.Count; i++)
            {
                var item = itemList[i];

                var offset = itemSize * i;

                offset += 0 < i ? itemSpacing * i : 0;

                item.RectTransform.anchoredPosition = direction == Direction.Vertical ?
                                                      new Vector2(0, basePosition - offset) :
                                                      new Vector2(basePosition + offset, 0);

                UpdateItem(item, i);
            }

            // 並べ替え.
            UpdateSibling();

            // スクロール初期位置設定.
            CenterToItem(0);
        }
        //----- field -----

        //----- property -----

        //----- method -----

        protected static void ModifyParticleSystemComponent(GameObject rootObject)
        {
            var particleSystems = rootObject.DescendantsAndSelf().OfComponent <ParticleSystem>();

            foreach (var particleSystem in particleSystems)
            {
                if (!CheckModifyTarget(particleSystem))
                {
                    continue;
                }

                var particleSystemRenderer = particleSystem.GetComponent <ParticleSystemRenderer>();

                //------ ShapeModule ------

                var shapeModule = particleSystem.shape;

                if (shapeModule.enabled)
                {
                    if (shapeModule.shapeType != ParticleSystemShapeType.Mesh)
                    {
                        shapeModule.mesh = null;
                    }

                    if (shapeModule.shapeType != ParticleSystemShapeType.MeshRenderer)
                    {
                        shapeModule.meshRenderer = null;
                    }

                    if (shapeModule.shapeType != ParticleSystemShapeType.SkinnedMeshRenderer)
                    {
                        shapeModule.skinnedMeshRenderer = null;
                    }

                    if (shapeModule.shapeType != ParticleSystemShapeType.Sprite)
                    {
                        shapeModule.sprite = null;
                    }

                    if (shapeModule.shapeType != ParticleSystemShapeType.SpriteRenderer)
                    {
                        shapeModule.spriteRenderer = null;
                    }
                }
                else
                {
                    shapeModule.mesh                = null;
                    shapeModule.meshRenderer        = null;
                    shapeModule.skinnedMeshRenderer = null;
                    shapeModule.sprite              = null;
                    shapeModule.spriteRenderer      = null;
                    shapeModule.texture             = null;
                }

                //------ CollisionModule ------

                var collisionModule = particleSystem.collision;

                if (!collisionModule.enabled || collisionModule.type != ParticleSystemCollisionType.Planes)
                {
                    for (var i = 0; i < collisionModule.maxPlaneCount; i++)
                    {
                        collisionModule.SetPlane(i, null);
                    }
                }

                //------ TriggerModule ------

                var triggerModule = particleSystem.trigger;

                if (!triggerModule.enabled)
                {
                    for (var i = 0; i < triggerModule.maxColliderCount; i++)
                    {
                        triggerModule.SetCollider(i, null);
                    }
                }

                //------ TextureSheetAnimationModule ------

                var textureSheetAnimationModule = particleSystem.textureSheetAnimation;

                if (!textureSheetAnimationModule.enabled || textureSheetAnimationModule.mode != ParticleSystemAnimationMode.Sprites)
                {
                    for (var i = 0; i < textureSheetAnimationModule.spriteCount; i++)
                    {
                        textureSheetAnimationModule.RemoveSprite(i);
                    }
                }

                //------ LightsModule ------

                var lightsModule = particleSystem.lights;

                if (!lightsModule.enabled)
                {
                    lightsModule.light = null;
                }

                //------ TrailModule ------

                if (!particleSystem.trails.enabled)
                {
                    particleSystemRenderer.trailMaterial = null;
                }

                //------ Renderer ------

                var uiParticleSystem = UnityUtility.GetComponent <UIParticleSystem>(particleSystem.gameObject);

                if (uiParticleSystem == null && !particleSystemRenderer.enabled)
                {
                    particleSystemRenderer.sharedMaterials = new Material[0];
                }

                EditorUtility.SetDirty(particleSystem);
            }
        }
        private static bool CheckModifyTarget(ParticleSystem particleSystem)
        {
            var particleSystemRenderer = particleSystem.GetComponent <ParticleSystemRenderer>();

            //------ ShapeModule ------

            var shapeModule = particleSystem.shape;

            if (shapeModule.enabled)
            {
                if (shapeModule.shapeType != ParticleSystemShapeType.Mesh && shapeModule.mesh != null)
                {
                    return(true);
                }
                if (shapeModule.shapeType != ParticleSystemShapeType.MeshRenderer && shapeModule.meshRenderer != null)
                {
                    return(true);
                }
                if (shapeModule.shapeType != ParticleSystemShapeType.SkinnedMeshRenderer && shapeModule.skinnedMeshRenderer != null)
                {
                    return(true);
                }
                if (shapeModule.shapeType != ParticleSystemShapeType.Sprite && shapeModule.sprite != null)
                {
                    return(true);
                }
                if (shapeModule.shapeType != ParticleSystemShapeType.SpriteRenderer && shapeModule.spriteRenderer != null)
                {
                    return(true);
                }
            }
            else
            {
                if (shapeModule.mesh != null)
                {
                    return(true);
                }
                if (shapeModule.meshRenderer != null)
                {
                    return(true);
                }
                if (shapeModule.skinnedMeshRenderer != null)
                {
                    return(true);
                }
                if (shapeModule.sprite != null)
                {
                    return(true);
                }
                if (shapeModule.spriteRenderer != null)
                {
                    return(true);
                }
                if (shapeModule.texture != null)
                {
                    return(true);
                }
            }

            //------ CollisionModule ------

            var collisionModule = particleSystem.collision;

            if (!collisionModule.enabled || collisionModule.type != ParticleSystemCollisionType.Planes)
            {
                for (var i = 0; i < collisionModule.maxPlaneCount; i++)
                {
                    var plane = collisionModule.GetPlane(i);

                    if (plane != null)
                    {
                        return(true);
                    }
                }
            }

            //------ TriggerModule ------

            var triggerModule = particleSystem.trigger;

            if (!triggerModule.enabled)
            {
                for (var i = 0; i < triggerModule.maxColliderCount; i++)
                {
                    var collider = triggerModule.GetCollider(i);

                    if (collider != null)
                    {
                        return(true);
                    }
                }
            }

            //------ TextureSheetAnimationModule ------

            var textureSheetAnimationModule = particleSystem.textureSheetAnimation;

            if (!textureSheetAnimationModule.enabled || textureSheetAnimationModule.mode != ParticleSystemAnimationMode.Sprites)
            {
                for (var i = 0; i < textureSheetAnimationModule.spriteCount; i++)
                {
                    var sprite = textureSheetAnimationModule.GetSprite(i);

                    if (sprite != null)
                    {
                        return(true);
                    }
                }
            }

            //------ LightsModule ------

            if (!particleSystem.lights.enabled && particleSystem.lights.light != null)
            {
                return(true);
            }

            //------ TrailModule ------

            if (!particleSystem.trails.enabled && particleSystemRenderer.trailMaterial != null)
            {
                return(true);
            }

            //------ Renderer ------

            var uiParticleSystem = UnityUtility.GetComponent <UIParticleSystem>(particleSystem.gameObject);

            if (uiParticleSystem == null)
            {
                if (!particleSystemRenderer.enabled && particleSystemRenderer.sharedMaterials.Any(x => x != null))
                {
                    return(true);
                }
            }

            return(false);
        }