Архив за день: 03.08.2020



Unity: Преобразовать MeshRenderer в SkinnedMeshRenderer

Добрался до урока «INTEGRATION 03 — Making an RPG in Unity (E12)».

Все части интеграции были созданы довольно давно, поэтому для новых версий Unity и Blender приходится что-то изменять. В этот раз я столкнулся с тем, что скрипт Equipment.cs не принимал объект типа MeshRenderer, а только SkinnedMeshRenderer. Это было нормально, т.к. ранее мы использовали именно такие типы компонентов. Поскольку в этом уроке всё пошло не так, мне пришлось вручную отделить из объектов сцены нужные мне «Sword» и «Shield» и импортировать их в Unity. Вот тут я и остановился, т.к. далее нужно было эти модельки перетащить в слот Mesh, который принимал SkinnedMeshRenderer:

Скорее всего из Blender можно экспортировать меш именно как SkinnedMesh, но пока я не нашёл как это сделать.
Объекты должны быть анимированными. Т.е. иметь арматуру и анимационные клипы. Отдельно для меча или щита этого нет. Поэтому буду использовать костыли и извлекать нужный объект скриптом (или создавать новый из старого).

Ниже я привожу скрипт, который преобразует объект на сцене из MeshRenderer в SkinnedMeshRenderer — ConvertToSkinnedMesh.cs:

using UnityEngine;

public class ConvertToSkinnedMesh : MonoBehaviour
{
  [ContextMenu("Convert to Skinned Mesh Renderer")]
  void Convert()
  {
    Material[] meshRendererMaterials;
    MeshRenderer meshRenderer = gameObject.GetComponent<MeshRenderer>();
    MeshFilter meshFilter = gameObject.GetComponent<MeshFilter>();

    meshRendererMaterials = meshRenderer.sharedMaterials;

   SkinnedMeshRenderer skinnedMeshRenderer = gameObject.AddComponent<SkinnedMeshRenderer>();

    skinnedMeshRenderer.sharedMaterials = meshRendererMaterials;

    DestroyImmediate(meshRenderer);
    DestroyImmediate(meshFilter);
    DestroyImmediate(this);
  }
}