The bone weights of each vertex
The size of the array is either the same as vertexCount or empty.
Each vertex can be affected by up to 4 different bones. All 4 bone weights should sum up to 1.
function Start () {
gameObject.AddComponent(Animation);
gameObject.AddComponent(SkinnedMeshRenderer);
var renderer : SkinnedMeshRenderer = GetComponent(SkinnedMeshRenderer);
// Build basic mesh
var mesh : Mesh = new Mesh ();
mesh.vertices = [Vector3(-1, 0, 0), Vector3(1, 0, 0), Vector3(-1, 5, 0),
Vector3(1, 5, 0)];
mesh.uv = [Vector2(0, 0), Vector2(1, 0), Vector2(0, 1), Vector2(1, 1)];
mesh.triangles = [0, 1, 2, 1, 3, 2];
mesh.RecalculateNormals();
// Assign mesh to mesh filter & renderer
renderer.material = new Material (Shader.Find("Diffuse"));
// Assign bone weights to mesh
// We use 2 bones. One for the lower vertices, one for the upper vertices.
var weights : BoneWeight[] = new BoneWeight[4];
weights[0].boneIndex0 = 0;
weights[0].weight0 = 1;
weights[1].boneIndex0 = 0;
weights[1].weight0 = 1;
weights[2].boneIndex0 = 1;
weights[2].weight0 = 1;
weights[3].boneIndex0 = 1;
weights[3].weight0 = 1;
mesh.boneWeights = weights;
// Create Bone Transforms and Bind poses
// One bone at the bottom and one at the top
var bones : Transform[] = new Transform[2];
var bindPoses : Matrix4x4[] = new Matrix4x4[2];
bones[0] = new GameObject ("Lower").transform;
bones[0].parent = transform;
// Set the position relative to the parent
bones[0].localRotation = Quaternion.identity;
bones[0].localPosition = Vector3.zero;
// The bind pose is bone's inverse transformation matrix
// In this case the matrix we also make this matrix relative to the root
// So that we can move the root game object around freely
bindPoses[0] = bones[0].worldToLocalMatrix * transform.localToWorldMatrix;
bones[1] = new GameObject ("Upper").transform;
bones[1].parent = transform;
// Set the position relative to the parent
bones[1].localRotation = Quaternion.identity;
bones[1].localPosition = Vector3 (0, 5, 0);
// The bind pose is bone's inverse transformation matrix
// In this case the matrix we also make this matrix relative to the root
// So that we can move the root game object around freely
bindPoses[1] = bones[1].worldToLocalMatrix * transform.localToWorldMatrix;
mesh.bindposes = bindPoses;
// Assign bones and bind poses
renderer.bones = bones;
renderer.sharedMesh = mesh;
// Assign a simple waving animation to the bottom bone
var curve : AnimationCurve = new AnimationCurve();
curve.keys = [ new Keyframe (0, 0, 0, 0), new Keyframe (1, 3, 0, 0),
new Keyframe (2, 0.0, 0, 0) ];
// Create the clip with the curve
var clip : AnimationClip = new AnimationClip();
clip.SetCurve("Lower", Transform, "m_LocalPosition.z", curve);
// Add and play the clip
animation.AddClip(clip, "test");
animation.Play("test");
}
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Start() {
gameObject.AddComponent<Animation>();
gameObject.AddComponent<SkinnedMeshRenderer>();
SkinnedMeshRenderer renderer = GetComponent<SkinnedMeshRenderer>();
Mesh mesh = new Mesh();
mesh.vertices = new Vector3[] {new Vector3(-1, 0, 0), new Vector3(1, 0, 0), new Vector3(-1, 5, 0), new Vector3(1, 5, 0)};
mesh.uv = new Vector2[] {new Vector2(0, 0), new Vector2(1, 0), new Vector2(0, 1), new Vector2(1, 1)};
mesh.triangles = new int[] {0, 1, 2, 1, 3, 2};
mesh.RecalculateNormals();
renderer.material = new Material(Shader.Find("Diffuse"));
BoneWeight[] weights = new BoneWeight[4];
weights[0].boneIndex0 = 0;
weights[0].weight0 = 1;
weights[1].boneIndex0 = 0;
weights[1].weight0 = 1;
weights[2].boneIndex0 = 1;
weights[2].weight0 = 1;
weights[3].boneIndex0 = 1;
weights[3].weight0 = 1;
mesh.boneWeights = weights;
Transform[] bones = new Transform[2];
Matrix4x4[] bindPoses = new Matrix4x4[2];
bones[0] = new GameObject("Lower").transform;
bones[0].parent = transform;
bones[0].localRotation = Quaternion.identity;
bones[0].localPosition = Vector3.zero;
bindPoses[0] = bones[0].worldToLocalMatrix * transform.localToWorldMatrix;
bones[1] = new GameObject("Upper").transform;
bones[1].parent = transform;
bones[1].localRotation = Quaternion.identity;
bones[1].localPosition = new Vector3(0, 5, 0);
bindPoses[1] = bones[1].worldToLocalMatrix * transform.localToWorldMatrix;
mesh.bindposes = bindPoses;
renderer.bones = bones;
renderer.sharedMesh = mesh;
AnimationCurve curve = new AnimationCurve();
curve.keys = new Keyframe[] {new Keyframe(0, 0, 0, 0), new Keyframe(1, 3, 0, 0), new Keyframe(2, 0.0F, 0, 0)};
AnimationClip clip = new AnimationClip();
clip.SetCurve("Lower", typeof(Transform), "m_LocalPosition.z", curve);
animation.AddClip(clip, "test");
animation.Play("test");
}
}
import UnityEngine
import System.Collections
class example(MonoBehaviour):
def Start():
gameObject.AddComponent[of Animation]()
gameObject.AddComponent[of SkinnedMeshRenderer]()
renderer as SkinnedMeshRenderer = GetComponent[of SkinnedMeshRenderer]()
mesh as Mesh = Mesh()
mesh.vertices = (Vector3(-1, 0, 0), Vector3(1, 0, 0), Vector3(-1, 5, 0), Vector3(1, 5, 0))
mesh.uv = (Vector2(0, 0), Vector2(1, 0), Vector2(0, 1), Vector2(1, 1))
mesh.triangles = (0, 1, 2, 1, 3, 2)
mesh.RecalculateNormals()
renderer.material = Material(Shader.Find('Diffuse'))
weights as (BoneWeight) = array[of BoneWeight](4)
weights[0].boneIndex0 = 0
weights[0].weight0 = 1
weights[1].boneIndex0 = 0
weights[1].weight0 = 1
weights[2].boneIndex0 = 1
weights[2].weight0 = 1
weights[3].boneIndex0 = 1
weights[3].weight0 = 1
mesh.boneWeights = weights
bones as (Transform) = array[of Transform](2)
bindPoses as (Matrix4x4) = array[of Matrix4x4](2)
bones[0] = GameObject('Lower').transform
bones[0].parent = transform
bones[0].localRotation = Quaternion.identity
bones[0].localPosition = Vector3.zero
bindPoses[0] = (bones[0].worldToLocalMatrix * transform.localToWorldMatrix)
bones[1] = GameObject('Upper').transform
bones[1].parent = transform
bones[1].localRotation = Quaternion.identity
bones[1].localPosition = Vector3(0, 5, 0)
bindPoses[1] = (bones[1].worldToLocalMatrix * transform.localToWorldMatrix)
mesh.bindposes = bindPoses
renderer.bones = bones
renderer.sharedMesh = mesh
curve as AnimationCurve = AnimationCurve()
curve.keys = (Keyframe(0, 0, 0, 0), Keyframe(1, 3, 0, 0), Keyframe(2, 0.0F, 0, 0))
clip as AnimationClip = AnimationClip()
clip.SetCurve('Lower', Transform, 'm_LocalPosition.z', curve)
animation.AddClip(clip, 'test')
animation.Play('test')