换装

图片展示

 

代码如下:

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

 

posted @ 2017-11-06 12:40  欧恩Owen  阅读(205)  评论(0编辑  收藏  举报