Last active
June 7, 2016 17:38
-
-
Save tsubaki/cd485c40ad3fccc8aabc3a25c55d8ba9 to your computer and use it in GitHub Desktop.
スプライト描画機能の代わり。
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; | |
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 |
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; | |
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