Created
November 4, 2022 20:30
-
-
Save userddssilva/eb06ba48af7970ca7287154256c2c47b to your computer and use it in GitHub Desktop.
PrefabToIcon
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
public class PrefabToIcon | |
{ | |
private float _distanceThreshold; | |
private readonly int _iconWidth = 512; | |
private readonly int _iconHeight = 512; | |
private readonly Vector3 _scale = new Vector3(1, 1, 1); | |
private readonly Quaternion _rotation = Quaternion.Euler(new(345.8529f, -30f, 14.28433f)); | |
private Camera _camera; | |
private LayerMask _layerMask; | |
private RenderTexture _prevRenderTexture; | |
private int _LayerMaskToLayer(LayerMask mask) => (int)Mathf.Log(mask.value, 2); | |
private void _SetLayerRecursively(GameObject gameObject, LayerMask targetLayer) | |
{ | |
gameObject.layer = _LayerMaskToLayer(targetLayer); | |
foreach (Transform child in gameObject.transform) | |
{ | |
_SetLayerRecursively(child.gameObject, targetLayer); | |
} | |
} | |
private GameObject _CreatePrefabClone(ref GameObject prefab) | |
{ | |
var cameraTransform = _camera.transform; | |
var prefabClone = Object.Instantiate(prefab); | |
prefabClone.transform.position = cameraTransform.position + (cameraTransform.forward * _distanceThreshold); | |
prefabClone.transform.rotation = _rotation; | |
prefabClone.transform.localScale = _scale; | |
return prefabClone; | |
} | |
private GameObject _CreateGameObjectWithCamera() | |
{ | |
var cameraGameObject = new GameObject(); | |
_camera = cameraGameObject.AddComponent<Camera>(); | |
return cameraGameObject; | |
} | |
private void _SetupCamera() | |
{ | |
_camera.cullingMask = _layerMask; | |
_camera.clearFlags = CameraClearFlags.SolidColor; | |
_camera.nearClipPlane = 0.01f; | |
_camera.backgroundColor = Color.gray; | |
_camera.targetTexture = RenderTexture.GetTemporary(_iconWidth, _iconHeight, 24); | |
_camera.Render(); | |
} | |
private Texture2D _CreateTexture2DOfPrefab() | |
{ | |
var targetTexture = _camera.targetTexture; | |
RenderTexture.active = targetTexture; | |
var iconTexture = new Texture2D(targetTexture.width, targetTexture.height); | |
iconTexture.ReadPixels(new Rect(0, 0, targetTexture.width, targetTexture.height), 0, 0); | |
iconTexture.Apply(); | |
return iconTexture; | |
} | |
private void _ClearSettings(ref GameObject prefabClone, ref GameObject cameraGameObject) | |
{ | |
_camera.clearFlags = CameraClearFlags.Skybox; | |
_camera.targetTexture = null; | |
RenderTexture.ReleaseTemporary(_camera.targetTexture); | |
Object.DestroyImmediate(prefabClone); | |
Object.DestroyImmediate(cameraGameObject); | |
} | |
public Texture2D CreateIconOf(GameObject prefab, LayerMask targetLayer, float distanceThreshold = 1f) | |
{ | |
_distanceThreshold = distanceThreshold; | |
_layerMask = targetLayer; | |
var cameraGameObject = _CreateGameObjectWithCamera(); | |
var prefabClone = _CreatePrefabClone(ref prefab); | |
_SetLayerRecursively(prefabClone, targetLayer); | |
_SetupCamera(); | |
var iconTexture = _CreateTexture2DOfPrefab(); | |
_ClearSettings(ref prefabClone, ref cameraGameObject); | |
return iconTexture; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment