人物剩余一个Armature其余删除
分别准备对应的身子、腿、头的预制体用以换装
代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Change : MonoBehaviour
{
public List<GameObject> head;
public List<GameObject> body;
public List<GameObject> root;
public int headindex = 0;
public int bodyindex = 0;
public int rootindex = 0;
// Start is called before the first frame update
void Start()
{
Show();
}
public void Show()
{
GameObject[] prefab = new GameObject[] { head[headindex], body[bodyindex], root[rootindex] };
Mesh mesh = new Mesh();
List<CombineInstance> combines = new List<CombineInstance>();
List<Material> materials = new List<Material>();
List<Transform> bones = new List<Transform>();
Transform[] mybones = GetComponentsInChildren<Transform>();
Dictionary<string, Transform> bonedic = new Dictionary<string, Transform>();
foreach (var item in mybones)
{
bonedic.Add(item.name, item);
}
for (int i = 0; i < prefab.Length; i++)
{
CombineInstance instance = new CombineInstance();
instance.mesh = prefab[i].GetComponentInChildren<SkinnedMeshRenderer>().sharedMesh;
instance.transform = prefab[i].transform.localToWorldMatrix;
combines.Add(instance);
materials.Add(prefab[i].GetComponentInChildren<SkinnedMeshRenderer>().sharedMaterial);
foreach (var item in prefab[i].GetComponentInChildren<SkinnedMeshRenderer>().bones)
{
if (bonedic.ContainsKey(item.name))
{
bones.Add(bonedic[item.name]);
}
}
}
mesh.Clear();
mesh.CombineMeshes(combines.ToArray(), false, false);
GetComponent<SkinnedMeshRenderer>().sharedMesh = mesh;
GetComponent<SkinnedMeshRenderer>().bones = bones.ToArray();
GetComponent<SkinnedMeshRenderer>().sharedMaterials = materials.ToArray();
}
public void ChangeIndex1(int id,int index)
{
switch (id)
{
case 1:
headindex = index;
break;
case 2:
bodyindex = index;
break;
case 3:
rootindex = index;
break;
default:
break;
}
Show();
}
// Update is called once per frame
void Update()
{
}
}
轮转图内代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
using UnityEngine.EventSystems;
public class Change3 : MonoBehaviour, IDragHandler, IEndDragHandler
{
public GameObject prefab;
public int num;
public float r;
float angle;
float moveangle;
List<GameObject> cells = new List<GameObject>();
List<GameObject> lists = new List<GameObject>();
public GameObject person;
public void OnDrag(PointerEventData eventData)
{
moveangle += eventData.delta.x / r;
OnMove();
}
public void OnEndDrag(PointerEventData eventData)
{
DOTween.To((a) =>
{
moveangle += a / r;
OnMove();
}, eventData.delta.x, 0, 1).OnComplete(()=> {
int index = cells.IndexOf(lists[num - 1]);
person.GetComponent<Change>().ChangeIndex1(3, index);
});
}
// Start is called before the first frame update
void Start()
{
angle = 2 * Mathf.PI / num;
OnMove();
}
public void OnMove()
{
for (int i = 0; i < num; i++)
{
float x = Mathf.Sin(i * angle + moveangle) * r;
float z = Mathf.Cos(i * angle + moveangle) * r;
if (cells.Count < num)
{
GameObject go = Instantiate(prefab, transform);
go.transform.GetChild(0).GetComponent<Text>().text = (i + 1).ToString();
cells.Add(go);
lists.Add(go);
}
cells[i].transform.localPosition = new Vector3(x, 0, 0);
float scale = (z + r) / (2 * r) * (1 - 0.5f) + 0.5f;
cells[i].transform.localScale = Vector3.one * scale;
}
lists.Sort((a, b) =>
{
return (int)(a.transform.localScale.z * 100 - b.transform.localScale.z * 100);
});
for (int i = 0; i < lists.Count; i++)
{
lists[i].transform.SetSiblingIndex(i);
}
}
// Update is called once per frame
void Update()
{
}
}
根据OnEndDrag中传出的id换装脚本中进行判断从而来决定更换哪个部位的装扮