Skip to content

Instantly share code, notes, and snippets.

@CSaratakij
Forked from tsubaki/SkinnedMeshUpdater.cs
Created September 22, 2023 08:42
Show Gist options
  • Select an option

  • Save CSaratakij/14467ea6b5486bbb66e81382a3811a2f to your computer and use it in GitHub Desktop.

Select an option

Save CSaratakij/14467ea6b5486bbb66e81382a3811a2f to your computer and use it in GitHub Desktop.

Revisions

  1. @tsubaki tsubaki created this gist Oct 11, 2015.
    51 changes: 51 additions & 0 deletions SkinnedMeshUpdater.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,51 @@
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine.Assertions;
    using System;

    public class SkinnedMeshUpdater : MonoBehaviour
    {
    [SerializeField]
    SkinnedMeshRenderer original;

    #region UNITYC_CALLBACK

    void Update ()
    {
    if (Input.GetKeyDown (KeyCode.Space)) {
    UpdateMeshRenderer (original);
    }
    }

    #if UNITY_EDITOR
    void OnDrawGizmosSelected ()
    {
    var meshrenderer = GetComponentInChildren<SkinnedMeshRenderer> ();
    Vector3 before = meshrenderer.bones [0].position;
    for (int i = 0; i < meshrenderer.bones.Length; i++) {
    Gizmos.DrawLine (meshrenderer.bones [i].position, before);
    UnityEditor.Handles.Label (meshrenderer.bones [i].transform.position, i.ToString ());
    before = meshrenderer.bones [i].position;
    }
    }
    #endif

    #endregion

    public void UpdateMeshRenderer (SkinnedMeshRenderer newMeshRenderer)
    {
    // update mesh
    var meshrenderer = GetComponentInChildren<SkinnedMeshRenderer> ();
    meshrenderer.sharedMesh = newMeshRenderer.sharedMesh;

    Transform[] childrens = transform.GetComponentsInChildren<Transform> (true);

    // sort bones.
    Transform[] bones = new Transform[newMeshRenderer.bones.Length];
    for (int boneOrder = 0; boneOrder < newMeshRenderer.bones.Length; boneOrder++) {
    bones [boneOrder] = Array.Find<Transform> (childrens, c => c.name == newMeshRenderer.bones [boneOrder].name);
    }
    meshrenderer.bones = bones;
    }
    }