void InitialiseTile(FogTile tile, int size, string name, Color[] pixels, Transform parent) { var renderer = this.GetComponent <SpriteRenderer> (); Vector2 pivot = new Vector2(0.5f, 0.5f); var rect = new Rect(0, 0, size, size); tile.texture = new Texture2D(size, size); tile.texture.SetPixels(0, 0, size, size, pixels); tile.texture.filterMode = FilterMode.Bilinear; tile.texture.wrapMode = TextureWrapMode.Clamp; tile.texture.Apply(); tile.texture.name = "Fog Texture " + name; tile.sprite = Sprite.Create(tile.texture, rect, pivot, renderer.sprite.pixelsPerUnit); tile.sprite.name = "Fog Sprite" + name; tile.obj = new GameObject(); tile.obj.name = "Fog" + name; tile.obj.transform.parent = parent; tile.obj.transform.localScale = new Vector3(tileSize, tileSize, 0.0f); tile.obj.AddComponent <SpriteRenderer> (); tile.renderer = tile.obj.GetComponent <SpriteRenderer> (); tile.renderer.sprite = tile.sprite; tile.renderer.name = "Fog Renderer " + name; tile.renderer.sortingOrder = renderer.sortingOrder; tile.renderer.sortingLayerName = renderer.sortingLayerName; }
void RemoveFog(Vector2 playerPosition, FogTile tile, float scale, int dimensions, float minReveal, float maxReveal) { if (tile.pixels == null) { tile.pixels = tile.texture.GetPixels32();; } float pixelSize = scale / (float)dimensions; float halfSize = scale / 2.0f; Vector2 pixelPosition = new Vector2(); // Pixels start at bottom left corner and move upwards Vector2 pixelStart = new Vector2(tile.obj.transform.position.x - halfSize, tile.obj.transform.position.y - halfSize); for (int r = 0; r < dimensions; ++r) { for (int c = 0; c < dimensions; ++c) { pixelPosition.x = pixelStart.x + (c * pixelSize); pixelPosition.y = pixelStart.y + (r * pixelSize); float distance = Vector2.Distance(pixelPosition, playerPosition); if (distance <= maxRevealRadius) { byte alpha = (byte)Mathf.Clamp(ConvertRange(distance, minReveal, maxReveal, 0.0f, 255.0f), 0.0f, 255.0f); var pixelIndex = r * dimensions + c; if (tile.pixels[pixelIndex].a > alpha) { tile.pixels[pixelIndex].a = alpha; } } } } tile.texture.SetPixels32(tile.pixels); tile.texture.Apply(); }