/* * 设置贴花类型 */ void SetDecalType(CLIPSHAPE_TYPE type) { getDecal().shapeType = type; getDecal().UpdateSelf(); }
public static void BuildDecalForObject(Decal decal, CLIPSHAPE_TYPE eShapeType, float fAngle, GameObject affectedObject) { Mesh affectedMesh = null; MeshCollider mc = affectedObject.GetComponent <MeshCollider>(); if (mc != null) { affectedMesh = mc.sharedMesh; } else { MeshFilter mf = affectedObject.GetComponent <MeshFilter>(); if (mf != null) { affectedMesh = mf.sharedMesh; } } if (affectedMesh == null || affectedMesh.isReadable == false) { return; } float maxSlopeAngle = decal.maxSlopeAngle; Vector3[] vertices = affectedMesh.vertices; int[] triangles = affectedMesh.triangles; int startVertexCount = bufVertices.Count; Matrix4x4 matrix = decal.transform.worldToLocalMatrix * affectedObject.transform.localToWorldMatrix; 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]); Vector3 side1 = v2 - v1; Vector3 side2 = v3 - v1; Vector3 normal = Vector3.Cross(side1, side2).normalized; if (Vector3.Angle(Vector3.up, normal) >= maxSlopeAngle) { continue; } if (eShapeType == CLIPSHAPE_TYPE.CST_SQUARE) { DecalPolygon poly = ClipPolygonBySquare(v1, v2, v3); if (poly != null) { AddPolygon(poly, normal); } } else if (eShapeType == CLIPSHAPE_TYPE.CST_SECTOR) { if (fAngle <= 0f && fAngle >= 360f) { LogMgr.UnityError("Sector angle beyond Range! Must limit it greater than 0 degree and less than 360 degree."); continue; } if (fAngle <= 180f) { DecalPolygon poly = ClipPolygonByConvexSector(fAngle, v1, v2, v3); if (poly != null) { AddPolygon(poly, normal); } } else { DecalPolygon poly = ClipPolygonByNonConvexSector(fAngle, v1, v2, v3, false); if (poly != null) { AddPolygon(poly, normal); } DecalPolygon polySec = ClipPolygonByNonConvexSector(fAngle, v1, v2, v3, true); if (polySec != null) { AddPolygon(polySec, normal); } } } } //GenerateTexCoords(startVertexCount, decal.sprite); GenerateTexCoords(startVertexCount, decal); }