Skip to content

Instantly share code, notes, and snippets.

@userddssilva
Created November 4, 2022 20:30
Show Gist options
  • Save userddssilva/eb06ba48af7970ca7287154256c2c47b to your computer and use it in GitHub Desktop.
Save userddssilva/eb06ba48af7970ca7287154256c2c47b to your computer and use it in GitHub Desktop.
PrefabToIcon
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