图片展示
代码如下:
1.Composition.cs
using UnityEngine; using System.Collections.Generic; [AddComponentMenu("Composition")] public class Composition : MonoBehaviour { int Length;//储存物体数量 GameObject[] Prefabs; //储存预设体 GameObject[] instance;//储存实例化物体(实例化才能在游戏中显示) Dictionary<string, Transform> m_Dictionary;//字典,储存骨骼用的 void Awake() { Length = 2; //实例化物体数量:这里暂时设为2个 头 身体 Prefabs = new GameObject[Length]; //“实例化预设体” instance = new GameObject[Length];//实例化“实例化物体” m_Dictionary = new Dictionary<string, Transform>();//实例化字典 //将挂了脚本的父物体里面的所有transform加到字典里,(名字,transform) ( 里面只有骨骼) Transform[] transList = GetComponentsInChildren<Transform>(true); for (int i = 0; i < transList.Length; ++i) m_Dictionary.Add(transList[i].name, transList[i]); } //替换模型 public bool ChangeUnit(int i, GameObject A) //这里输入预设体的数组i Prefabs[i] 就可以对应换装 { if (i < 0 || i >= Length) return false; if (A == Prefabs[i]) return true; //如果上面的结果为true,执行下面的换装方法 return ChangeUnitImpl(i, A); } //主要工作区域 //bool的目的是 告诉外界,这个方法是否执行成功 bool ChangeUnitImpl(int j, GameObject B) //B为预设体 { //更新模型, if (instance[j]) //如果游戏中已经这个位置已经有实例化模型了 Destroy(instance[j]);//删除这个位置物件 instance[j] = null;//将这个数组的那个位置重置 Prefabs[j] = B; if (!B) //如果这个物件没有的话,正常执行,则显示为空 return true; SkinnedMeshRenderer renderer = B.GetComponentInChildren<SkinnedMeshRenderer>(); //从预设体B中得到B的SkinnedMeshRenderer组件"renderer" if (!renderer) //如果没有蒙皮的话,此方法不成功 return false; renderer = Instantiate(renderer); //将预设体B的蒙皮组件“renderer”实例化 if (renderer.rootBone) //如果renderer里有根骨骼 { Transform root; if (m_Dictionary.TryGetValue(renderer.rootBone.name, out root)) //如果能在字典里找到“根骨骼”的名字,返回出根骨骼,字典在shart函数中被实例化过 ///1 renderer.rootBone = root;//把字典里返回的“根骨骼”赋给 蒙皮组件“renderer”的“根骨骼” } //将字典里的骨骼数组付给renderer的骨骼数组 Transform[] transList = renderer.bones; for (int i = 0; i < transList.Length; ++i) m_Dictionary.TryGetValue(transList[i].name, out transList[i]); ///2 renderer.bones = transList; ///3 instance[j] = renderer.gameObject; ///4 instance[j].transform.parent = transform; //将这个数组的父物体设置为挂脚本的物体 //预设体的SkinnedMeshRenderer组件 实例化过后 开始替换工作 分4部分 //SkinnedMeshRenderer a; //1. a.rootBone; //2. a.bones; //3. a.gameObject; //4. a.transform.parent return true; } }
2.UiManager.cs
using System.Collections; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using UnityEngine.Events; using System.Collections.Generic; public class UiManager : MonoBehaviour { Image image01; Image image02; Image image03; private Composition m_Composition; private GameObject Head01; private GameObject Head02; private GameObject Head03; private GameObject Body; void Start () { m_Composition = GameObject.Find("xy").GetComponent<Composition>(); Head01 = Resources.Load("head01") as GameObject; Body = Resources.Load("body") as GameObject; m_Composition.ChangeUnit(0, Head01); m_Composition.ChangeUnit(1, Body); image01 = GameObject.Find("head01").GetComponent<Image>(); EventTriggerListener.Get(image01.gameObject).onClick = OnButtonClick; image02 = GameObject.Find("head02").GetComponent<Image>(); EventTriggerListener.Get(image02.gameObject).onClick = OnButtonClick; image03 = GameObject.Find("head03").GetComponent<Image>(); EventTriggerListener.Get(image03.gameObject).onClick = OnButtonClick; } private void OnButtonClick(GameObject go) { if (go == image01.gameObject) { m_Composition.ChangeUnit(0, Head01); } if (go == image02.gameObject) { Head02 = Resources.Load("head02") as GameObject; m_Composition.ChangeUnit(0, Head02); } if (go == image03.gameObject) { Head03 = Resources.Load("head03") as GameObject; m_Composition.ChangeUnit(0, Head03); } } }
3.EventTriggerListener.cs