如何在模型贴画
原理
首先这个工具必须是运行状态才能进行,因为原理就是用的Rigidbody撞击物体位移改变顶点
可以看出来如果模型的顶点太,多生成的碰撞点也会变多,每个碰撞点都有Rigidbody和碰撞器,肯定会造成卡顿.
/// <summary>
/// 获取全部顶点,创建新的点,给以指定的位置
/// </summary>
void CreatePoint()
{
planeVerts = transform.GetComponent<MeshFilter>().sharedMesh.vertices;
for (int i = 0; i < planeVerts.Length; i++)
{
Transform newCube = Instantiate(Resources.Load<GameObject>("MeshPoint/Point")).transform;
newCube.position = transform.TransformPoint(planeVerts[i]);
newCube.rotation = transform.rotation;
newCube.localScale = transform.localScale;
newCube.SetParent(transform);
CubeArr.Add(newCube);
}
}
我们暂且不考虑这个问题,因为我们最终要的是变形后的模型.
我们用这个方法来更新当前模型顶点的状态.
void UpdateMesh()
{
vertsArr.Clear();
for (int i = 0; i < CubeArr.Count; i++)
{
vertsArr.Add(transform.InverseTransformPoint(CubeArr[i].position));
}
mf.mesh.SetVertices(vertsArr);
}
但是每帧都进行更新肯定会造成卡顿,因为每帧都会把碰撞点位置信息赋值给顶点,这样肯定不行,我们选择在碰撞时进行更新,而且每个碰撞点也就只能调用一次.
bool Collision = false;
private void OnCollisionEnter(Collision collision)
{
if (Collision == false && !collision.gameObject.GetComponent<ColliderReflect>())
{
Collision = true;
transform.parent.GetComponent<EditorMeshPoint>().Variant();
}
}
好的,到此为止我们要的效果已经出来了,可以贴到任何模型上了!
好了,可以完结撒花了~~~
撒花~✨🎉🎊💐🌸🌹🌻🌼🌷🌱☘🍁🍂
撒花~ ✨🎉🎊💐🌸🌹🌻🌼🌷🌱☘🍁🍂
撒花~✨🎉🎊💐🌸🌹🌻🌼🌷🌱☘🍁🍂
撒花~ ✨🎉🎊💐🌸🌹🌻🌼🌷🌱☘🍁🍂
撒花~✨🎉🎊💐🌸🌹🌻🌼🌷🌱☘🍁🍂
撒花~ ✨🎉🎊💐🌸🌹🌻🌼🌷🌱☘🍁🍂
撒花~✨🎉🎊💐🌸🌹🌻🌼🌷🌱☘🍁🍂
撒花~ ✨🎉🎊💐🌸🌹🌻🌼🌷🌱☘🍁🍂
撒花~✨🎉🎊💐🌸🌹🌻🌼🌷🌱☘🍁🍂
撒花~ ✨🎉🎊💐🌸🌹🌻🌼🌷🌱☘🍁🍂
撒花~✨🎉🎊💐🌸🌹🌻🌼🌷🌱☘🍁🍂
撒花~ ✨🎉🎊💐🌸🌹🌻🌼🌷🌱☘🍁🍂
怎么可能!
缺少了最关键的一环,现在效果是出来了,取消运行之后就又变为了原来的状态,像这样…
我们需要保存这个模型
上代码~
[DisallowMultipleComponent]
[RequireComponent(typeof(MeshFilter))]
[ExecuteInEditMode]
public class MeshCollider_SaveMesh : MonoBehaviour
{
public bool saveMesh = false;
void Update()
{
if (saveMesh)
SaveAsset();
}
void SaveAsset()
{
saveMesh = false;
#if UNITY_EDITOR
Mesh mesh = GetComponent<MeshFilter>().sharedMesh;
AssetDatabase.CreateAsset(mesh, "Assets/" + gameObject.name + ".asset");
#endif
}
}
这个保存模型的代码可以在任何状态下进行保存,挂在到目标上点击SaveMesh就会保存到Assets目录下
把保存好的网格贴到这里就可以了
其他效果
Demo下载链接: 点击