|
@@ -2,6 +2,7 @@ using UnityEngine;
|
|
|
using Live2D.Cubism.Rendering;
|
|
|
using System.IO;
|
|
|
using FairyGUI;
|
|
|
+using UnityEngine.Rendering;
|
|
|
|
|
|
namespace GFGGame
|
|
|
{
|
|
@@ -16,7 +17,7 @@ namespace GFGGame
|
|
|
private const string BODY_EFFECT_OBJ_NAME = "Body_eff";
|
|
|
public const string FORMAT_SPRITE_NAME = "T{0}_s{1}";
|
|
|
private const string FORMAT_ANIMATION_NAME = "T{0}_a{1}";
|
|
|
- private const string FORMAT_EFFECT_OBJ_NAME = "T{0}_eff";
|
|
|
+ private const string FORMAT_EFFECT_OBJ_NAME = "T{0}_e{1}";
|
|
|
|
|
|
public static void AddItem(int itemID, GameObject sceneObj, bool needSetMask = false, bool showAni = true, GameObject parentObj = null, int resLayer = 0)
|
|
|
{
|
|
@@ -79,18 +80,6 @@ namespace GFGGame
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- //特效
|
|
|
- if (itemCfg.effLayer > 0)
|
|
|
- {
|
|
|
- var objName = string.Format(FORMAT_EFFECT_OBJ_NAME, itemCfg.subType);
|
|
|
- ItemTypeCfg typeCfg = ItemTypeCfgArray.Instance.GetCfg(itemCfg.subType);
|
|
|
- int sortingOrder = typeCfg.defaultLayer;
|
|
|
- if (itemCfg.effLayer == 2)
|
|
|
- {
|
|
|
- sortingOrder = typeCfg.specialLayer;
|
|
|
- }
|
|
|
- AddEffectObj(itemCfg.res, objName, parentObj, sortingOrder);
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -120,7 +109,9 @@ namespace GFGGame
|
|
|
spritObjName = string.Format(FORMAT_SPRITE_NAME, itemCfg.subType, 1);
|
|
|
TryClearSpriteObj(parentObj, spritObjName);
|
|
|
aniObjName = string.Format(FORMAT_ANIMATION_NAME, itemCfg.subType, 1);
|
|
|
- TryRemoveAnimationObj(parentObj, aniObjName);
|
|
|
+ TryRemoveObj(parentObj, aniObjName);
|
|
|
+ aniObjName = string.Format(FORMAT_EFFECT_OBJ_NAME, itemCfg.subType, 1);
|
|
|
+ TryRemoveObj(parentObj, aniObjName);
|
|
|
}
|
|
|
//特殊层
|
|
|
if (!string.IsNullOrEmpty(itemCfg.resLayer2))
|
|
@@ -128,7 +119,9 @@ namespace GFGGame
|
|
|
spritObjName = string.Format(FORMAT_SPRITE_NAME, itemCfg.subType, 2);
|
|
|
TryClearSpriteObj(parentObj, spritObjName);
|
|
|
aniObjName = string.Format(FORMAT_ANIMATION_NAME, itemCfg.subType, 2);
|
|
|
- TryRemoveAnimationObj(parentObj, aniObjName);
|
|
|
+ TryRemoveObj(parentObj, aniObjName);
|
|
|
+ aniObjName = string.Format(FORMAT_EFFECT_OBJ_NAME, itemCfg.subType, 2);
|
|
|
+ TryRemoveObj(parentObj, aniObjName);
|
|
|
}
|
|
|
//第三层
|
|
|
if (!string.IsNullOrEmpty(itemCfg.resLayer3))
|
|
@@ -136,18 +129,9 @@ namespace GFGGame
|
|
|
spritObjName = string.Format(FORMAT_SPRITE_NAME, itemCfg.subType, 3);
|
|
|
TryClearSpriteObj(parentObj, spritObjName);
|
|
|
aniObjName = string.Format(FORMAT_ANIMATION_NAME, itemCfg.subType, 3);
|
|
|
- TryRemoveAnimationObj(parentObj, aniObjName);
|
|
|
- }
|
|
|
-
|
|
|
- //特效
|
|
|
- if (itemCfg.effLayer > 0)
|
|
|
- {
|
|
|
- string effObjName = string.Format(FORMAT_EFFECT_OBJ_NAME, itemCfg.subType);
|
|
|
- var effTf = parentObj.transform.Find(effObjName);
|
|
|
- if (effTf != null)
|
|
|
- {
|
|
|
- GameObject.DestroyImmediate(effTf.gameObject);
|
|
|
- }
|
|
|
+ TryRemoveObj(parentObj, aniObjName);
|
|
|
+ aniObjName = string.Format(FORMAT_EFFECT_OBJ_NAME, itemCfg.subType, 3);
|
|
|
+ TryRemoveObj(parentObj, aniObjName);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -183,7 +167,8 @@ namespace GFGGame
|
|
|
|
|
|
//清理旧的
|
|
|
TryClearSpriteObj(parentObj, BODY_SPRITE_NAME);
|
|
|
- TryRemoveAnimationObj(parentObj, BODY_ANIMATION_NAME);
|
|
|
+ TryRemoveObj(parentObj, BODY_ANIMATION_NAME);
|
|
|
+ TryRemoveObj(parentObj, BODY_EFFECT_OBJ_NAME);
|
|
|
|
|
|
if (isAni)
|
|
|
{
|
|
@@ -194,14 +179,9 @@ namespace GFGGame
|
|
|
AddSpriteObj(res, "png", BODY_SPRITE_NAME, parentObj, 0, needSetMask);
|
|
|
}
|
|
|
//特效
|
|
|
- var tf = parentObj.transform.Find(BODY_EFFECT_OBJ_NAME);
|
|
|
- if (tf != null)
|
|
|
- {
|
|
|
- GameObject.DestroyImmediate(tf.gameObject);
|
|
|
- }
|
|
|
if (!string.IsNullOrEmpty(effRes))
|
|
|
{
|
|
|
- AddEffectObj(effRes, BODY_EFFECT_OBJ_NAME, parentObj, 0);
|
|
|
+ TryAddEffectObj(effRes, BODY_EFFECT_OBJ_NAME, parentObj, 0);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -247,42 +227,53 @@ namespace GFGGame
|
|
|
var spritObjName = string.Format(FORMAT_SPRITE_NAME, itemCfg.subType, layerId);
|
|
|
TryClearSpriteObj(parentObj, spritObjName);
|
|
|
var aniObjName = string.Format(FORMAT_ANIMATION_NAME, itemCfg.subType, layerId);
|
|
|
- TryRemoveAnimationObj(parentObj, aniObjName);
|
|
|
+ TryRemoveObj(parentObj, aniObjName);
|
|
|
string ext = ItemUtil.GetItemResExt(itemCfg.itemType, itemCfg.subType);
|
|
|
//这里需要先添加静态图,防止加载动画有延迟,出现光头
|
|
|
- GameObject gameObject = AddSpriteObj(res, ext, spritObjName, parentObj, sortingOrder, needSetMask);
|
|
|
+ GameObject spriteObj = AddSpriteObj(res, ext, spritObjName, parentObj, sortingOrder, needSetMask);
|
|
|
|
|
|
- if (itemCfg.isAni > 0 && showAni)
|
|
|
+ if (showAni)
|
|
|
{
|
|
|
- AddAnimationObj(res, aniObjName, parentObj, sortingOrder);
|
|
|
- Timers.inst.Add(0.03f, 1, (obj) =>
|
|
|
+ var aniObj = AddAnimationObj(res, aniObjName, parentObj, sortingOrder);
|
|
|
+ if(aniObj != null && spriteObj != null)
|
|
|
{
|
|
|
- if (parentObj != null && parentObj.transform != null)
|
|
|
+ Timers.inst.Add(0.03f, 1, (obj) =>
|
|
|
{
|
|
|
- Transform tf = parentObj.transform.Find(spritObjName);
|
|
|
- if (tf != null && tf.gameObject != null && tf.gameObject.activeInHierarchy)
|
|
|
+ if (parentObj != null && parentObj.transform != null)
|
|
|
{
|
|
|
- var assetDisposer = tf.gameObject.GetComponent<AssetReleaser>();
|
|
|
- if (assetDisposer != null)
|
|
|
+ Transform tf = parentObj.transform.Find(spritObjName);
|
|
|
+ if (tf != null && tf.gameObject != null && tf.gameObject.activeInHierarchy)
|
|
|
{
|
|
|
- if (!string.IsNullOrEmpty(assetDisposer.resPath))
|
|
|
+ var assetDisposer = tf.gameObject.GetComponent<AssetReleaser>();
|
|
|
+ if (assetDisposer != null)
|
|
|
{
|
|
|
- string resPath = ResPathUtil.GetDressUpPath(res, ext);
|
|
|
- if (assetDisposer.resPath == resPath)
|
|
|
+ if (!string.IsNullOrEmpty(assetDisposer.resPath))
|
|
|
{
|
|
|
- TryClearSpriteObj(parentObj, spritObjName);
|
|
|
+ string resPath = ResPathUtil.GetDressUpPath(res, ext);
|
|
|
+ if (assetDisposer.resPath == resPath)
|
|
|
+ {
|
|
|
+ TryClearSpriteObj(parentObj, spritObjName);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- });
|
|
|
+ });
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ aniObjName = string.Format(FORMAT_EFFECT_OBJ_NAME, itemCfg.subType, layerId);
|
|
|
+ TryRemoveObj(parentObj, aniObjName);
|
|
|
+ TryAddEffectObj(itemCfg.res, aniObjName, parentObj, sortingOrder);
|
|
|
}
|
|
|
|
|
|
private static GameObject AddSpriteObj(string res, string ext, string objName, GameObject parentObj, int sortingOrder, bool needSetMask)
|
|
|
{
|
|
|
string resPath = ResPathUtil.GetDressUpPath(res, ext);
|
|
|
+ if(!VEngine.Versions.Contains(resPath))
|
|
|
+ {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
SpriteRenderer spr = null;
|
|
|
var gameObj = parentObj.transform.Find(objName)?.gameObject;
|
|
|
if (gameObj == null)
|
|
@@ -355,6 +346,10 @@ namespace GFGGame
|
|
|
private static GameObject AddAnimationObj(string res, string objName, GameObject parentObj, int sortingOrder)
|
|
|
{
|
|
|
string resPath = ResPathUtil.GetDressUpAnimationPath(res);
|
|
|
+ if (!VEngine.Versions.Contains(resPath))
|
|
|
+ {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
var prefab = GFGAsset.Load<GameObject>(resPath);
|
|
|
var gameObj = GameObject.Instantiate(prefab);
|
|
|
AddAssetReleaser(gameObj, resPath);
|
|
@@ -377,7 +372,7 @@ namespace GFGGame
|
|
|
return gameObj;
|
|
|
}
|
|
|
|
|
|
- private static void TryRemoveAnimationObj(GameObject parentObj, string aniObjName)
|
|
|
+ private static void TryRemoveObj(GameObject parentObj, string aniObjName)
|
|
|
{
|
|
|
if (parentObj == null)
|
|
|
{
|
|
@@ -407,16 +402,25 @@ namespace GFGGame
|
|
|
return gameObj;
|
|
|
}
|
|
|
|
|
|
- private static GameObject AddEffectObj(string res, string objName, GameObject parentObj, int sortingOrder)
|
|
|
+ private static void TryAddEffectObj(string res, string objName, GameObject parentObj, int sortingOrder)
|
|
|
{
|
|
|
var resPath = ResPathUtil.GetDressUpEffectPath(res);
|
|
|
+ if (!VEngine.Versions.Contains(resPath))
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
GameObject effPre = GFGAsset.Load<GameObject>(resPath);
|
|
|
var gameObj = GameObject.Instantiate(effPre);
|
|
|
AddAssetReleaser(gameObj, resPath);
|
|
|
gameObj.transform.SetParent(parentObj.transform);
|
|
|
gameObj.name = objName;
|
|
|
- SetParticleSortingOrder(gameObj, sortingOrder);
|
|
|
- return gameObj;
|
|
|
+ var sortingGroup = gameObj.transform.GetComponent<SortingGroup>();
|
|
|
+ if (sortingGroup == null)
|
|
|
+ {
|
|
|
+ sortingGroup = gameObj.AddComponent<SortingGroup>();
|
|
|
+ }
|
|
|
+ sortingGroup.sortingOrder = sortingOrder + 1;//特效层默认高一个层级
|
|
|
+ //SetParticleSortingOrder(gameObj, sortingOrder + 1);//特效层默认高一个层级
|
|
|
}
|
|
|
|
|
|
public static void LoadSpritePos(string res, out float tx, out float ty)
|
|
@@ -441,6 +445,7 @@ namespace GFGGame
|
|
|
|
|
|
public static void SetParticleSortingOrder(GameObject gameObj, int sortingOrder, bool isAdd = false)
|
|
|
{
|
|
|
+
|
|
|
ParticleSystem[] particles = gameObj.transform.GetComponentsInChildren<ParticleSystem>();
|
|
|
for (int i = 0; i < particles.Length; i++)
|
|
|
{
|