自定义数据
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Custom
{
[Serializable]
public class CustomAvatarData
{
[Serializable]
public class MeshData
{
public Vector3[] meshVertices;
public Vector2[] meshUV;
public int[] meshTriangles;
public BoneWeight[] meshBoneWeight;
public int subMeshCount;
public List<string> meshBonesName = new List<string>();
public int meshMaterialCount;
public Matrix4x4[] meshBindPoses;
public Bounds meshBounds;
public Vector3[] meshNormals;
public Vector4[] meshTangents;
}
[Serializable]
public class SkeletonData
{
public CustomTransform current;
public List<string> children = new List<string>();
}
[Serializable]
public class CustomTransform
{
public string nodeName;
public Vector3 position;
public Quaternion rotation;
}
[Serializable]
public enum Gender
{
male,
female,
}
[Serializable]
public class CustomSkindMeshData
{
public Gender gender;
public MeshData meshData = new MeshData();
public string SkeletonRoot;
public List<SkeletonData> skeletonDatas = new List<SkeletonData>();
public string mainTextureBase64;
public string normalTextureBase64;
}
}
}
保存模型数据
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
namespace Custom
{
public class SaveAvatar : MonoBehaviour
{
public GameObject root;
public Material matTemp;
public string avatarName;
public CustomAvatarData.Gender gender;
//public GameObject[] bon;
// Start is called before the first frame update
void Start()
{
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.S))
{
SaveFunc();
}
}
[ContextMenu("SaveFunc")]
public void SaveFunc()
{
var skMesh = CombineSuitsToSkeleton(root, root.GetComponentsInChildren<SkinnedMeshRenderer>());
CustomAvatarData.CustomSkindMeshData customSkindMeshData = new CustomAvatarData.CustomSkindMeshData();
customSkindMeshData.gender = this.gender;
CustomAvatarData.MeshData meshData = new CustomAvatarData.MeshData();
meshData.meshVertices = skMesh.sharedMesh.vertices;
meshData.meshTriangles = skMesh.sharedMesh.triangles;
meshData.meshUV = skMesh.sharedMesh.uv;
meshData.meshBoneWeight = skMesh.sharedMesh.boneWeights;
meshData.subMeshCount = skMesh.sharedMesh.subMeshCount;
foreach (var item in skMesh.bones)
{
meshData.meshBonesName.Add(item.gameObject.name);
}
meshData.meshMaterialCount = skMesh.sharedMaterials.Length;
meshData.meshBindPoses = skMesh.sharedMesh.bindposes;
meshData.meshBounds = skMesh.sharedMesh.bounds;
meshData.meshNormals = skMesh.sharedMesh.normals;
meshData.meshTangents = skMesh.sharedMesh.tangents;
customSkindMeshData.meshData = meshData;
Texture2D tex = new Texture2D(skMesh.material.mainTexture.width, skMesh.material.mainTexture.height);
tex = skMesh.material.mainTexture as Texture2D;
customSkindMeshData.mainTextureBase64 = System.Convert.ToBase64String(tex.EncodeToJPG());
customSkindMeshData.normalTextureBase64 = System.Convert.ToBase64String((skMesh.material.GetTexture("_BumpMap")as Texture2D).EncodeToJPG());
for (int i = 0; i < root