UGUI 帧动画插件
生活随笔
收集整理的這篇文章主要介紹了
UGUI 帧动画插件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近在開發一款功夫貓游戲,本來使用Unity Sprite制作,但是發現Sprite對各種分辨率不支持. 看著游戲很簡單就使用UGUI制作,在中途發現有很多幀動畫播放,使用了Animation調整使用多了的確很不方便.
于是改成腳本來控制Sprite幀動畫切換,慢慢開始形成了寫一個插件來調整. 寫了兩個通宵終于搞定了. O(∩_∩)O~
效果圖:
代碼:
組件類:
using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; using System;/// <summary> /// 幀動畫組件 /// </summary> [System.Serializable] public class ImageAnimation : MonoBehaviour {private float animationDeltaTime;public float animationDeltaTimer;public List<AnimationInfoEntity> animationInfo;public int type;public Image visualize;public int index;public string animationTypeList;public string tempAnimationTypeList;public string[] animationTypeProp;public void Awake(){visualize = this.transform.GetComponent<Image>();}public void Update(){animationDeltaTime += Time.deltaTime;#region List的用法if (animationInfo != null && animationInfo.Count > 0 && animationDeltaTime > animationInfo[type].deltaTime){if (animationInfo[type].animationSprite != null && animationInfo[type].animationSprite.Count != 0){index++;index = index % animationInfo[type].animationSprite.Count;visualize.sprite = animationInfo[type].animationSprite[index];animationDeltaTime = 0;visualize.SetNativeSize();}}#endregion}/// <summary>/// 切換動畫狀態/// </summary>/// <param name="index">輸入動畫狀態下標值</param>public void ChangeAnimationState(int index){if (animationTypeProp != null) {if (index < animationTypeProp.Length) {type = index;}}}/// <summary>/// 切換動畫狀態/// </summary>/// <param name="animationStateName">輸入動畫狀態的名稱</param>public void ChangeAnimationState(string animationStateName){if (animationTypeProp != null){for (int i = 0; i < animationTypeProp.Length; i++){if (animationTypeProp[i].Equals(animationStateName)) {type = i;return;}}}}}[System.Serializable] public class AnimationInfoEntity {/// <summary>/// 動畫狀態/// </summary>public int type; /// <summary>/// 播放當前幀需要的時間/// </summary>public float deltaTime; /// <summary>/// 動畫狀態所需要的圖片集合/// </summary>public List<Sprite> animationSprite;public AnimationInfoEntity() { }public AnimationInfoEntity(int type, float deltaTime, int spriteNum = 1){this.type = type;this.deltaTime = deltaTime;animationSprite = new List<Sprite>();} }編輯器類:
using UnityEngine; using System.Collections; using UnityEditor; using System.Collections.Generic; using System; using System.Reflection; using System.Reflection.Emit;[CustomEditor(typeof(ImageAnimation))] public class AnimationEditor : Editor {public void OnEnable() {ImageAnimation model = target as ImageAnimation;if (model.tempAnimationTypeList == null) {model.tempAnimationTypeList = string.Empty;}if (model.animationInfo == null){model.animationInfo = new List<AnimationInfoEntity>();}}public override void OnInspectorGUI(){ImageAnimation model = target as ImageAnimation;if (!string.IsNullOrEmpty(model.animationTypeList)) {model.animationTypeProp = model.animationTypeList.Split (';');}#region 動畫分割GUILayout.BeginHorizontal();GUILayout.Label("所有圖片每幀時間: ", new GUILayoutOption[] { GUILayout.Width(120) });model.animationDeltaTimer = EditorGUILayout.FloatField(model.animationDeltaTimer);if (GUILayout.Button("統一時間")) {for (int j = 0; j < model.animationInfo.Count; j++){model.animationInfo[j].deltaTime = model.animationDeltaTimer;}}GUILayout.EndHorizontal();GUILayout.BeginHorizontal ();GUILayout.Label("動畫類型分隔符: ",new GUILayoutOption[]{ GUILayout.Width(120)});model.tempAnimationTypeList = GUILayout.TextField(model.tempAnimationTypeList, 50);if (GUILayout.Button ("重新定義動畫類型")) {model.animationInfo = new List<AnimationInfoEntity>();model.animationTypeList = model.tempAnimationTypeList;model.animationTypeProp = model.animationTypeList.Split (';');//初始化動畫類型集合for (int j = 0; j < model.animationTypeProp.Length; j++){model.animationInfo.Add(new AnimationInfoEntity(j, model.animationDeltaTimer));}}GUILayout.EndHorizontal ();#endregion#region 繪制各個動畫屬性if (model.animationTypeProp != null && !string.IsNullOrEmpty(model.animationTypeProp[0])){for (int i = 0; i < model.animationTypeProp.Length; i++) {//draw animation typea GUILayout.BeginHorizontal();GUILayout.Label("動畫類型: ", new GUILayoutOption[] { GUILayout.Width(60) });int index = EditorGUILayout.Popup(i, model.animationTypeProp, new GUILayoutOption[] { GUILayout.Width(150) });if (GUILayout.Button("+")){model.animationInfo[i].animationSprite.Add(new Sprite());}if (GUILayout.Button("-")){if (model.animationInfo[i].animationSprite.Count > 0){model.animationInfo[i].animationSprite.RemoveAt(model.animationInfo[i].animationSprite.Count - 1);}}GUILayout.EndHorizontal();//draw image list GUILayout.BeginVertical();if (model.animationInfo != null && model.animationInfo.Count > 0){for (int k = 0; k < model.animationInfo[i].animationSprite.Count; k++){GUILayout.BeginHorizontal();GUILayout.Label("動畫幀數: ", new GUILayoutOption[] { GUILayout.Width(60) });EditorGUILayout.FloatField(model.animationInfo[i].deltaTime, new GUILayoutOption[] { GUILayout.Width(60) });model.animationInfo[i].animationSprite[k] = EditorGUILayout.ObjectField("增加一個貼圖", model.animationInfo[i].animationSprite[k], typeof(Sprite)) as Sprite;GUILayout.EndHorizontal();}}GUILayout.EndVertical();}}#endregionserializedObject.ApplyModifiedProperties();DrawAnimationButton();}/// <summary>/// 繪制動畫切換按鈕,方便用戶切換動畫,查看動畫是否正確/// </summary>private void DrawAnimationButton() {ImageAnimation model = target as ImageAnimation;if (model.animationTypeProp != null) {GUILayout.BeginHorizontal();GUILayout.Label("切換動畫狀態: ",GUILayout.Width(80));for (int i = 0; i < model.animationTypeProp.Length; i++){if (GUILayout.Button(model.animationTypeProp[i],GUILayout.Width(50))){model.ChangeAnimationState(i);}}GUILayout.EndHorizontal();}} }?
下載地址: http://yunpan.cn/cFRfdgXhK6ff2? 訪問密碼 3aed
轉載于:https://www.cnblogs.com/plateFace/p/4899728.html
總結
以上是生活随笔為你收集整理的UGUI 帧动画插件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美国战斗机和中国战斗机驾驶方式一样吗?
- 下一篇: 怎么看自己硬盘 查看自己硬盘的方法