예제 #1
0
        private IEnumerator Circle(NewImageEffect effect, Action callback)
        {
            GameObject      origin       = GetSpriteByDepth(effect.depth);
            GameObject      trans        = GetTransByDepth(effect.depth);
            MaskableGraphic originSprite = origin.GetComponent <MaskableGraphic>();
            MaskableGraphic transSprite  = trans.GetComponent <MaskableGraphic>();

            //设置shader
            transSprite.material = Resources.Load("Material/CircleHole") as Material;
            //ui.material = new Material(Shader.Find("Custom/CircleHole"));
            Debug.Log(effect.ToString());
            //Texture2D te = LoadBackground(effect.state.spriteName).texture;
            Texture2D te = LoadImage(GetFullPath(effect)).texture;

            transSprite.material.SetTexture("_NewTex", te);
            //正反向
            transSprite.material.SetInt("inverse", effect.inverse ? 1 : 0);
            //效果
            float t = 0;

            while (t < 1)
            {
                t = Mathf.MoveTowards(t, 1, 1 / effect.time * Time.deltaTime);
                transSprite.material.SetFloat("currentT", t);
                yield return(null);
            }
            DeleteTransLayer(trans, effect);
            callback();
        }
예제 #2
0
    private void ImageSet(NewImageEffect effect, bool isSprite, bool isAlpha, bool isPos)
    {
        //决定操作对象
        UI2DSprite ui = bgSprite;

        if (effect.target == NewImageEffect.ImageType.Fore)
        {
            ui = GetSpriteByDepth(effect.depth);
        }
        ui.shader = Shader.Find("Unity/Transparent Colored");
        if (isSprite)
        {
            ui.sprite2D = LoadBackground(effect.state.spriteName);
            if (effect.target == NewImageEffect.ImageType.Fore)
            {
                ui.sprite2D = LoadCharacter(effect.state.spriteName);
                ui.MakePixelPerfect();
            }
        }
        if (isAlpha)
        {
            ui.alpha = effect.state.spriteAlpha;
        }
        if (isPos)
        {
            ui.transform.localPosition = string.IsNullOrEmpty(effect.defaultpos) ? effect.state.GetPosition() : SetDefaultPos(ui, effect.defaultpos);
        }
    }
예제 #3
0
        /// <summary>
        /// 移除某一层
        /// </summary>
        /// <param name="depth">层编号</param>
        private void RemoveSpriteByDepth(NewImageEffect effect)
        {
            GameObject go = GetSpriteByDepth(effect.depth);

            if (go != null)
            {
                if (effect.delete)
                {
                    // 完全删除
                    DestroyImmediate(go);
                }
                else
                {
                    // 仅将image source删除
                    Image im = go.GetComponent <Image>();
                    if (im != null)
                    {
                        im.sprite = null;
                    }
                    VideoSprite vs = go.GetComponent <VideoSprite>();
                    if (vs != null)
                    {
                        vs.ClearClip();
                    }
                }
            }
        }
예제 #4
0
    /// <summary>
    /// 单一渐变背景图
    /// </summary>
    /// <param name="effect">特效</param>
    /// <param name="callback">回调</param>
    //private IEnumerator TransBackGround(NewImageEffect effect, Action callback)
    //{
    //    UI2DSprite ui = bgSprite;
    //    UI2DSprite trans = backTransSprite;
    //    //将trans淡出同时淡入原ui
    //    float t = 0;
    //    float origin = trans.alpha;
    //    float final = 0;
    //    Debug.Log(effect.time);
    //    while (t < 1)
    //    {
    //        t = Mathf.MoveTowards(t, 1, 1 / effect.time * Time.deltaTime);
    //        trans.alpha = origin + t * (final - origin);
    //        ui.alpha = t;
    //        yield return null;
    //    }
    //    if (transList.ContainsKey(-1)) transList.Remove(-1);
    //    callback();
    //}

    /// <summary>
    /// 单一渐变图层(-1为背景层)
    /// </summary>
    /// <param name="effect">特效</param>
    /// <param name="callback">回调</param>
    private IEnumerator TransByDepth(NewImageEffect effect, Action callback)
    {
        UI2DSprite ui    = GetSpriteByDepth(effect.depth);
        UI2DSprite trans = GetTransByDepth(effect.depth);
        //将trans淡出同时淡入原ui
        float t      = 0;
        float origin = trans.alpha;
        float final  = 0;

        while (t < 1)
        {
            t           = Mathf.MoveTowards(t, 1, 1 / effect.time * Time.deltaTime);
            trans.alpha = origin + t * (final - origin);
            ui.alpha    = t;
            yield return(null);
        }
        //删除trans
        if (effect.depth != -1)
        {
            GameObject.Destroy(trans.gameObject);
        }
        if (transList.ContainsKey(effect.depth))
        {
            transList.Remove(effect.depth);
        }

        callback();
    }
예제 #5
0
        /// <summary>
        /// 单一渐变图层(-1为背景层)
        /// </summary>
        /// <param name="effect">特效</param>
        /// <param name="callback">回调</param>
        private IEnumerator TransByDepth(NewImageEffect effect, Action callback)
        {
            GameObject origin = GetSpriteByDepth(effect.depth);
            GameObject trans  = GetTransByDepth(effect.depth);
            bool       flag1  = origin != null;
            bool       flag2  = trans != null;
            //将trans淡出同时淡入原ui
            float t = 0;

            while (t < 1)
            {
                t = Mathf.MoveTowards(t, 1, 1 / effect.time * Time.deltaTime);
                if (flag1)
                {
                    //originSprite.color = new Color(1, 1, 1, Mathf.Lerp(0, 1, t));
                    origin.GetComponent <CanvasGroup>().alpha = Mathf.Lerp(0, 1, t);
                }
                if (flag2)
                {
                    //transSprite.color = new Color(1, 1, 1, Mathf.Lerp(1, 0, t));
                    trans.GetComponent <CanvasGroup>().alpha = Mathf.Lerp(1, 0, t);
                }
                yield return(null);
            }
            //删除trans
            DeleteTransLayer(trans, effect);
            callback();
        }
예제 #6
0
        private void SetImageAlpha(NewImageEffect effect)
        {
            GameObject go = GetSpriteByDepth(effect.depth);

            // 初始alpha
            go.GetComponent <MaskableGraphic>().color = new Color(1, 1, 1, effect.state.spriteAlpha);
        }
예제 #7
0
        /// <summary>
        /// 新建图片
        /// </summary>
        /// <param name="effect"></param>
        private void SetImage(NewImageEffect effect)
        {
            // 获取图层 不存在则从模板新建
            GameObject go = GetSpriteByDepth(effect.depth);

            if (go == null)
            {
                go = NewSpriteLayer(effect);
            }
            // 判断是否需要替换
            VideoSprite vs = go.GetComponent <VideoSprite>();
            Image       im = go.GetComponent <Image>();

            if (effect.movie)
            {
                if (vs == null)
                {
                    go = RenewSpriteLayer(effect);
                }
                // 是动态 RawImage
                go.GetComponent <VideoSprite>().LoadClip(effect.state.spriteName);
            }
            else
            {
                if (im == null)
                {
                    go = RenewSpriteLayer(effect);
                }
                // 静态图层
                go.GetComponent <Image>().sprite = LoadImage(GetFullPath(effect));
                go.GetComponent <Image>().SetNativeSize();
            }
            // 材质
            go.GetComponent <MaskableGraphic>().material = null;
        }
예제 #8
0
        private void RunEffect(NewImageEffect effect, Action callback)
        {
            switch (effect.effectmode)
            {
            case NewImageEffect.EffectMode.Blur:
                StartCoroutine(Blur(effect, true, callback));
                break;

            case NewImageEffect.EffectMode.Mask:
                StartCoroutine(Mask(effect, callback));
                break;

            case NewImageEffect.EffectMode.Mosaic:
                StartCoroutine(Mosaic(effect, callback));
                break;

            case NewImageEffect.EffectMode.Gray:
                StartCoroutine(Gray(effect, callback));
                break;

            case NewImageEffect.EffectMode.OldPhoto:
                StartCoroutine(OldPhoto(effect, callback));
                break;
            }
        }
예제 #9
0
        /// <summary>
        /// 通用渐变
        /// </summary>
        private IEnumerator Universial(NewImageEffect effect, Action callback)
        {
            GameObject      origin       = GetSpriteByDepth(effect.depth);
            GameObject      trans        = GetTransByDepth(effect.depth);
            MaskableGraphic originSprite = origin.GetComponent <MaskableGraphic>();
            MaskableGraphic transSprite  = trans.GetComponent <MaskableGraphic>();

            //设置shader
            transSprite.material = Resources.Load("Material/Mask") as Material;
            //Texture2D te = LoadBackground(effect.state.spriteName).texture;
            Texture2D te = LoadImage(GetFullPath(effect)).texture;

            transSprite.material.SetTexture("_NewTex", te);
            Texture2D mk = LoadImage("Rule/" + effect.maskImage).texture;

            transSprite.material.SetTexture("_MaskTex", mk);
            //效果
            float t = 0;

            while (t < 1)
            {
                t = Mathf.MoveTowards(t, 1, 1 / effect.time * Time.deltaTime);
                transSprite.material.SetFloat("currentT", t);
                yield return(null);
            }
            DeleteTransLayer(trans, effect);
            callback();
        }
예제 #10
0
    private IEnumerator FadeAll(NewImageEffect effect, Action callback, bool includeBack, bool includeDiabox)
    {
        Dictionary <int, float> originAlpha = new Dictionary <int, float>();

        foreach (int i in GetDepthNum())
        {
            UI2DSprite ui = GetSpriteByDepth(i);
            originAlpha[i] = ui.alpha;
        }
        if (includeBack)
        {
            originAlpha[-1] = bgSprite.alpha;
        }
        if (includeDiabox)
        {
            duiManager.Close(effect.time, () => { });
            //originAlpha[-2] = duiManager.mainContainer.GetComponent<UIWidget>().alpha;
            //duiManager.clickContainer.SetActive(false);
        }
        float t     = 0;
        float final = effect.state.spriteAlpha;

        while (t < 1)
        {
            t = Mathf.MoveTowards(t, 1, 1 / effect.time * Time.deltaTime);
            if (includeDiabox)
            {
                //float origin = originAlpha[-2];
                //float alpha = origin + t * (final - origin);

                //duiManager.mainContainer.GetComponent<UIWidget>().alpha = alpha;
            }
            foreach (int i in GetDepthNum())
            {
                UI2DSprite ui     = GetSpriteByDepth(i);
                float      origin = originAlpha[i];
                float      alpha  = origin + t * (final - origin);
                ui.GetComponent <UIRect>().alpha = alpha;
            }
            if (includeBack)
            {
                float origin = originAlpha[-1];
                float alpha  = origin + t * (final - origin);
                bgSprite.GetComponent <UIRect>().alpha = alpha;
            }
            yield return(null);
        }
        //删除
        foreach (int i in GetDepthNum())
        {
            RemoveSpriteByDepth(i);
        }
        if (includeBack)
        {
            bgSprite.sprite2D = null;
        }
        //if (includeDiabox)duiManager.mainContainer.SetActive(false);
        callback();
    }
예제 #11
0
 private void DeleteTransLayer(GameObject trans, NewImageEffect effect)
 {
     Destroy(trans);
     if (transList.ContainsKey(effect.depth))
     {
         transList.Remove(effect.depth);
     }
 }
예제 #12
0
        private void TweenMove(NewImageEffect effect)
        {
            GameObject ui = GetSpriteByDepth(effect.depth);

            ui.GetComponent <SpriteTweener>().Move(effect);
            //ui.transform.DOLocalMove(effect.state.GetPosition(), effect.time)
            //    .SetEase(Ease.Linear);
        }
예제 #13
0
        private void SetImagePos(NewImageEffect effect)
        {
            GameObject go  = GetSpriteByDepth(effect.depth);
            Vector3    pos = string.IsNullOrEmpty(effect.defaultpos) ?
                             effect.state.GetPosition() : SetDefaultPos(go, effect.defaultpos);

            //go.GetComponent<RectTransform>().anchoredPosition = pos;
            go.transform.localPosition = pos;
        }
예제 #14
0
    private IEnumerator Gray(NewImageEffect effect, Action callback)
    {
        //设置shader
        UI2DSprite ui = GetSpriteByDepth(effect.depth);

        ui.shader = Shader.Find("Custom/Gray");
        yield return(null);

        callback();
    }
예제 #15
0
        private IEnumerator OldPhoto(NewImageEffect effect, Action callback)
        {
            //设置shader
            MaskableGraphic ui = GetSpriteByDepth(effect.depth).GetComponent <MaskableGraphic>();

            ui.material = Resources.Load("Material/OldPhoto") as Material;
            yield return(null);

            callback();
        }
예제 #16
0
        private IEnumerator FadeAll(NewImageEffect effect, Action callback, bool includeBack, bool includeDiabox)
        {
            Dictionary <int, float> originAlpha = new Dictionary <int, float>();

            foreach (int i in GetDepthNum())
            {
                if (i >= 0 || includeBack)
                {
                    MaskableGraphic ui = GetSpriteByDepth(i).GetComponent <MaskableGraphic>();
                    originAlpha[i] = ui.color.a;
                }
            }
            if (includeDiabox)
            {
                duiManager.Close(effect.time, () => { });
                originAlpha[-2] = duiManager.mainContainer.GetComponent <CanvasGroup>().alpha;
                duiManager.clickContainer.SetActive(false);
            }
            float t     = 0;
            float final = effect.state.spriteAlpha;

            while (t < 1)
            {
                t = Mathf.MoveTowards(t, 1, 1 / effect.time * Time.deltaTime);
                if (includeDiabox)
                {
                    float origin = originAlpha[-2];
                    float alpha  = Mathf.Lerp(origin, final, t);
                    duiManager.mainContainer.GetComponent <CanvasGroup>().alpha = alpha;
                }
                foreach (int i in GetDepthNum())
                {
                    if (i >= 0 || includeBack)
                    {
                        float alpha = Mathf.Lerp(originAlpha[i], final, t);
                        GetSpriteByDepth(i).GetComponent <MaskableGraphic>().color = new Color(1, 1, 1, alpha);
                    }
                }
                yield return(null);
            }
            //删除
            foreach (int i in GetDepthNum())
            {
                DestroyImmediate(GetSpriteByDepth(-1));
            }
            if (includeBack)
            {
                //Destroy(GetSpriteByDepth(-1));
                DestroyImmediate(GetSpriteByDepth(-1));
                //GetSpriteByDepth(-1).GetComponent<Image>().sprite = null;
            }
            //if (includeDiabox)duiManager.mainContainer.SetActive(false);
            callback();
        }
예제 #17
0
        private void SetLive2dModel(NewImageEffect effect)
        {
            GameObject go = NewLive2dObject(effect.depth);

            go.GetComponent <Live2dModel>().depth = effect.depth;
            go.GetComponent <Live2dModel>().LoadModel(effect.state.spriteName, l2dPanel);
            //go.GetComponent<Live2dModel>().LoadModelWithCamera(effect.state.spriteName);
            RawImage ui = go.GetComponent <RawImage>();

            ui.material = null;
        }
예제 #18
0
        private GameObject RenewSpriteLayer(NewImageEffect effect)
        {
            GameObject go    = GetSpriteByDepth(effect.depth);
            int        sbi   = go.transform.GetSiblingIndex();
            float      alpha = go.GetComponent <CanvasGroup>().alpha;

            DestroyImmediate(go);
            go = NewSpriteLayer(effect);
            go.transform.SetSiblingIndex(sbi);
            go.GetComponent <CanvasGroup>().alpha = alpha;
            return(go);
        }
예제 #19
0
 //异步特效递归
 private void RunEffectsAsyn(Queue <NewImageEffect> effectQueue, Action callback)
 {
     //Debug.Log(effectQueue.Count);
     if (effectQueue.Count == 0 || effectQueue.Peek() == null)
     {
         callback();
     }
     else
     {
         NewImageEffect effect = effectQueue.Dequeue();
         GameObject.Find("GameManager").GetComponent <ImageManager>().RunEffect(effect, new Action(() => { RunEffectsAsyn(effectQueue, callback); }));
     }
 }
예제 #20
0
        /// <summary>
        /// 新建图层
        /// </summary>
        /// <param name="effect"></param>
        /// <param name="recovered">是否需要复原</param>
        private GameObject NewSpriteLayer(NewImageEffect effect)
        {
            int depth = effect.depth;
            // 直接新建视频模板或者图片
            string     prefab = effect.movie ? "Prefab/Video_Sprite" : "Prefab/Sprite";
            GameObject go     = Resources.Load(prefab) as GameObject;

            go = Instantiate(go);
            go.transform.SetParent(depth < 0 ? bgPanel.transform : fgPanel.transform, false);
            go.transform.name = "sprite" + depth;
            go.transform.SetAsFirstSibling();
            return(go);
        }
예제 #21
0
    private IEnumerator WinShake(NewImageEffect effect, Action callback)
    {
        float shakeDelta = effect.v;
        float t          = 0;

        while (t < 1)
        {
            t            = Mathf.MoveTowards(t, 1, 1 / effect.time * Time.deltaTime);
            mianCam.rect = new Rect(shakeDelta * (-1.0f + 2.0f * UnityEngine.Random.value), shakeDelta * (-1.0f + 2.0f * UnityEngine.Random.value), 1.0f, 1.0f);
            yield return(null);
        }
        mianCam.rect = new Rect(0f, 0f, 1.0f, 1.0f);
        callback();
    }
예제 #22
0
 //同步特效递归
 private void RunEffectsSyn(Queue <NewImageEffect> effectQueue, Action callback)
 {
     if (effectQueue.Count == 2)
     {
         //Debug.Log("Syn End");
         RunEffectsAsyn(effectQueue, callback);
     }
     else
     {
         NewImageEffect effect = effectQueue.Dequeue();
         GameObject.Find("GameManager").GetComponent <ImageManager>().RunEffect(effect, new Action(() => { }));
         RunEffectsSyn(effectQueue, callback);
     }
 }
예제 #23
0
    private IEnumerator Move(UI2DSprite ui, NewImageEffect effect, Action callback)
    {
        float   t      = 0;
        Vector3 origin = ui.transform.localPosition;
        Vector3 final  = effect.state.GetPosition();

        while (t < 1)
        {
            t = Mathf.MoveTowards(t, 1, 1 / effect.time * Time.fixedDeltaTime);
            ui.transform.localPosition = origin + t * (final - origin);
            yield return(null);
        }
        callback();
    }
예제 #24
0
    private IEnumerator Fade(UI2DSprite ui, NewImageEffect effect, Action callback)
    {
        float t      = 0;
        float origin = ui.alpha;
        //1 - effect.state.spriteAlpha;
        float final = effect.state.spriteAlpha;

        while (t < 1)
        {
            t        = Mathf.MoveTowards(t, 1, 1 / effect.time * Time.fixedDeltaTime);
            ui.alpha = origin + t * (final - origin);
            yield return(null);
        }
        callback();
    }
예제 #25
0
        private IEnumerator Rotate(NewImageEffect effect, Action callback)
        {
            GameObject ui     = GetSpriteByDepth(effect.depth);
            Quaternion origin = ui.transform.localRotation;
            Quaternion final  = Quaternion.Euler(effect.angle);
            float      t      = 0;

            while (t < 1)
            {
                t = Mathf.MoveTowards(t, 1, 1 / effect.time * Time.deltaTime);
                ui.transform.localRotation = Quaternion.Lerp(origin, final, t);
                yield return(null);
            }
            callback();
        }
예제 #26
0
        /// <summary>
        /// 渐变预处理
        /// </summary>
        /// <param name="effect"></param>
        /// <param name="callback"></param>
        private IEnumerator PreTransByDepth(NewImageEffect effect, Action callback)
        {
            //向待渐变TransList添加
            if (transList.ContainsKey(effect.depth))
            {
                string msg = string.Format("发现未完成的渐变,已替换图层{0}的渐变", effect.depth);
                Debug.LogWarning(msg);
                transList[effect.depth] = effect;
            }
            else
            {
                transList.Add(effect.depth, effect);
            }
            GameObject origin = GetSpriteByDepth(effect.depth);

            if (origin == null)
            {
                // 没有原图的时候
                Debug.LogWarning("未发现精灵,depth: " + effect.depth);
                // 创建隐藏的原图层用于后面展示
                origin = NewSpriteLayer(effect);
                origin.GetComponent <CanvasGroup>().alpha = 0;
                origin.transform.SetAsFirstSibling();
            }
            else
            {
                GameObject trans = GetTransByDepth(effect.depth);
                if (trans == null)
                {
                    Debug.Log("将原图复制成trans");
                    //复制一层变成Trans
                    trans = Instantiate(origin.gameObject) as GameObject;
                    trans.transform.SetParent(origin.transform.parent, false);
                    trans.transform.localPosition = origin.transform.localPosition;
                    trans.transform.localScale    = origin.transform.localScale;
                    trans.transform.name          = "trans" + effect.depth;
                }
                // 渐变层遮挡
                trans.transform.SetAsLastSibling();
                // 原图隐藏
                origin.GetComponent <CanvasGroup>().alpha = 0;
                origin.transform.SetAsFirstSibling();
            }

            yield return(null);

            callback();
        }
예제 #27
0
    private IEnumerator Fade(NewImageEffect effect, Action callback)
    {
        UI2DSprite ui = GetSpriteByDepth(effect.depth);
        //ui.shader = Shader.Find("Unity/Transparent Colored");
        float origin = ui.alpha;
        float final  = effect.state.spriteAlpha;

        float t = 0;

        while (t < 1)
        {
            t        = Mathf.MoveTowards(t, 1, 1 / effect.time * Time.deltaTime);
            ui.alpha = origin + t * (final - origin);
            yield return(null);
        }
        callback();
    }
예제 #28
0
        private IEnumerator Fade(NewImageEffect effect, Action callback)
        {
            GameObject go = GetSpriteByDepth(effect.depth);

            MaskableGraphic ui     = go.GetComponent <MaskableGraphic>();
            float           origin = ui.color.a;
            float           final  = effect.state.spriteAlpha;

            float t = 0;

            while (t < 1)
            {
                t        = Mathf.MoveTowards(t, 1, 1 / effect.time * Time.deltaTime);
                ui.color = new Color(1, 1, 1, Mathf.Lerp(origin, final, t));
                yield return(null);
            }
            callback();
        }
예제 #29
0
    private IEnumerator FadeAll(NewImageEffect effect, Action callback, bool includeBack, bool includeDiabox)
    {
        float t      = 0;
        float origin = 1 - effect.state.spriteAlpha;
        float final  = effect.state.spriteAlpha;

        if (includeDiabox)
        {
            dUiManager.clickContainer.SetActive(false);
        }
        while (t < 1)
        {
            t = Mathf.MoveTowards(t, 1, 1 / effect.time * Time.fixedDeltaTime);
            float alpha = origin + t * (final - origin);
            foreach (int i in GetDepthNum())
            {
                UI2DSprite ui = GetSpriteByDepth(i);
                ui.GetComponent <UIRect>().alpha = alpha;
            }
            if (includeBack)
            {
                bgSprite.alpha = alpha;
            }
            if (includeDiabox)
            {
                dUiManager.mainContainer.GetComponent <UIWidget>().alpha = alpha;
            }
            yield return(null);
        }
        //删除
        foreach (int i in GetDepthNum())
        {
            RemoveSpriteByDepth(i);
        }
        if (includeBack)
        {
            bgSprite.sprite2D = null;
        }
        if (includeDiabox)
        {
            dUiManager.mainContainer.SetActive(false);
        }
        callback();
    }
예제 #30
0
    private IEnumerator Blur(NewImageEffect effect, bool isBlur, Action callback)
    {
        //设置shader
        UI2DSprite ui = GetSpriteByDepth(effect.depth);

        ui.shader = Shader.Find("Custom/Blur");
        //效果
        float t = 0;

        while (t < 1)
        {
            t = Mathf.MoveTowards(t, 1, 1 / 0.1f * Time.deltaTime);
            float value = isBlur ? t * 0.005f : (1 - t) * 0.005f;
            //Debug.Log(value);
            Shader.SetGlobalFloat("uvOffset", value);
            yield return(null);
        }
        callback();
    }