Синтаксис:
Используется csharp
using System;
using UnityEngine;
class CharacterCustomizationExt : MonoBehaviour
{
public GameObject[] characterPartsList;
public SkinnedMeshRenderer templateSkeleltalSource;
/// <summary>
/// Takes a target GameObject and an array of GameObjects. All skinned mesh renderers attached to any GameObject in the array are copied to the target GameObject.
/// </summary>
void Start()
{
GameObject character = this.gameObject;
// Record start time for logging time spent
float startTime = Time.realtimeSinceStartup;
// Transform[] characterBones = CharacterBones(character, templateSkeleltalSource);
// Step through all game objects in gameObjectsToCombine
foreach (GameObject part in characterPartsList)
{
CharPartAdd(character, part);
}
// Log time spent
Debug.Log("Combining game objects took " + (Time.realtimeSinceStartup - startTime) * 1000 + " ms");
}
public void CharPartAdd(GameObject character, GameObject part)
{
Mesh mesh = new Mesh();
Material[] materials = new Material[0];
if (part.GetComponent<SkinnedMeshRenderer>() != null)
{
mesh = (MeshCopy(part.GetComponent<SkinnedMeshRenderer>().sharedMesh));
materials = part.GetComponent<SkinnedMeshRenderer>().sharedMaterials;
}
else
{
if (part.GetComponent<MeshFilter>() != null)
{
mesh = (MeshCopy(part.GetComponent<MeshFilter>().sharedMesh));
materials = part.GetComponent<MeshRenderer>().sharedMaterials;
}
else
{
return;
}
}
GameObject newPart = new GameObject();
newPart.name = ("char_part_" + part.name);
mesh.name = newPart.name;
newPart.transform.rotation = part.transform.rotation;
newPart.transform.localScale = part.transform.localScale;
newPart.transform.position = character.transform.position;
newPart.transform.parent = character.transform;
/*
// if static object
newPart.AddComponent<MeshFilter>();
newPart.GetComponent<MeshFilter>().mesh = mesh;
newPart.AddComponent<MeshRenderer>();
newPart.GetComponent<MeshRenderer>().materials = materials;
*/
// if animated character
SkinnedMeshRenderer smr = newPart.AddComponent(typeof(SkinnedMeshRenderer))
as SkinnedMeshRenderer;
mesh.bindposes = templateSkeleltalSource.sharedMesh.bindposes;//part.GetComponent<SkinnedMeshRenderer>().sharedMesh.bindposes;//
smr.bones = CharacterBones(character, templateSkeleltalSource);//CharacterBones(character, part.GetComponent<SkinnedMeshRenderer>());//
Debug.Log(smr.bones.Length);
for (int i=0; i<smr.bones.Length; i++)
{
Debug.Log(i + " - " +smr.bones[i].name);
}
/*
BoneWeight[] weights = mesh.boneWeights;
for (int i = 0; i < weights.Length; i++)
{
weights[i].boneIndex0 = weights[i].boneIndex0 % templateSkeleltalSource.bones.Length;
weights[i].boneIndex1 = weights[i].boneIndex1 % templateSkeleltalSource.bones.Length;
weights[i].boneIndex2 = weights[i].boneIndex2 % templateSkeleltalSource.bones.Length;
weights[i].boneIndex3 = weights[i].boneIndex3 % templateSkeleltalSource.bones.Length;
}
mesh.boneWeights = weights;
*/
smr.sharedMesh = mesh;
smr.materials = materials;
}
Mesh MeshCopy(Mesh fromMesh)
{
Mesh toMesh = new Mesh();
Vector3[] newVertices = fromMesh.vertices;
toMesh.vertices = newVertices;
Vector2[] newUV = fromMesh.uv;
toMesh.uv = newUV;
int[] newTriangles = fromMesh.triangles;
toMesh.triangles = newTriangles;
Vector3[] newNormals = fromMesh.normals;
toMesh.normals = newNormals;
BoneWeight[] newBoneWeight = fromMesh.boneWeights;
toMesh.boneWeights = newBoneWeight;
Matrix4x4[] newBindposes = fromMesh.bindposes;
toMesh.bindposes = newBindposes;
// toMesh.RecalculateNormals();
// toMesh.RecalculateBounds();
return toMesh;
}
Transform[] CharacterBones(GameObject character, SkinnedMeshRenderer templateSkeleltalSource)
{
Transform[] bones = new Transform[templateSkeleltalSource.bones.Length];
// Step through all bones used by the original renderer
for (int bone = 0; bone < templateSkeleltalSource.bones.Length; bone++)
{
Transform t = null;
// Step through all transforms in the target game object
foreach (Component c in character.GetComponentsInChildren(typeof(Transform)))
{
// Check if we have found the corresponding bone
if (c.name == templateSkeleltalSource.bones[bone].name)
{
t = c.transform;
break;
}
}
// Throw an exception when we dont find a bone with the same name
if (t == null) throw new Exception("Bone not found");
// Add the bone we found to the array
bones[bone] = t;
}
return bones;
}
}
using UnityEngine;
class CharacterCustomizationExt : MonoBehaviour
{
public GameObject[] characterPartsList;
public SkinnedMeshRenderer templateSkeleltalSource;
/// <summary>
/// Takes a target GameObject and an array of GameObjects. All skinned mesh renderers attached to any GameObject in the array are copied to the target GameObject.
/// </summary>
void Start()
{
GameObject character = this.gameObject;
// Record start time for logging time spent
float startTime = Time.realtimeSinceStartup;
// Transform[] characterBones = CharacterBones(character, templateSkeleltalSource);
// Step through all game objects in gameObjectsToCombine
foreach (GameObject part in characterPartsList)
{
CharPartAdd(character, part);
}
// Log time spent
Debug.Log("Combining game objects took " + (Time.realtimeSinceStartup - startTime) * 1000 + " ms");
}
public void CharPartAdd(GameObject character, GameObject part)
{
Mesh mesh = new Mesh();
Material[] materials = new Material[0];
if (part.GetComponent<SkinnedMeshRenderer>() != null)
{
mesh = (MeshCopy(part.GetComponent<SkinnedMeshRenderer>().sharedMesh));
materials = part.GetComponent<SkinnedMeshRenderer>().sharedMaterials;
}
else
{
if (part.GetComponent<MeshFilter>() != null)
{
mesh = (MeshCopy(part.GetComponent<MeshFilter>().sharedMesh));
materials = part.GetComponent<MeshRenderer>().sharedMaterials;
}
else
{
return;
}
}
GameObject newPart = new GameObject();
newPart.name = ("char_part_" + part.name);
mesh.name = newPart.name;
newPart.transform.rotation = part.transform.rotation;
newPart.transform.localScale = part.transform.localScale;
newPart.transform.position = character.transform.position;
newPart.transform.parent = character.transform;
/*
// if static object
newPart.AddComponent<MeshFilter>();
newPart.GetComponent<MeshFilter>().mesh = mesh;
newPart.AddComponent<MeshRenderer>();
newPart.GetComponent<MeshRenderer>().materials = materials;
*/
// if animated character
SkinnedMeshRenderer smr = newPart.AddComponent(typeof(SkinnedMeshRenderer))
as SkinnedMeshRenderer;
mesh.bindposes = templateSkeleltalSource.sharedMesh.bindposes;//part.GetComponent<SkinnedMeshRenderer>().sharedMesh.bindposes;//
smr.bones = CharacterBones(character, templateSkeleltalSource);//CharacterBones(character, part.GetComponent<SkinnedMeshRenderer>());//
Debug.Log(smr.bones.Length);
for (int i=0; i<smr.bones.Length; i++)
{
Debug.Log(i + " - " +smr.bones[i].name);
}
/*
BoneWeight[] weights = mesh.boneWeights;
for (int i = 0; i < weights.Length; i++)
{
weights[i].boneIndex0 = weights[i].boneIndex0 % templateSkeleltalSource.bones.Length;
weights[i].boneIndex1 = weights[i].boneIndex1 % templateSkeleltalSource.bones.Length;
weights[i].boneIndex2 = weights[i].boneIndex2 % templateSkeleltalSource.bones.Length;
weights[i].boneIndex3 = weights[i].boneIndex3 % templateSkeleltalSource.bones.Length;
}
mesh.boneWeights = weights;
*/
smr.sharedMesh = mesh;
smr.materials = materials;
}
Mesh MeshCopy(Mesh fromMesh)
{
Mesh toMesh = new Mesh();
Vector3[] newVertices = fromMesh.vertices;
toMesh.vertices = newVertices;
Vector2[] newUV = fromMesh.uv;
toMesh.uv = newUV;
int[] newTriangles = fromMesh.triangles;
toMesh.triangles = newTriangles;
Vector3[] newNormals = fromMesh.normals;
toMesh.normals = newNormals;
BoneWeight[] newBoneWeight = fromMesh.boneWeights;
toMesh.boneWeights = newBoneWeight;
Matrix4x4[] newBindposes = fromMesh.bindposes;
toMesh.bindposes = newBindposes;
// toMesh.RecalculateNormals();
// toMesh.RecalculateBounds();
return toMesh;
}
Transform[] CharacterBones(GameObject character, SkinnedMeshRenderer templateSkeleltalSource)
{
Transform[] bones = new Transform[templateSkeleltalSource.bones.Length];
// Step through all bones used by the original renderer
for (int bone = 0; bone < templateSkeleltalSource.bones.Length; bone++)
{
Transform t = null;
// Step through all transforms in the target game object
foreach (Component c in character.GetComponentsInChildren(typeof(Transform)))
{
// Check if we have found the corresponding bone
if (c.name == templateSkeleltalSource.bones[bone].name)
{
t = c.transform;
break;
}
}
// Throw an exception when we dont find a bone with the same name
if (t == null) throw new Exception("Bone not found");
// Add the bone we found to the array
bones[bone] = t;
}
return bones;
}
}
вся оказия случается вот здесь
Синтаксис:
Используется csharp
mesh.bindposes = templateSkeleltalSource.sharedMesh.bindposes;//part.GetComponent<SkinnedMeshRenderer>().sharedMesh.bindposes;//
smr.bones = CharacterBones(character, templateSkeleltalSource);//CharacterBones(character, part.GetComponent<SkinnedMeshRenderer>());//
smr.bones = CharacterBones(character, templateSkeleltalSource);//CharacterBones(character, part.GetComponent<SkinnedMeshRenderer>());//
templateSkeleltalSource - общий шаблон
part.GetComponent<SkinnedMeshRenderer>() - данные о костях конкретного меша