using System; using System.Collections.Generic; using UnityEngine; using YooAsset; namespace GFGGame { public class PhotographSceneManager : SingletonBase { public GameObject sceneObject; public void AddBgItem(ItemCfg itemCfg) { Transform tf = sceneObject.transform.Find("Bg/BgRes"); string resPath = ResPathUtil.GetSceneBgPath(itemCfg.res); SetSpriteRendererToTransform(tf, resPath); SpriteRenderer spr = tf.GetComponent(); spr.sortingOrder = -4000; 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(); 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); 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 (YooAssets.CheckResExist(resPath)) { DressUpUtil.AddItem(itemId, sceneObj, false, true, parentGameObj, resLayer); parentGameObj.transform.localPosition = Vector3.zero; } else { DressUpUtil.AddItem(itemId, sceneObj, false, false, parentGameObj, resLayer); GameObject gameObject = parentGameObj.transform.GetChild(0).gameObject; SetBoxCollider2DToGameObject(gameObject); } 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(); } SpriteHelper.AddSpriteTo(spr, resPath); 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 * PhotographDataManager.layerCount, "up"); } itemGameObjs.Sort((GameObject a, GameObject b) => { int layerA = PhotographUtil.Instance.GetMaxLayer(a); int layerB = PhotographUtil.Instance.GetMaxLayer(b); if (layerA < layerB) { return -1; } else if (layerA > layerB) { return 1; } return string.Compare(a.name, b.name); }); } private List SortItemGameObjsLayer(List itemGameObjs) { 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 string.Compare(a.name, b.name); }); return itemGameObjs; } //移除指定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); } } } }