| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 | using System;using System.Collections.Generic;using System.Threading.Tasks;using UnityEngine;using YooAsset;namespace GFGGame{    public class PhotographSceneManager : SingletonBase<PhotographSceneManager>    {        public GameObject sceneObject;        public async void AddBgItem(ItemCfg itemCfg)        {            Transform tf = sceneObject.transform.Find("Bg/BgRes");            string resPath = ResPathUtil.GetSceneBgPath(itemCfg.res);            await LoadManager.Instance.CheckResExsitedOrDownload(resPath);            SetSpriteRendererToTransform(tf, resPath);            SpriteRenderer spr = tf.GetComponent<SpriteRenderer>();            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<SpriteRenderer>();            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<SpriteRenderer>();            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 async Task AddSceneItem(GameObject parentGameObj, ItemCfg itemCfg, int layer, bool setLayer, bool isOnlyEff = false)        {            await 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 async Task 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);            var handler = DressUpUtil.AddItemAsync(itemId, sceneObj, false, true, parentGameObj, resLayer);            if (handler != null)            {                foreach (var t in handler)                {                    await t.Task;                }                foreach (var t in handler)                {                    t.UpdateView();                    t.Release();                }            }            if (YooAssets.CheckResExist(resPath))            {                parentGameObj.transform.localPosition = Vector3.zero;            }            else            {                if (parentGameObj.transform.childCount > 0)                {                    GameObject gameObject = parentGameObj.transform.GetChild(0).gameObject;                    SetBoxCollider2DToGameObject(gameObject);                }            }            await PhotographUtil.Instance.SetGameObjectCenter(parentGameObj);        }        //拍照角色        private void UpdatePhotographBody(GameObject sceneObj, GameObject parentObj)        {            PhotographDataManager.Instance.dressUpObj.setSceneObj(sceneObj, false, false, parentObj, false, async ()=>             {                SetRoleBoxCollider(parentObj);            });            PhotographDataManager.Instance.dressUpObj.PutOnDressUpData(MyDressUpHelper.dressUpObj.DressUpDataClone());        }        private async void SetRoleBoxCollider(GameObject parentObj)        {            for (int i = 0; i < parentObj.transform.childCount; i++)            {                Transform transform = parentObj.transform.GetChild(i);                if (transform.gameObject.GetComponent<SpriteRenderer>() != null)                {                    SetBoxCollider2DToGameObject(transform.gameObject);                }            }            await PhotographUtil.Instance.SetGameObjectCenter(parentObj);        }        //向Transform添加SpriteRenderer并设置资源        private void SetSpriteRendererToTransform(Transform tf, string resPath)        {            tf.position = Vector3.zero;            SpriteRenderer spr = tf.GetComponent<SpriteRenderer>();            if (spr == null)            {                tf.gameObject.AddComponent<SpriteRenderer>();                spr = tf.GetComponent<SpriteRenderer>();            }            SpriteHelper.AddSpriteTo(spr, resPath);            spr.size = spr.sprite.bounds.size;//将节点设置为原图大小        }        //向GameObject添加BoxCollider2D        private void SetBoxCollider2DToGameObject(GameObject gameObject)        {            BoxCollider2D polygonCollider2D = gameObject.GetComponent<BoxCollider2D>();            if (polygonCollider2D != null)            {                GameObject.Destroy(polygonCollider2D);            }            polygonCollider2D = gameObject.AddComponent<BoxCollider2D>();            polygonCollider2D.isTrigger = true;        }        private void AddItemGameObjectToList(GameObject parentGameObj, bool setLayer)        {            List<GameObject> 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<GameObject> SortItemGameObjsLayer(List<GameObject> 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<BoxCollider2D>();            if (polygonCollider2D != null)            {                GameObject.Destroy(polygonCollider2D);            }        }        //移除指定GameObject的SpriteRenderer        public void DeleteSpriteRendererFromGameObject(GameObject gameObject)        {            SpriteRenderer spriteRenderer = gameObject.GetComponent<SpriteRenderer>();            if (spriteRenderer != null)            {                GameObject.Destroy(spriteRenderer);            }        }    }}
 |