using System; using System.Collections.Generic; using UnityEngine; namespace GFGGame { public class PhotographSceneManager : SingletonBase { public GameObject sceneObject; public void AddBgItem(ItemCfg itemCfg) { Transform tf = sceneObject.transform.Find("Bg/BgRes"); string resPath = ResPathUtil.GetDressUpPath(itemCfg.res, ItemUtil.GetItemResExt(itemCfg.itemType, itemCfg.subType)); SetSpriteRendererToTransform(tf, resPath); SpriteRenderer spr = tf.GetComponent(); spr.sortingOrder = -200; SetBoxCollider2DToGameObject(tf.gameObject); } public void AddBorderItem(ItemCfg itemCfg) { Transform tf = sceneObject.transform.Find("Border/BorderRes"); string resPath = ResPathUtil.GetPhotographBorderPath(itemCfg.res, ItemUtil.GetItemResExt(itemCfg.itemType, itemCfg.subType)); SetSpriteRendererToTransform(tf, resPath); SpriteRenderer spr = tf.GetComponent(); spr.sortingOrder = 10000;//边框在所有道具的上边 SetBoxCollider2DToGameObject(tf.gameObject); } public void AddNpcItem(ItemCfg itemCfg) { Transform tf = sceneObject.transform.Find("Scene/Npc/NpcRes"); string resPath = ResPathUtil.GetNpcPicFPath(itemCfg.res); SetSpriteRendererToTransform(tf, resPath); SpriteRenderer spr = tf.GetComponent(); tf.localPosition = new Vector2(-spr.bounds.center.x, -spr.bounds.center.y); SetBoxCollider2DToGameObject(tf.gameObject); AddItemGameObjectToList(tf.parent.gameObject, true); } public void AddBodyItem() { GameObject bodyParent = sceneObject.transform.Find("Scene/Role").gameObject; UpdatePhotographBody(sceneObject, bodyParent); AddItemGameObjectToList(bodyParent, false); } public void AddSceneItem(GameObject parentGameObj, ItemCfg itemCfg, int layer, bool setLayer, bool isOnlyEff = false) { AddItemToScene(sceneObject, parentGameObj, itemCfg.id, layer); string layerName = string.Format("resLayer{0}", layer); string value = typeof(ItemCfg).GetField(layerName).GetValue(itemCfg).ToString(); // string res = value == "n" ? itemCfg.res : string.Format("{0}_{1}", itemCfg.res, value); string res = DressUpUtil.GetDressUpItemLayerRes(itemCfg, layer); string resPath = ResPathUtil.GetDressUpPath(res); var effPath = ResPathUtil.GetDressUpEffectPath(itemCfg.res); if (!VEngine.Versions.Contains(resPath) && VEngine.Versions.Contains(effPath)) { AddOnlyEffItemToScene(sceneObject, parentGameObj, itemCfg.id, layer); } AddItemGameObjectToList(parentGameObj, setLayer); } //拍照场景添加单个道具 public void AddItemToScene(GameObject sceneObj, GameObject parentGameObj, int itemId, int resLayer) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); parentGameObj.transform.SetParent(sceneObj.transform.Find("Scene"), false); DressUpUtil.AddItem(itemId, sceneObj, false, false, parentGameObj, resLayer); GameObject gameObject = parentGameObj.transform.GetChild(0).gameObject; SetBoxCollider2DToGameObject(gameObject); string layerName = string.Format("resLayer{0}", resLayer); string value = typeof(ItemCfg).GetField(layerName).GetValue(itemCfg).ToString(); string res = value == "n" ? itemCfg.res : string.Format("{0}_{1}", itemCfg.res, value); string resPath = ResPathUtil.GetDressUpAnimationPath(res); if (VEngine.Versions.Contains(resPath)) { gameObject.GetComponent().enabled = false; DressUpUtil.AddItem(itemId, sceneObj, false, true, gameObject, resLayer); gameObject.transform.GetChild(0).localPosition = gameObject.transform.GetChild(0).localPosition - gameObject.transform.localPosition; } PhotographUtil.Instance.SetGameObjectCenter(parentGameObj); } private void AddOnlyEffItemToScene(GameObject sceneObj, GameObject parentGameObj, int itemId, int resLayer) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); parentGameObj.transform.SetParent(sceneObj.transform.Find("Scene"), false); GameObject gameObject = new GameObject(itemCfg.id.ToString()); gameObject.transform.SetParent(parentGameObj.transform); string res = DressUpUtil.GetDressUpItemLayerRes(itemCfg, resLayer); string resPath = ResPathUtil.GetDressUpPath(res); SetSpriteRendererToTransform(gameObject.transform, resPath); SetBoxCollider2DToGameObject(gameObject); gameObject.GetComponent().enabled = false; DressUpUtil.AddItem(itemId, sceneObj, false, true, parentGameObj, resLayer); PhotographUtil.Instance.SetGameObjectCenter(parentGameObj); } //拍照角色 private void UpdatePhotographBody(GameObject sceneObj, GameObject parentObj) { PhotographDataManager.Instance.dressUpObj.setSceneObj(sceneObj, false, false, parentObj, false); PhotographDataManager.Instance.dressUpObj.PutOnDressUpData(MyDressUpHelper.dressUpObj.DressUpDataClone()); for (int i = 0; i < parentObj.transform.childCount; i++) { Transform transform = parentObj.transform.GetChild(i); if (transform.name != DressUpUtil.BODY_ANIMATION_NAME) { SetBoxCollider2DToGameObject(transform.gameObject); } } PhotographUtil.Instance.SetGameObjectCenter(parentObj); } //向Transform添加SpriteRenderer并设置资源 private void SetSpriteRendererToTransform(Transform tf, string resPath) { tf.position = Vector3.zero; SpriteRenderer spr = tf.GetComponent(); if (spr == null) { tf.gameObject.AddComponent(); spr = tf.GetComponent(); } DressUpUtil.ChangeAssetReleaser(tf.gameObject, resPath); Sprite sp = GFGAsset.Load(resPath); if (sp == null) return; spr.sprite = sp; spr.size = spr.sprite.bounds.size;//将节点设置为原图大小 } //向GameObject添加BoxCollider2D private void SetBoxCollider2DToGameObject(GameObject gameObject) { BoxCollider2D polygonCollider2D = gameObject.GetComponent(); if (polygonCollider2D != null) { GameObject.Destroy(polygonCollider2D); } polygonCollider2D = gameObject.AddComponent(); polygonCollider2D.isTrigger = true; } private void AddItemGameObjectToList(GameObject parentGameObj, bool setLayer) { List itemGameObjs = PhotographDataManager.Instance.itemGameObjs; itemGameObjs.Add(parentGameObj); if (setLayer) { int index = itemGameObjs.Count - 1; PhotographUtil.Instance.ChangeLayer(itemGameObjs[index], index * 300, "up"); } itemGameObjs.Sort((GameObject a, GameObject b) => { int layerA = PhotographUtil.Instance.GetMinLayer(a); int layerB = PhotographUtil.Instance.GetMinLayer(b); if (layerA < layerB) { return -1; } else if (layerA > layerB) { return 1; } return 0; }); } //移除指定GameObject的BoxCollider2D public void DeleteBoxCollider2DFromGameObject(GameObject gameObject) { BoxCollider2D polygonCollider2D = gameObject.GetComponent(); if (polygonCollider2D != null) { GameObject.Destroy(polygonCollider2D); } } //移除指定GameObject的SpriteRenderer public void DeleteSpriteRendererFromGameObject(GameObject gameObject) { SpriteRenderer spriteRenderer = gameObject.GetComponent(); if (spriteRenderer != null) { GameObject.Destroy(spriteRenderer); } } } }