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(); }
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); } }
/// <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(); } } } }
/// <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(); }
/// <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(); }
private void SetImageAlpha(NewImageEffect effect) { GameObject go = GetSpriteByDepth(effect.depth); // 初始alpha go.GetComponent <MaskableGraphic>().color = new Color(1, 1, 1, effect.state.spriteAlpha); }
/// <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; }
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; } }
/// <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(); }
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(); }
private void DeleteTransLayer(GameObject trans, NewImageEffect effect) { Destroy(trans); if (transList.ContainsKey(effect.depth)) { transList.Remove(effect.depth); } }
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); }
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; }
private IEnumerator Gray(NewImageEffect effect, Action callback) { //设置shader UI2DSprite ui = GetSpriteByDepth(effect.depth); ui.shader = Shader.Find("Custom/Gray"); yield return(null); callback(); }
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(); }
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(); }
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; }
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); }
//异步特效递归 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); })); } }
/// <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); }
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(); }
//同步特效递归 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); } }
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(); }
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(); }
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(); }
/// <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(); }
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(); }
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(); }
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(); }
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(); }