123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- using System;
- namespace UnityEngine.Experimental.U2D.Animation
- {
- /// <summary>
- /// Updates a SpriteRenderer's Sprite reference on the Category and Label value it is set
- /// </summary>
- /// <Description>
- /// By setting the SpriteResolver's Category and Label value, it will request for a Sprite from
- /// a SpriteLibrary Component the Sprite that is registered for the Category and Label.
- /// If a SpriteRenderer is present in the same GameObject, the SpriteResolver will update the
- /// SpriteRenderer's Sprite reference to the corresponding Sprite.
- /// </Description>
- [ExecuteInEditMode]
- [DisallowMultipleComponent]
- [AddComponentMenu("2D Animation/Sprite Resolver (Experimental)")]
- [DefaultExecutionOrder(-2)]
- [HelpURL("https://docs.unity3d.com/Packages/com.unity.2d.animation@latest/index.html?subfolder=/manual/SLAsset.html%23sprite-resolver-component")]
- public class SpriteResolver : MonoBehaviour
- {
- // These are for animation
- [SerializeField]
- private float m_CategoryHash;
- [SerializeField]
- private float m_labelHash;
- // For comparing hash values
- private int m_CategoryHashInt;
- private int m_LabelHashInt;
- // For OnUpdate during animation playback
- private int m_PreviousCategoryHash;
- private int m_PreviouslabelHash;
- #if UNITY_EDITOR
- bool m_SpriteLibChanged;
- #endif
- void OnEnable()
- {
- m_CategoryHashInt = ConvertFloatToInt(m_CategoryHash);
- m_PreviousCategoryHash = m_CategoryHashInt;
- m_LabelHashInt = ConvertFloatToInt(m_labelHash);
- m_PreviouslabelHash = m_LabelHashInt;
- ResolveSpriteToSpriteRenderer();
- }
- SpriteRenderer spriteRenderer
- {
- get { return GetComponent<SpriteRenderer>(); }
- }
- /// <summary>
- /// Set the Category and label to use
- /// </summary>
- /// <param name="category">Category to use</param>
- /// <param name="label">Label to use</param>
- public void SetCategoryAndLabel(string category, string label)
- {
- categoryHashInt = SpriteLibraryAsset.GetStringHash(category);
- m_PreviousCategoryHash = categoryHashInt;
- labelHashInt = SpriteLibraryAsset.GetStringHash(label);
- m_PreviouslabelHash = categoryHashInt;
- ResolveSpriteToSpriteRenderer();
- }
- /// <summary>
- /// Get the Category set for the SpriteResolver
- /// </summary>
- /// <returns>The Category's name</returns>
- public string GetCategory()
- {
- var returnString = "";
- var sl = spriteLibrary;
- if (sl)
- returnString = sl.GetCategoryNameFromHash(categoryHashInt);
- return returnString;
- }
- /// <summary>
- /// Get the Label set for the SpriteResolver
- /// </summary>
- /// <returns>The Label's name</returns>
- public string GetLabel()
- {
- var returnString = "";
- var sl = spriteLibrary;
- if (sl)
- returnString = sl.GetLabelNameFromHash(categoryHashInt, labelHashInt);
- return returnString;
- }
- /// <summary>
- /// Property to get the SpriteLibrary the SpriteResolver is resolving from
- /// </summary>
- public SpriteLibrary spriteLibrary => gameObject.GetComponentInParent<SpriteLibrary>(true);
- void LateUpdate()
- {
- m_CategoryHashInt = ConvertFloatToInt(m_CategoryHash);
- m_LabelHashInt = ConvertFloatToInt(m_labelHash);
- if (m_LabelHashInt != m_PreviouslabelHash || m_CategoryHashInt != m_PreviousCategoryHash)
- {
- m_PreviousCategoryHash = m_CategoryHashInt;
- m_PreviouslabelHash = m_LabelHashInt;
- ResolveSpriteToSpriteRenderer();
- }
- }
- internal Sprite GetSprite(out bool validEntry)
- {
- var lib = spriteLibrary;
- if (lib != null)
- {
- return lib.GetSprite(m_CategoryHashInt, m_LabelHashInt, out validEntry);
- }
- validEntry = false;
- return null;
- }
- /// <summary>
- /// Set the Sprite in SpriteResolver to the SpriteRenderer component that is in the same GameObject.
- /// </summary>
- public void ResolveSpriteToSpriteRenderer()
- {
- m_PreviousCategoryHash = m_CategoryHashInt;
- m_PreviouslabelHash = m_LabelHashInt;
- bool validEntry;
- var sprite = GetSprite(out validEntry);
- var sr = spriteRenderer;
- if (sr != null && (sprite != null || validEntry))
- sr.sprite = sprite;
- }
- void OnTransformParentChanged()
- {
- ResolveSpriteToSpriteRenderer();
- #if UNITY_EDITOR
- spriteLibChanged = true;
- #endif
- }
- int categoryHashInt
- {
- get { return m_CategoryHashInt; }
- set
- {
- m_CategoryHashInt = value;
- m_CategoryHash = ConvertIntToFloat(m_CategoryHashInt);
- }
- }
- int labelHashInt
- {
- get { return m_LabelHashInt; }
- set
- {
- m_LabelHashInt = value;
- m_labelHash = ConvertIntToFloat(m_LabelHashInt);
- }
- }
- internal unsafe static int ConvertFloatToInt(float f)
- {
- float* fp = &f;
- int* i = (int*)fp;
- return *i;
- }
- internal unsafe static float ConvertIntToFloat(int f)
- {
- int* fp = &f;
- float* i = (float*)fp;
- return *i;
- }
- #if UNITY_EDITOR
- internal bool spriteLibChanged
- {
- get {return m_SpriteLibChanged;}
- set { m_SpriteLibChanged = value; }
- }
- #endif
- }
- }
|