Skip to content

Instantly share code, notes, and snippets.

@tsubaki
Last active June 7, 2016 17:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tsubaki/cd485c40ad3fccc8aabc3a25c55d8ba9 to your computer and use it in GitHub Desktop.
Save tsubaki/cd485c40ad3fccc8aabc3a25c55d8ba9 to your computer and use it in GitHub Desktop.
スプライト描画機能の代わり。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class SortingLayerAttribute : PropertyAttribute{}
#if UNITY_EDITOR
[CustomPropertyDrawer(typeof(SortingLayerAttribute))]
public class SortingLayerDrawerAttribute : PropertyDrawer
{
private static SerializedProperty sortinglayer = null;
public static SerializedProperty SortingLayer
{
get
{
if (sortinglayer == null)
{
var tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
sortinglayer = tagManager.FindProperty("m_SortingLayers");
}
return sortinglayer;
}
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
var list = AllSortingLayer;
var selectedIndex = list.FindIndex(item => item.Equals(property.stringValue));
if (selectedIndex == -1)
selectedIndex = list.FindIndex(item => item.Equals("Default"));
selectedIndex = EditorGUI.Popup(position, label.text, selectedIndex, list.ToArray());
property.stringValue = list[selectedIndex];
}
private List<string> AllSortingLayer
{
get
{
var layerNameList = new List<string>();
for (int i = 0; i < SortingLayer.arraySize; i++)
{
var tag = SortingLayer.GetArrayElementAtIndex(i);
layerNameList.Add(tag.displayName);
}
return layerNameList;
}
}
}
#endif
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[ExecuteInEditMode]
public class TextureSprite : MonoBehaviour
{
#region Texture and MeshUVs
public Rect rect; // UV情報
public Texture texture = null; // テクスチャ
static MaterialPropertyBlock block = null;
static int shaderMainTexID;
static List<Vector2> sharedUvs = new List<Vector2>(4);
[SerializeField] Mesh quadMesh; // QUADオリジナル
// 同一のUVを持つメッシュをキャッシュ <UV情報のハッシュ値, uv情報込のメッシュ>
static Dictionary<int, Mesh> storedMesh = new Dictionary<int, Mesh>();
/// <summary>
// テクスチャ情報を更新
/// </summary>
public void UpdateTexture()
{
if (texture == null) return;
if( block == null) {
block = new MaterialPropertyBlock();
shaderMainTexID = Shader.PropertyToID("_MainTex");
}
// textureを設定
block.SetTexture(shaderMainTexID, texture);
// レンダラにPropertyBlockを設定
GetComponent<Renderer>().SetPropertyBlock(block);
}
/// <summary>
// メッシュ情報を更新
/// </summary>
public void UpdateMesh()
{
if (texture == null)
return;
// uvを計算
var uvRect = new Rect(
rect.x / texture.width, rect.y / texture.height,
rect.width / texture.width, rect.height / texture.height);
GetComponent<MeshFilter>().mesh = GetStoreMesh(uvRect);
}
/// <summary>
// 指定のUV情報を持つメッシュを取得
// 既にある場合はキャッシュから取得する
/// </summary>
/// <param name="uvRect">UV情報</param>
/// <returns>指定のUV情報を持つメッシュ</returns>
Mesh GetStoreMesh(Rect uvRect)
{
// UVが同じならば、再利用する
var hashCode = uvRect.GetHashCode();
if (storedMesh.ContainsKey(hashCode) && storedMesh[hashCode] != null)
{
return storedMesh[hashCode];
}
else
{
// UVを設定したメッシュを生成
var mesh = Instantiate(quadMesh);
if (storedMesh.ContainsKey(hashCode) == false)
storedMesh.Add(hashCode, mesh);
else
storedMesh[hashCode] = mesh;
sharedUvs.Clear();
sharedUvs.Add(uvRect.min);
sharedUvs.Add(uvRect.max);
sharedUvs.Add(new Vector2(uvRect.x + uvRect.width, uvRect.y));
sharedUvs.Add(new Vector2(uvRect.x, uvRect.y + uvRect.height));
mesh.SetUVs(0, sharedUvs);
return mesh;
}
}
/// <summary>
// 保持してるメッシュを全部捨てる
/// </summary>
public static void ClearStoredMesh()
{
foreach(var mesh in storedMesh)
{
Destroy(mesh.Value);
}
storedMesh.Clear();
}
#endregion
#region Sprite Order
[SerializeField]
int sortingOrder;
public int OrderInLayer {
set
{
sortingOrder = value;
UpdateSortingSetting();
}
get
{
return sortingOrder;
}
}
[SerializeField, SortingLayerAttribute]
string sortingLayerName;
public string SortingLayerName{
set
{
sortingLayerName = value;
UpdateSortingSetting();
}
get
{
return sortingLayerName;
}
}
/// <summary>
/// ソート情報を更新する
/// </summary>
public void UpdateSortingSetting()
{
var renderer = GetComponent<Renderer>();
renderer.sortingOrder = sortingOrder;
renderer.sortingLayerName = sortingLayerName;
}
#endregion
#region Unity Callback
void OnValidate()
{
UpdateSortingSetting();
UpdateTexture();
UpdateMesh();
}
void Start ()
{
UpdateSortingSetting();
UpdateTexture();
UpdateMesh();
}
#endregion
#region Inspector Actions
/// <summary>
/// テクスチャに合わせてRectを調整する
/// </summary>
[ContextMenu("Set Rect for Texture size")]
void SetRectForTexture()
{
rect = new Rect(
0, 0,
texture.width, texture.height
);
UpdateMesh();
}
[ContextMenu("Set Renderer Settings")]
void SetRendererSetttings()
{
var renderer = GetComponent<Renderer>();
renderer.receiveShadows = false;
renderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
renderer.lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off;
renderer.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off;
}
[ContextMenu("Fit Quad aspect by sprite")]
void SetQuadAspect()
{
float xAspect = rect.width / rect.height;
transform.localScale = new Vector3(transform.localScale.y * xAspect, transform.localScale.y, transform.localScale.z);
}
#endregion
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment