using SC.XR.Unity; using System.Collections; using System.Collections.Generic; using UnityEngine; /// /// 单排扇形 /// public class SRSectorLayout : MonoBehaviour { /// /// 根据素材数量对物体进行布局组合 /// 忽略文字类型 /// /// 素材 /// 素材父物体 /// public static List CalLayout(MaterialObl materialObls, GameObject par, out MaterialObl newmaterial) { newmaterial = materialObls; BaseTemPlate text = new BaseTemPlate(); MaterialObjValue textmat = null; List noText = new List(); List objectValues = new List(); for (int i = 0; i < materialObls.materialList.Count; i++) { var mat = materialObls.materialList[i]; GameObject go = null; switch (mat.type) { case (int)MaterialType.None: break; case (int)MaterialType.Image: var pImage = ResMgr.Instance.Load("Image"); go = Instantiate(pImage, par.transform); var imageitem = go.AddComponent(); go.SetActive(true); imageitem.SetData(mat, materialObls.updateTime); noText.Add(imageitem); break; case (int)MaterialType.Video: var pVideo = ResMgr.Instance.Load("Video"); go = Instantiate(pVideo, par.transform); var videoitem = go.AddComponent(); videoitem.autoplay = materialObls.autoplay; go.SetActive(true); videoitem.SetData(mat, materialObls.updateTime); noText.Add(videoitem); break; case (int)MaterialType.Text: textmat = mat; var pText = ResMgr.Instance.Load("Text"); go = Instantiate(pText, par.transform); var textitem = go.AddComponent(); go.SetActive(true); textitem.SetData(mat, materialObls.updateTime); text = textitem; go.SetActive(false); break; default: break; } if (go != null) { go.name = string.IsNullOrWhiteSpace(mat.name) ? par.name + "-" + i.ToString() : mat.name; go.AddComponent().Type = (MaterialType)(mat.type); if (materialObls.select) { go.transform.localPosition = mat.ObjectTransform.nowPos; go.transform.localEulerAngles = mat.ObjectTransform.nowRot; go.transform.localScale = mat.ObjectTransform.nowScale; } else { go.transform.localEulerAngles = Vector3.zero; go.transform.localScale = new Vector3(1, 1, 1); if (mat.type != (int)MaterialType.Text) { go.transform.localPosition = Vector3.zero; } else { //Set text position if (mat.textPosition == "top") { go.transform.localPosition = new Vector3(0, 0.6f, 0); } else if (mat.textPosition == "bottom") { go.transform.localPosition = new Vector3(0, -0.6f, 0); } } mat.ObjectTransform.SetStartValue(go.transform.localPosition, go.transform.localEulerAngles, go.transform.localScale); } ObjectValue objectValue = new ObjectValue(i, materialObls.id, mat.name, go); objectValues.Add(objectValue); } } #region 需要判断是否是第一次编辑坐标,若是则执行下方代码,不是则直接返回 if (!materialObls.select) { var count = noText.Count; switch (count) { case 3: Column_3(noText, par); break; case 4: Column_4(noText, par); break; case 5: Column_5(noText, par); break; case 6: Column_6(noText, par); break; default: break; } //第一次排列后,需调整初始坐标和当前坐标保持一致 for (int i = 0; i < objectValues.Count; i++) { objectValues[i].InitTransform(); objectValues[i].Object.SetActive(true); var go = objectValues[i].Object; newmaterial.materialList[objectValues[i].ID].ObjectTransform.SetStartValue(go.transform.localPosition, go.transform.localEulerAngles, go.transform.localScale); } } if (textmat != null) { text.gameObject.SetActive(true); } #endregion return objectValues; } public static IEnumerator CalLayout(ModelList materialObls, GameObject par) { BaseTemPlate text = new BaseTemPlate(); ModelItem textmat = null; List noText = new List(); List objectValues = new List(); for (int i = 0; i < materialObls.materialList.Count; i++) { var mat = materialObls.materialList[i]; GameObject go = null; switch (mat.type) { case (int)MaterialType.None: break; case (int)MaterialType.Image: var pImage = ResMgr.Instance.LoadAsync("Image"); yield return pImage; go = Instantiate(pImage.asset as GameObject, par.transform); var imageitem = go.AddComponent(); go.SetActive(true); // imageitem.SetData(mat, materialObls.updateTime); noText.Add(imageitem); break; case (int)MaterialType.Video: var pVideo = ResMgr.Instance.LoadAsync("Video"); yield return pVideo; go = Instantiate(pVideo.asset as GameObject, par.transform); var videoitem = go.AddComponent(); videoitem.autoplay = materialObls.autoplay; go.SetActive(true); //videoitem.SetData(mat, materialObls.updateTime); noText.Add(videoitem); break; case (int)MaterialType.Text: textmat = mat; var pText = ResMgr.Instance.LoadAsync("Text"); yield return pText; go = Instantiate(pText.asset as GameObject, par.transform); var textitem = go.AddComponent(); go.SetActive(true); // textitem.SetData(mat, materialObls.updateTime); text = textitem; go.SetActive(false); break; default: break; } if (go != null) { go.name = string.IsNullOrWhiteSpace(mat.name) ? par.name + "-" + i.ToString() : mat.name; go.AddComponent().Type = (MaterialType)(mat.type); if (materialObls.select) { go.transform.localPosition = mat.objectTransform.nowPos; go.transform.localEulerAngles = mat.objectTransform.nowRot; go.transform.localScale = mat.objectTransform.nowScale; } else { go.transform.localEulerAngles = Vector3.zero; go.transform.localScale = new Vector3(1, 1, 1); if (mat.type != (int)MaterialType.Text) { go.transform.localPosition = Vector3.zero; } else { //Set text position if (mat.textPosition == "top") { go.transform.localPosition = new Vector3(0, 0.3f, 0); } else if (mat.textPosition == "bottom") { go.transform.localPosition = new Vector3(0, -0.3f, 0); } } mat.objectTransform.SetStartValue(go.transform.localPosition, go.transform.localEulerAngles, go.transform.localScale); } ObjectValue objectValue = new ObjectValue(i, materialObls.id, mat.name, go); objectValues.Add(objectValue); mat.prefabModel = go; // mat.initFrist(); } } #region 需要判断是否是第一次编辑坐标,若是则执行下方代码,不是则直接返回 if (!materialObls.select) { var count = noText.Count; switch (count) { case 3: Column_3(noText, par); break; case 4: Column_4(noText, par); break; case 5: Column_5(noText, par); break; default: break; } //第一次排列后,需调整初始坐标和当前坐标保持一致 for (int i = 0; i < objectValues.Count; i++) { objectValues[i].InitTransform(); objectValues[i].Object.SetActive(true); var go = objectValues[i].Object; materialObls.materialList[objectValues[i].ID].objectTransform.SetStartValue(go.transform.localPosition, go.transform.localEulerAngles, go.transform.localScale); } } if (textmat != null) { text.gameObject.SetActive(true); } #endregion } /// /// 根据数量排列图片或文字 /// /// 图片和视频列表 private static void Column_3(List data, GameObject game) { var scgrid = game.AddComponent(); scgrid.IsIgnoreInactiveObj = true; scgrid.LayoutType = LayoutTypes.Vertical; scgrid.Rows = 1; scgrid.SpaceX = 0.7f; scgrid.RefreshInfo(); Destroy(scgrid); data[0].transform.localPosition += new Vector3(0, 0, -0.18f); data[0].transform.localRotation = Quaternion.Euler(0, -30, 0); data[2].transform.localPosition += new Vector3(0, 0, -0.18f); data[2].transform.localRotation = Quaternion.Euler(0, 30, 0); } /// /// 根据数量排列图片或文字 /// /// 图片和视频列表 private static void Column_4(List data, GameObject game) { var scgrid = game.AddComponent(); scgrid.IsIgnoreInactiveObj = true; scgrid.LayoutType = LayoutTypes.Vertical; scgrid.Rows = 1; scgrid.SpaceX = 0.7f; scgrid.RefreshInfo(); Destroy(scgrid); data[0].transform.localPosition += new Vector3(0, 0, -0.35f); data[0].transform.localRotation = Quaternion.Euler(0, -45, 0); data[3].transform.localPosition += new Vector3(0, 0, -0.35f); data[3].transform.localRotation = Quaternion.Euler(0, 45, 0); } /// /// 根据数量排列图片或文字 /// /// 图片和视频列表 private static void Column_5(List data, GameObject game) { var scgrid = game.AddComponent(); scgrid.IsIgnoreInactiveObj = true; scgrid.LayoutType = LayoutTypes.Vertical; scgrid.Rows = 1; scgrid.SpaceX = 0.7f; scgrid.RefreshInfo(); Destroy(scgrid); data[0].transform.localPosition += new Vector3(0.15f, 0, -0.65f); data[0].transform.localRotation = Quaternion.Euler(0, -45, 0); data[4].transform.localPosition += new Vector3(-0.15f, 0, -0.65f); data[4].transform.localRotation = Quaternion.Euler(0, 45, 0); data[1].transform.localPosition += new Vector3(0, 0, -0.22f); data[1].transform.localRotation = Quaternion.Euler(0, -30, 0); data[3].transform.localPosition += new Vector3(0, 0, -0.22f); data[3].transform.localRotation = Quaternion.Euler(0, 30, 0); } /// /// 根据数量排列图片或文字 /// /// 图片和视频列表 private static void Column_6(List data, GameObject game) { var scgrid = game.AddComponent(); scgrid.IsIgnoreInactiveObj = true; scgrid.LayoutType = LayoutTypes.Vertical; scgrid.Rows = 1; scgrid.SpaceX = 0.7f; scgrid.RefreshInfo(); Destroy(scgrid); data[0].transform.localPosition += new Vector3(0.15f, 0, -0.65f); data[0].transform.localRotation = Quaternion.Euler(0, -45, 0); data[5].transform.localPosition += new Vector3(-0.15f, 0, -0.65f); data[5].transform.localRotation = Quaternion.Euler(0, 45, 0); data[1].transform.localPosition += new Vector3(0, 0, -0.22f); data[1].transform.localRotation = Quaternion.Euler(0, -30, 0); data[4].transform.localPosition += new Vector3(0, 0, -0.22f); data[4].transform.localRotation = Quaternion.Euler(0, 30, 0); } }