using UnityEngine; using System.Collections; using System; using UnityEditor; namespace GFGGame { public class SceneController { public static void UpdateLoginScene(GameObject sceneObj) { //背景 Transform tf = sceneObj.transform.Find("Bg"); SpriteRenderer spr = tf.GetComponent(); var resPath = ResPathUtil.GetDressUpPath("jhsy_bg", "jpg"); Sprite sp = GFGAsset.Load(resPath); DressUpUtil.AddAssetReleaser(tf.gameObject, resPath); spr.sprite = sp; //角色 DressUpUtil.UpdateBody("ui_loginrole", sceneObj, true, null); } public static void UpdateMainScene(GameObject sceneObj) { //背景 Transform tf = sceneObj.transform.Find("Bg"); SpriteRenderer spr = tf.GetComponent(); var resPath = ResPathUtil.GetDressUpPath("zjm_bg1", "jpg"); Sprite sp = GFGAsset.Load(resPath); DressUpUtil.AddAssetReleaser(tf.gameObject, resPath); spr.sprite = sp; //角色 CustomSuitData suitSavedData = CustomSuitDataManager.GetCurrentSuitList(); int[] equipDatas = suitSavedData.equipDatas; UpdateRole(equipDatas, sceneObj, false); if (suitSavedData.pic > 0 && suitSavedData.suitId > 0) { SuitCfg suitCfg = SuitCfgArray.Instance.GetCfg(suitSavedData.suitId); DressUpUtil.UpdateBody(suitCfg.picRes, sceneObj, !string.IsNullOrEmpty(suitCfg.aniRes), suitCfg.effRes); } else { DressUpUtil.UpdateBody(null, sceneObj); } } public static void UpdateRole(int[] equipDatas, GameObject sceneObj, bool needSetMask = false, int[] exceptTypes = null, bool showAni = true, GameObject parentObj = null) { Reset(sceneObj); int count = equipDatas.Length; for (int i = 0; i < count; i++) { int id = (int)equipDatas[i]; if (exceptTypes != null) { int subType = ItemUtil.GetItemSubType(id); if (Array.IndexOf(exceptTypes, subType) >= 0) { continue; } } DressUpUtil.AddItem(id, sceneObj, needSetMask, showAni, parentObj); } DressUpUtil.UpdateBody(null, sceneObj, false, null, needSetMask, parentObj); } public static void UpdateDialogBg(string value, GameObject sceneObj) { Transform tf = sceneObj.transform.Find("Bg"); SpriteRenderer spr = tf.GetComponent(); if (value == "0") { spr.sprite = null; } else { var resPath = ResPathUtil.GetDressUpPath(value, "jpg"); Sprite sp = GFGAsset.Load(resPath); DressUpUtil.AddAssetReleaser(tf.gameObject, resPath); spr.sprite = sp; } } public static void UpdateDialogPic(string value, GameObject sceneObj) { Transform tf = sceneObj.transform.Find("Pic"); SpriteRenderer spr = tf.GetComponent(); if (value == "0") { spr.sprite = null; } else { void UpdateDialogPicAlpha(object param) { Color c = spr.color; if (spr.enabled && c.a < 1f) { c.a += 0.05f; spr.color = c; } else { FairyGUI.Timers.inst.Remove(UpdateDialogPicAlpha); } } var resPath = ResPathUtil.GetNpcPicSPath(value); Sprite sp = GFGAsset.Load(resPath); DressUpUtil.AddAssetReleaser(tf.gameObject, resPath); spr.sprite = sp; Color c = spr.color; c.a = 0f; spr.color = c; FairyGUI.Timers.inst.AddUpdate(UpdateDialogPicAlpha); } } public static void UpdateFightTarget(string value, GameObject sceneObj) { Transform tf = sceneObj.transform.Find("Npc"); SpriteRenderer spr = tf.GetComponent(); var resPath = ResPathUtil.GetNpcPicFPath(value); Sprite sp = GFGAsset.Load(resPath); DressUpUtil.AddAssetReleaser(tf.gameObject, resPath); spr.sprite = sp; } private static void Reset(GameObject sceneObj) { //背景层次 Transform bg = sceneObj.transform.Find("Bg"); if (bg != null) { SpriteRenderer spr = bg.GetComponent(); if (spr != null) { ItemTypeCfg typeCfg = ItemTypeCfgArray.Instance.GetCfg(ConstDressUpItemType.BEI_JING); spr.sortingOrder = typeCfg.defaultLayer; } } //角色清理 Transform role = sceneObj.transform.Find("Role"); if (role != null) { int childCount = role.childCount; for (int i = childCount - 1; i >= 0; --i) { Transform child = role.GetChild(i); if (child.gameObject.name != "Body") { GameObject.DestroyImmediate(child.gameObject); } } } } public static void UpdatePhotographBgOrNpcOrBorder(GameObject sceneObj, EnumPhotographType type, int itemId, int maxlayer, out int maxLayer) { maxLayer = maxlayer; string objName = ""; ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); var resPath = ""; ResPathUtil.GetDressUpPath(itemCfg.res, ItemUtil.GetItemResExt(itemCfg.itemType, itemCfg.subType)); if (type == EnumPhotographType.BG) { objName = "Bg/BgRes"; resPath = ResPathUtil.GetDressUpPath(itemCfg.res, ItemUtil.GetItemResExt(itemCfg.itemType, itemCfg.subType)); } else if (type == EnumPhotographType.NPC) { objName = "Scene/Npc/NpcRes"; resPath = ResPathUtil.GetNpcPicFPath(itemCfg.res); } else if (type == EnumPhotographType.BORDER) { objName = "Border/BorderRes"; resPath = ResPathUtil.GetDressUpPath(itemCfg.res, ItemUtil.GetItemResExt(itemCfg.itemType, itemCfg.subType)); } Transform tf = sceneObj.transform.Find(objName); 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); spr.sprite = sp; spr.size = spr.sprite.bounds.size;//将节点设置为原图大小 if (type == EnumPhotographType.BG) { ItemTypeCfg typeCfg = ItemTypeCfgArray.Instance.GetCfg(ConstDressUpItemType.BEI_JING); spr.sortingOrder = typeCfg.defaultLayer; } if (type == EnumPhotographType.NPC) { maxlayer++; maxLayer = maxlayer; spr.sortingOrder = maxLayer; } if (type != EnumPhotographType.BORDER)//边框不加碰撞盒 { PhotographAddCollider(tf.gameObject); } } //添加碰撞盒 public static void PhotographAddCollider(GameObject gameObject) { BoxCollider2D polygonCollider2D = gameObject.GetComponent(); if (polygonCollider2D != null) { GameObject.Destroy(polygonCollider2D); } polygonCollider2D = gameObject.AddComponent(); polygonCollider2D.isTrigger = true; } //场景添加单个道具 public static void AddScene(GameObject sceneObj, int itemId, int index, int resLayer = int.MinValue) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); //普通层 if (itemCfg.resLayer1 > 0) { var parentGameObj = new GameObject(string.Format("{0}_{1}_{2}", itemId, index, itemCfg.resLayer1)); parentGameObj.transform.SetParent(sceneObj.transform.Find("Scene"), false); DressUpUtil.AddItem(itemId, sceneObj, false, false, parentGameObj, itemCfg.resLayer1, resLayer); SceneController.PhotographAddCollider(parentGameObj.transform.GetChild(0).gameObject); } //特殊层 if (itemCfg.resLayer2 > 0) { var parentGameObj = new GameObject(string.Format("{0}_{1}_{2}", itemId, index, itemCfg.resLayer2)); parentGameObj.transform.SetParent(sceneObj.transform.Find("Scene"), false); DressUpUtil.AddItem(itemId, sceneObj, false, false, parentGameObj, itemCfg.resLayer2, resLayer); SceneController.PhotographAddCollider(parentGameObj.transform.GetChild(0).gameObject); } } //传入父物体,根据所有子物体大小计算父物体边框大小 public static Vector2 GetGameObjectSize(GameObject parentObj) { Vector2 size = Vector2.one; for (int i = 0; i < parentObj.transform.childCount; i++) { GameObject childGameObj = parentObj.transform.GetChild(i).gameObject; BoxCollider2D boxCollider2D = childGameObj.GetComponent(); if (boxCollider2D != null) { return boxCollider2D.size * childGameObj.transform.localScale * parentObj.transform.localScale * 100; } } return Vector2.zero; } //设置物体中心点 public static void SetGameObjectCenter(GameObject parentObj) { Transform parent = parentObj.transform; Vector3 postion = parent.position; Quaternion rotation = parent.rotation; Vector3 scale = parent.localScale; parent.position = Vector3.zero; parent.rotation = Quaternion.Euler(Vector3.zero); parent.localScale = Vector3.one; Vector3 center = Vector3.zero; Renderer[] renders = parent.GetComponentsInChildren(); foreach (Renderer child in renders) { center += child.bounds.center; } center /= parent.GetComponentsInChildren().Length; Bounds bounds = new Bounds(center, Vector3.zero); foreach (Renderer child in renders) { bounds.Encapsulate(child.bounds); } parent.position = postion; parent.rotation = rotation; parent.localScale = scale; foreach (Transform t in parent) { t.position = t.position - bounds.center; } parent.transform.position = bounds.center + parent.position; } //输入变换前后的向量,返回旋转角度 public static float GetRotationAngle(Vector3 lastRotation, Vector3 curRotation) { float angle = Vector3.Angle(lastRotation, curRotation); //求出两向量之间的夹角 Vector3 normal = Vector3.Cross(lastRotation, curRotation);//叉乘求出法线向量 angle *= Mathf.Sign(Vector3.Dot(normal, Vector3.forward)); //Mathf.Sign()求符号,Vector3.Dot()求方向,求法线向量与物体上方向向量点乘,结果为1或-1,修正旋转方向 return angle; } public static GameObject GetFirstHitObj(RaycastHit2D[] hit2Ds) { int layer = int.MinValue; GameObject gameObject = null; for (int i = 0; i < hit2Ds.Length; i++) { SpriteRenderer spr = hit2Ds[i].collider.gameObject.GetComponent(); if (spr && spr.sortingOrder > layer) { gameObject = hit2Ds[i].collider.gameObject; layer = spr.sortingOrder; } } return gameObject; } } }