/// <summary> /// 异步加载一个部位 /// </summary> /// <param name="path"></param> /// <param name="person"></param> /// <param name="pos"></param> /// <param name="scale"></param> /// <param name="part"></param> /// <param name="cb"></param> private void GetOnePartAsync(string path, GameObject person, Vector3 pos, Vector3 scale, PartData part, Action <GameObject> cb = null) { PartType partType = part.PType; UIHelper.instance.LoadPrefabAsync(path, person.transform, pos, scale, false, null, (obj) => { obj.transform.SetParent(person.transform); RawImage img = obj.transform.Find("img_item").GetComponent <RawImage>(); Texture2D t = new Texture2D(500, 500, TextureFormat.RGBA32, false); t.filterMode = FilterMode.Point; t.LoadImage(part.ImgBytes); t.Apply(false); img.texture = t; img.SetNativeSize(); obj.transform.localScale = scale; //调整父节点的大小 float w = img.GetComponent <RectTransform>().sizeDelta.x; float h = img.GetComponent <RectTransform>().sizeDelta.y; obj.transform.GetComponent <RectTransform>().sizeDelta = new Vector2(w, h); DisplayPartItem item = obj.AddComponent <DisplayPartItem>(); item.partType = part.PType; item.Init(); if (cb != null) { cb(person); } }); }
/// <summary> /// 同步获取一个人物并计算出最低点 /// </summary> /// <returns>The person object.</returns> /// <param name="part">Part.</param> public GameObject GetPersonObjWithFlag(PartDataWhole whole, out float minPosY) { float minY = float.MaxValue; List <PartData> part = whole.PartDataList; GameObject person = new GameObject("person"); Transform transBody = person.transform; Transform parentBody = null; GameObject parentObj = null; GameObject bodyRectTemp = null; if (whole.JoinType == JoinType.Animal) { string bodypath = "Prefabs/display|display_item_animalbody"; parentObj = UIHelper.instance.LoadPrefab(bodypath, person.transform, Vector3.zero, Vector3.one); parentBody = parentObj.transform.Find("img_item").transform; DisplayPartItem item = parentObj.gameObject.AddComponent <DisplayPartItem>(); item.partType = PartType.AnimalBody; } for (int i = 0; i < part.Count; i++) { PartType partType = part[i].PType; if (partType == PartType.Pixels || partType == PartType.drawPixels) { continue; } Vector3 pos = new Vector3(part[i].Pos[0], part[i].Pos[1], part[i].Pos[2]); Vector3 scale = new Vector3(part[i].Scale[0], part[i].Scale[1], part[i].Scale[2]); GameObject obj; Debug.Log(partType + " " + pos); string path = "Prefabs/display|display_item_" + partType.ToString().ToLower(); if (partType == PartType.LeftEye || partType == PartType.RightEye || partType == PartType.Mouth) { if (whole.JoinType == JoinType.Animal) { obj = UIHelper.instance.LoadPrefab(path, transBody, pos, scale); } else { obj = UIHelper.instance.LoadPrefab(path, person.transform, pos, scale); obj.transform.SetParent(transBody); } } else if (partType == PartType.Head || partType == PartType.TrueBody) { obj = UIHelper.instance.LoadPrefab(path, parentBody, pos, scale); if (bodyRectTemp == null) { bodyRectTemp = obj; } } else { obj = UIHelper.instance.LoadPrefab(path, person.transform, pos, scale); obj.transform.SetParent(transBody); } //给后面的节点指定父节点 if (partType == PartType.Head || partType == PartType.Body) { transBody = obj.transform.Find("img_item").transform; } //使用RawImage RawImage img = obj.transform.Find("img_item").GetComponent <RawImage>(); Texture2D t = new Texture2D(500, 500, TextureFormat.RGBA32, false); t.filterMode = FilterMode.Point; t.LoadImage(part[i].ImgBytes); t.Apply(false); img.texture = t; img.SetNativeSize(); //调整父节点的大小 float w = img.GetComponent <RectTransform>().sizeDelta.x; float h = img.GetComponent <RectTransform>().sizeDelta.y; obj.transform.GetComponent <RectTransform>().sizeDelta = new Vector2(w, h); DisplayPartItem item = obj.AddComponent <DisplayPartItem>(); item.partType = part[i].PType; item.Init(); //最低点计算 float bottom = obj.GetComponent <RectTransform>().anchoredPosition.y - h / 2; if (partType == PartType.Body) { float j = Utils.GetPicHeightRate(t); bottom = h / 2 - h * (1 - j); } if (minY > bottom) { minY = bottom; } } if (whole.JoinType == JoinType.Animal && parentObj != null) { float offsetHeight = bodyRectTemp.transform.localPosition.y; parentObj.transform.SetAsLastSibling(); parentBody.GetComponent <RectTransform>().sizeDelta = new Vector2(bodyRectTemp.GetComponent <RectTransform>().sizeDelta.x, bodyRectTemp.GetComponent <RectTransform>().sizeDelta.y - offsetHeight);//bodyRectTemp.GetComponent<RectTransform>().sizeDelta; parentObj.GetComponent <RectTransform>().sizeDelta = new Vector2(bodyRectTemp.GetComponent <RectTransform>().sizeDelta.x, bodyRectTemp.GetComponent <RectTransform>().sizeDelta.y - offsetHeight); parentBody.GetComponent <RectTransform>().anchorMin = new Vector2(0.5f, 0); parentBody.GetComponent <RectTransform>().anchorMax = new Vector2(0.5f, 0); parentBody.GetComponent <RectTransform>().pivot = new Vector2(0.5f, 0); } GameObject flagObj = new GameObject("flag_bottom"); flagObj.transform.SetParent(person.transform); flagObj.transform.localPosition = new Vector3(0, minY, 0); curPerson = person; GetListDiaplayItem(person.transform); minPosY = minY; return(person); }