没有合适的资源?快使用搜索试试~ 我知道了~
首页Unity实现喷漆效果
本文实例为大家分享了Unity实现喷漆效果展示的具体代码,供大家参考,具体内容如下 喷漆功能 **应用场景:**如墙上的标语贴花,汽车上的喷漆等。 选择方案: 1、当然实现方法各式各异,最最最简单,也是最“不堪入目”的方法是直接给一个面片,然后获取喷漆位置,加上一个要喷漆表面法线方向的偏移,作为最终面片放置位置,当然,不要忘了设置面片的方向。这种方法虽然说简单,但是效果并不理想,会出经常现与其他物体穿插的情况,如果游戏中曲面太多,那么这个方案基本没法看。 2、对于个别特殊的需求来讲,比如说人物身上的纹身,完全可以用一个shader里实现,此方法仅限于一个贴花对应一个物体,如果是一对多的情况
资源详情
资源评论
资源推荐

Unity实现喷漆效果实现喷漆效果
本文实例为大家分享了Unity实现喷漆效果展示的具体代码,供大家参考,具体内容如下
喷漆功能喷漆功能
**应用场景:**如墙上的标语贴花,汽车上的喷漆等。
选择方案:选择方案:
1、当然实现方法各式各异,最最最简单,也是最“不堪入目”的方法是直接给一个面片,然后获取喷漆位置,加上一个要喷漆
表面法线方向的偏移,作为最终面片放置位置,当然,不要忘了设置面片的方向。这种方法虽然说简单,但是效果并不理想,
会出经常现与其他物体穿插的情况,如果游戏中曲面太多,那么这个方案基本没法看。
2、对于个别特殊的需求来讲,比如说人物身上的纹身,完全可以用一个shader里实现,此方法仅限于一个贴花对应一个物
体,如果是一对多的情况,请看后边这两种。
3、有一种简易的方法是用Projector,这种方法实现较为简单,不多说。
4、接下来说一种动态生成网格方案,也较为常用,接下来就详细说说这种方案。
实现思路:实现思路:
喷漆的网格是根据场景中所喷位置的物体的网格动态生成的,喷漆的时候,获取规定范围内的物体,再用一个立方体(也可以
用球体)去截取这些物体的Mesh,从而构造新的网格,将喷漆渲染在这个Mesh就OK了。
代码实现:代码实现:
首先,我们需要一个获取规定范围内MeshRenderer的函数:
public GameObject[] GetAffectedObjects(Bounds bounds, LayerMask affectedLayers)
{
MeshRenderer[] renderers = FindObjectsOfType<MeshRenderer>();
List<GameObject> objects = new List<GameObject>();
foreach (Renderer r in renderers)
{
if (!r.enabled) continue;
if ((1 << r.gameObject.layer & affectedLayers.value) == 0) continue;
if (r.GetComponent<Decal>() != null) continue;
if (bounds.Intersects(r.bounds))
{
objects.Add(r.gameObject);
}
}
return objects.ToArray();
}
然后拿到这些GameObject去做裁剪,裁剪函数:
public void BuildDecal(GameObject affectedObject, bool isLast)
{
Mesh affectedMesh = affectedObject.GetComponent<MeshFilter>().sharedMesh;
if (affectedMesh == null) return;
//这里预存了已获取物体的vertices和triangles,减少了不必要的GC
Vector3[] vertices = GetVertexList(affectedObject);
int[] triangles = GetTriangleList(affectedObject);
//目标顶点转换到当前物体的模型空间
Matrix4x4 matrix = this.transform.worldToLocalMatrix*affectedObject.transform.localToWorldMatrix;
//将主要计算移入异步
Loom.RunAsync(() =>
{
for (int i = 0; i < triangles.Length; i += 3)
{
int i1 = triangles[i];
int i2 = triangles[i + 1];
int i3 = triangles[i + 2];
Vector3 v1 = matrix.MultiplyPoint(vertices[i1]);
Vector3 v2 = matrix.MultiplyPoint(vertices[i2]);
Vector3 v3 = matrix.MultiplyPoint(vertices[i3]);










安全验证
文档复制为VIP权益,开通VIP直接复制

评论0