我们 今天要做模型的动画,首先要讲模型加载出来,创建一个空对象和一个CombineMesh脚本,
添加完动画之后角色就会动起来,当然要下载动画的资源跟角色的资源。
这里的资源我已经提前弄好了,就直接看代码
写完这些就能将头部,身体,腿部的图用一个材质球渲染出来
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CombineMesh : MonoBehaviour
{
public SkinnedMeshRenderer[] sk;
// Start is called before the first frame update
void Start()
{
Mesh mesh = new Mesh();
List<CombineInstance> combines = new List<CombineInstance>();
List<Texture2D> textures = new List<Texture2D>();
for (int i = 0; i < sk.Length; i++)
{
CombineInstance instance = new CombineInstance();
instance.mesh = sk[i].sharedMesh;
instance.transform = sk[i].transform.localToWorldMatrix;
combines.Add(instance);
textures.Add(sk[i].sharedMaterial.GetTexture("_BackTex") as Texture2D);
}
mesh.CombineMeshes(combines.ToArray(), true, false);
//合并纹理
Texture2D texture = new Texture2D(0, 0);
Rect[] rects = texture.PackTextures(textures.ToArray(), 0);
//通过矩形数据rects重新计算UV坐标
List<Vector2> uv = new List<Vector2>();
for (int i = 0; i < sk.Length; i++)
{
Vector2[] olduv = sk[i].sharedMesh.uv;
for (int j = 0; j < olduv.Length; j++)
{
float uvx = rects[i].x + rects[i].width * olduv[j].x;
float uvy = rects[i].y + rects[i].height * olduv[j].y;
uv.Add(new Vector2(uvx, uvy));
}
}
mesh.uv = uv.ToArray();
GetComponent<SkinnedMeshRenderer>().sharedMesh = mesh;
Texture2D face = sk[0].sharedMaterial.GetTexture("_MainTex") as Texture2D;
Material material = new Material(Shader.Find("Custom/Face"));
material.SetTexture("_BackTex", texture);
material.SetTexture("_MainTex", sk[0].sharedMaterial.GetTexture("_MainTex"));
material.SetFloat("_PosX", texture.width / face.width);
material.SetFloat("_PosY", texture.height / face.height);
GetComponent<SkinnedMeshRenderer>().material = material;
//把骨骼放入SkinnedMeshRenderer
List<Transform> bones = new List<Transform>();
Transform[] mybones = gameObject.GetComponentsInChildren<Transform>();
Dictionary<string, Transform> dicbones = new Dictionary<string, Transform>();
foreach (var item in mybones)
{
dicbones.Add(item.name, item);
}
for (int i = 0; i < sk.Length; i++)
{
for (int j = 0; j < sk[i].bones.Length; j++)
{
if (dicbones.ContainsKey(sk[i].bones[j].name))
{
bones.Add(dicbones[sk[i].bones[j].name]);
}
}
}
GetComponent<SkinnedMeshRenderer>().bones = bones.ToArray();
}
// Update is called once per frame
void Update()
{
}
}
骨骼动画的绘制