|
|
/* ------------------- Code Monkey -------------------
Thank you for downloading the Code Monkey Utilities I hope you find them useful in your projects If you have any questions use the contact form Cheers!
unitycodemonkey.com -------------------------------------------------- */
using UnityEngine;
namespace CodeMonkey.Utils {
/* * Mesh in the World * */ public class World_Mesh { private const int sortingOrderDefault = 5000;
public GameObject gameObject; public Transform transform; private Material material; private Vector3[] vertices; private Vector2[] uv; private int[] triangles; private Mesh mesh;
public static World_Mesh Create(Vector3 position, float eulerZ, float meshWidth, float meshHeight, Material material, UVCoords uvCoords, int sortingOrderOffset = 0) { return new World_Mesh(null, position, Vector3.one, eulerZ, meshWidth, meshHeight, material, uvCoords, sortingOrderOffset); }
public static World_Mesh Create(Vector3 lowerLeftCorner, float width, float height, Material material, UVCoords uvCoords, int sortingOrderOffset = 0) { return Create(lowerLeftCorner, lowerLeftCorner + new Vector3(width, height), material, uvCoords, sortingOrderOffset); }
public static World_Mesh Create(Vector3 lowerLeftCorner, Vector3 upperRightCorner, Material material, UVCoords uvCoords, int sortingOrderOffset = 0) { float width = upperRightCorner.x - lowerLeftCorner.x; float height = upperRightCorner.y - lowerLeftCorner.y; Vector3 localScale = upperRightCorner - lowerLeftCorner; Vector3 position = lowerLeftCorner + localScale * .5f; return new World_Mesh(null, position, Vector3.one, 0f, width, height, material, uvCoords, sortingOrderOffset); }
private static int GetSortingOrder(Vector3 position, int offset, int baseSortingOrder = sortingOrderDefault) { return (int)(baseSortingOrder - position.y) + offset; }
public class UVCoords { public int x, y, width, height; public UVCoords(int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; } }
public World_Mesh(Transform parent, Vector3 localPosition, Vector3 localScale, float eulerZ, float meshWidth, float meshHeight, Material material, UVCoords uvCoords, int sortingOrderOffset) { this.material = material;
vertices = new Vector3[4]; uv = new Vector2[4]; triangles = new int[6];
/* 0,1 * 1,1 * 0,0 * 1,0 */ float meshWidthHalf = meshWidth / 2f; float meshHeightHalf = meshHeight / 2f;
vertices[0] = new Vector3(-meshWidthHalf, meshHeightHalf); vertices[1] = new Vector3( meshWidthHalf, meshHeightHalf); vertices[2] = new Vector3(-meshWidthHalf, -meshHeightHalf); vertices[3] = new Vector3( meshWidthHalf, -meshHeightHalf); if (uvCoords == null) { uvCoords = new UVCoords(0, 0, material.mainTexture.width, material.mainTexture.height); }
Vector2[] uvArray = GetUVRectangleFromPixels(uvCoords.x, uvCoords.y, uvCoords.width, uvCoords.height, material.mainTexture.width, material.mainTexture.height);
ApplyUVToUVArray(uvArray, ref uv);
triangles[0] = 0; triangles[1] = 1; triangles[2] = 2; triangles[3] = 2; triangles[4] = 1; triangles[5] = 3;
mesh = new Mesh();
mesh.vertices = vertices; mesh.uv = uv; mesh.triangles = triangles;
gameObject = new GameObject("Mesh", typeof(MeshFilter), typeof(MeshRenderer)); gameObject.transform.parent = parent; gameObject.transform.localPosition = localPosition; gameObject.transform.localScale = localScale; gameObject.transform.localEulerAngles = new Vector3(0, 0, eulerZ);
gameObject.GetComponent<MeshFilter>().mesh = mesh; gameObject.GetComponent<MeshRenderer>().material = material;
transform = gameObject.transform;
SetSortingOrderOffset(sortingOrderOffset); }
private Vector2 ConvertPixelsToUVCoordinates(int x, int y, int textureWidth, int textureHeight) { return new Vector2((float)x / textureWidth, (float)y / textureHeight); }
private Vector2[] GetUVRectangleFromPixels(int x, int y, int width, int height, int textureWidth, int textureHeight) { /* 0, 1 * 1, 1 * 0, 0 * 1, 0 * */ return new Vector2[] { ConvertPixelsToUVCoordinates(x, y + height, textureWidth, textureHeight), ConvertPixelsToUVCoordinates(x + width, y + height, textureWidth, textureHeight), ConvertPixelsToUVCoordinates(x, y, textureWidth, textureHeight), ConvertPixelsToUVCoordinates(x + width, y, textureWidth, textureHeight) }; }
private void ApplyUVToUVArray(Vector2[] uv, ref Vector2[] mainUV) { if (uv == null || uv.Length < 4 || mainUV == null || mainUV.Length < 4) throw new System.Exception(); mainUV[0] = uv[0]; mainUV[1] = uv[1]; mainUV[2] = uv[2]; mainUV[3] = uv[3]; }
public void SetUVCoords(UVCoords uvCoords) { Vector2[] uvArray = GetUVRectangleFromPixels(uvCoords.x, uvCoords.y, uvCoords.width, uvCoords.height, material.mainTexture.width, material.mainTexture.height); ApplyUVToUVArray(uvArray, ref uv); mesh.uv = uv; }
public void SetSortingOrderOffset(int sortingOrderOffset) { SetSortingOrder(GetSortingOrder(gameObject.transform.position, sortingOrderOffset)); }
public void SetSortingOrder(int sortingOrder) { gameObject.GetComponent<Renderer>().sortingOrder = sortingOrder; }
public void SetLocalScale(Vector3 localScale) { transform.localScale = localScale; }
public void SetPosition(Vector3 localPosition) { transform.localPosition = localPosition; }
public void AddPosition(Vector3 addPosition) { transform.localPosition += addPosition; }
public Vector3 GetPosition() { return transform.localPosition; }
public int GetSortingOrder() { return gameObject.GetComponent<Renderer>().sortingOrder; }
public void Show() { gameObject.SetActive(true); }
public void Hide() { gameObject.SetActive(false); }
public void DestroySelf() { Object.Destroy(gameObject); }
}}
|