Я начал изучать Unity и C# совсем недавно, решил разобрать очень интересный скрипт который дает эффект желе 3д объекту. Но столкнулся с проблемой. Скрипт работает только на базовых 3д объектах (куб, цилиндр), если я создам точно такой же объект в 3д редакторе (Blender), то он отказывается работать.
Ошибок при компиляции не обнаруженно, но выходит ошибка при запуске игры.
Not allowed to access vertices on mesh 'Pink(Clone)' (isReadable is false; Read/Write must be enabled in import settings)
UnityEngine.Mesh:set_vertices (UnityEngine.Vector3[])
JellyMesh:FixedUpdate () (at Assets/JellyMesh.cs:35)
Pink - это название меша.
Никак не могу понять как разрешить доступ к вершинам сетки модели.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class JellyMesh : MonoBehaviour
{
public float Intensity = 1f;
public float Mass = 1f;
public float stiffness = 1f;
public float damping = 0.6f;
private Mesh OriginalMesh = null, MeshClone = null;
private MeshRenderer renderer;
private JellyVertex[] jv;
private Vector3[] vertexArray;
void Start()
{
OriginalMesh = GetComponent<MeshFilter>().sharedMesh;
MeshClone = Instantiate(OriginalMesh);
GetComponent<MeshFilter>().sharedMesh = MeshClone;
renderer = GetComponent<MeshRenderer>();
jv = new JellyVertex[MeshClone.vertices.Length];
for (int i = 0; i < MeshClone.vertices.Length; i++)
jv[i] = new JellyVertex(i, transform.TransformPoint(MeshClone.vertices[i]));
}
void FixedUpdate()
{
vertexArray = OriginalMesh.vertices;
for (int i = 0; i < jv.Length; i++)
{
Vector3 target = transform.TransformPoint(vertexArray[jv[i].ID]);
float intensity = (1 - (renderer.bounds.max.y - target.y) / renderer.bounds.size.y) * Intensity;
jv[i].Shake(target, Mass, stiffness, damping);
target = transform.InverseTransformPoint(jv[i].Position);
vertexArray[jv[i].ID] = Vector3.Lerp(vertexArray[jv[i].ID], target, intensity);
}
MeshClone.vertices = vertexArray;
}
public class JellyVertex
{
public int ID;
public Vector3 Position;
public Vector3 velocity, Force;
public JellyVertex(int _id, Vector3 _pos)
{
ID = _id;
Position = _pos;
}
public void Shake(Vector3 target, float m, float s, float d)
{
Force = (target - Position) * s;
velocity = (velocity + Force / m) * d;
Position += velocity;
if ((velocity + Force + Force / m).magnitude < 0.001f)
Position = target;
}
}
}
Буду благодарен за помощь!