使用Unity怎么實(shí)現(xiàn)序列幀動(dòng)畫播放器?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),雙城網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:雙城等地區(qū)。雙城做網(wǎng)站價(jià)格咨詢:18980820575using UnityEngine; using UnityEngine.UI; using System; ////// 序列幀動(dòng)畫播放器 /// 支持UGUI的Image和Unity2D的SpriteRenderer /// public class FrameAnimator : MonoBehaviour { ////// 序列幀 /// public Sprite[] Frames{ get { return frames; } set { frames = value; } } [SerializeField]private Sprite[] frames = null; ////// 幀率,為正時(shí)正向播放,為負(fù)時(shí)反向播放 /// public float Framerate { get { return framerate; } set { framerate = value; } } [SerializeField] private float framerate = 20.0f; ////// 是否忽略timeScale /// public bool IgnoreTimeScale{ get { return ignoreTimeScale; } set { ignoreTimeScale = value; } } [SerializeField]private bool ignoreTimeScale = true; ////// 是否循環(huán) /// public bool Loop{ get { return loop; } set { loop = value; } } [SerializeField]private bool loop = true; //動(dòng)畫曲線 [SerializeField]private AnimationCurve curve = new AnimationCurve (new Keyframe (0, 1, 0, 0), new Keyframe (1, 1, 0, 0)); ////// 結(jié)束事件 /// 在每次播放完一個(gè)周期時(shí)觸發(fā) /// 在循環(huán)模式下觸發(fā)此事件時(shí),當(dāng)前幀不一定為結(jié)束幀 /// public event Action FinishEvent; //目標(biāo)Image組件 private Image image; //目標(biāo)SpriteRenderer組件 private SpriteRenderer spriteRenderer; //當(dāng)前幀索引 private int currentFrameIndex = 0; //下一次更新時(shí)間 private float timer = 0.0f; //當(dāng)前幀率,通過曲線計(jì)算而來 private float currentFramerate = 20.0f; ////// 重設(shè)動(dòng)畫 /// public void Reset () { currentFrameIndex = framerate < 0 ? frames.Length - 1 : 0; } ////// 從停止的位置播放動(dòng)畫 /// public void Play () { this.enabled = true; } ////// 暫停動(dòng)畫 /// public void Pause () { this.enabled = false; } ////// 停止動(dòng)畫,將位置設(shè)為初始位置 /// public void Stop () { Pause (); Reset (); } //自動(dòng)開啟動(dòng)畫 void Start () { image = this.GetComponent(); spriteRenderer = this.GetComponent (); #if UNITY_EDITOR if (image == null && spriteRenderer == null) { Debug.LogWarning ("No available component found. 'Image' or 'SpriteRenderer' required.", this.gameObject); } #endif } void Update () { //幀數(shù)據(jù)無效,禁用腳本 if (frames == null || frames.Length == 0) { this.enabled = false; } else { //從曲線值計(jì)算當(dāng)前幀率 float curveValue = curve.Evaluate ((float)currentFrameIndex / frames.Length); float curvedFramerate = curveValue * framerate; //幀率有效 if (curvedFramerate != 0) { //獲取當(dāng)前時(shí)間 float time = ignoreTimeScale ? Time.unscaledTime : Time.time; //計(jì)算幀間隔時(shí)間 float interval = Mathf.Abs (1.0f / curvedFramerate); //滿足更新條件,執(zhí)行更新操作 if (time - timer > interval) { //執(zhí)行更新操作 DoUpdate (); } } #if UNITY_EDITOR else { Debug.LogWarning ("Framerate got '0' value, animation stopped."); } #endif } } //具體更新操作 private void DoUpdate () { //計(jì)算新的索引 int nextIndex = currentFrameIndex + (int)Mathf.Sign (currentFramerate); //索引越界,表示已經(jīng)到結(jié)束幀 if (nextIndex < 0 || nextIndex >= frames.Length) { //廣播事件 if (FinishEvent != null) { FinishEvent (); } //非循環(huán)模式,禁用腳本 if (loop == false) { currentFrameIndex = Mathf.Clamp (currentFrameIndex, 0, frames.Length - 1); this.enabled = false; return; } } //鉗制索引 currentFrameIndex = nextIndex % frames.Length; //更新圖片 if (image != null) { image.sprite = frames [currentFrameIndex]; } else if (spriteRenderer != null) { spriteRenderer.sprite = frames [currentFrameIndex]; } //設(shè)置計(jì)時(shí)器為當(dāng)前時(shí)間 timer = ignoreTimeScale ? Time.unscaledTime : Time.time; } }
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司的支持。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、網(wǎng)站設(shè)計(jì)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。