聊聊Unity自定義組件之序列幀播放組件問題
我們知道在unity中播放序列幀動畫有兩種方式,第一種是利用Unity自帶的animation組件來播放,我們只需要在工程目錄中全選選中所有我們需要播放的圖片,將其拖動到Hiercarchy上,Unity就會幫我們自動創(chuàng)建一個animation片段,我們就可以用animation組件來控制我們的動畫,不過這種方式創(chuàng)建的圖片Sprite Renderer類型的。第二種方式就是創(chuàng)建一個Image組件,利用代碼創(chuàng)建一個sprite,寫一段代碼利用Update函數(shù)來逐幀替換Image的sprite來實現(xiàn)動畫的播放。這種的話可能會麻煩點,不過自由度高一點,可根據(jù)自己的需求來進行編寫代碼控制
由于最近的項目中需要用到大量的序列幀動畫以及邏輯處理,本來想用Unity自帶的Animation組件來實現(xiàn)的,但由于甲方需求一再變更,需要處理的邏輯太多,為了方便修改和拓展,所以就根據(jù)自己項目的需求自定義了一個序列幀播放組件來輔助開發(fā)。先貼上圖片看看效果,如下圖就是這個ImageAnimation腳本組件,我們只需要創(chuàng)建一個Image,然后掛載上這個腳本,將需要播放的圖片賦給腳本上的Sprite數(shù)組,根據(jù)自己需求可在編輯面板設(shè)定圖片的循環(huán)播放方式、播放速度、以及是否自動播放,還可根據(jù)自己的需求添加回調(diào)函數(shù)。很方便。

好了,廢話不多說了,上代碼,腳本開放出來了播放Play()、暫停Pause()、停止Stop()、重播Replay() 4個公共方法,以及一個回調(diào)函數(shù),根據(jù)自己的需求直接調(diào)用這4個方法和回調(diào)來控制自己的圖片播放控制就好。腳本不是很復雜,主要是希望給大家提供一種思路,在項目開發(fā)中可以根據(jù)自己的需求封裝一些功能出來來輔助自己開發(fā),以提高效率。這次分享就到這里了,大家有什么問題和意見都可以和我交流、探討,一起學習進步。
/***********************************
* Description:描述這是一個圖片序列幀播放腳本,
* Mountpoint:掛載點將其掛載在Image組件上
* Date:2019.07.11
* Version:unity版本2017.2.0f3
* Author:LJF
***********************************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using LjfLog;
using UnityEngine.Events;
namespace LJF
{
//規(guī)范命名、添加注釋、合理封裝、限制訪問權(quán)限、異常處理
public class ImageAnimation : MonoBehaviour
{
public enum State
{
idle,
playing,
pause
}
public enum State1
{
once,
loop
}
[Header("播放方式(循環(huán)、單次)")]//默認單次
public State1 condition=State1.once;
[Header("自動播放")]//默認不自動播放
public bool Play_Awake = false;
//播放狀態(tài)(默認、播放中、暫停)
private State play_state;
private Image manimg;
[Header("每秒播放的幀數(shù)(整數(shù))")]
public float frame_number=30;
[Header("sprite數(shù)組")]
public Sprite[] sprit_arr;
//回調(diào)事件
public UnityEvent onCompleteEvent;
private int index;
private float tim;
private float waittim;
private bool isplay;
void Awake()
{
manimg = GetComponent<Image>();
tim = 0;
index = 0;
waittim = 1 / frame_number;
play_state = State.idle;
isplay = false;
if (manimg == null)
{
Debuger.LogWarning("Image為空,請?zhí)砑覫mage組件?。?!");
return;
}
if (sprit_arr.Length<1)
{
Debuger.LogWarning("sprite數(shù)組為0,請給sprite數(shù)組添加元素!??!");
}
manimg.sprite = sprit_arr[0];
if (Play_Awake)
{
Play();
}
}
void Update()
{
//測試
if (Input.GetKeyDown(KeyCode.A))
{
Play();
}
if (Input.GetKeyDown(KeyCode.S))
{
Replay();
}
if (Input.GetKeyDown(KeyCode.D))
{
Stop();
}
if (Input.GetKeyDown(KeyCode.P))
{
Pause();
}
UpMove();
}
private void UpMove()
{
//單播
if (condition == State1.once)
{
if (play_state == State.idle && isplay)
{
play_state = State.playing;
index = 0;
tim = 0;
}
if (play_state == State.pause && isplay)
{
play_state = State.playing;
tim = 0;
}
if (play_state == State.playing && isplay)
{
tim += Time.deltaTime;
if (tim >= waittim)
{
tim = 0;
index++;
if (index >= sprit_arr.Length)
{
index = 0;
manimg.sprite = sprit_arr[index];
isplay = false;
play_state = State.idle;
//此處可添加結(jié)束回調(diào)函數(shù)
if (onCompleteEvent != null)
{
onCompleteEvent.Invoke();
return;
}
}
manimg.sprite = sprit_arr[index];
}
}
}
//循環(huán)播放
if (condition == State1.loop)
{
if (play_state == State.idle && isplay)
{
play_state = State.playing;
index = 0;
tim = 0;
}
if (play_state == State.pause && isplay)
{
play_state = State.playing;
tim = 0;
}
if (play_state == State.playing && isplay)
{
tim += Time.deltaTime;
if (tim >= waittim)
{
tim = 0;
index++;
if (index >= sprit_arr.Length)
{
index = 0;
//此處可添加結(jié)束回調(diào)函數(shù)
}
manimg.sprite = sprit_arr[index];
}
}
}
}
/// <summary>
/// 播放
/// </summary>
public void Play()
{
isplay = true;
}
/// <summary>
/// 暫停
/// </summary>
public void Pause()
{
isplay = false;
play_state = State.pause;
}
/// <summary>
/// 停止
/// </summary>
public void Stop()
{
isplay = false;
play_state = State.idle;
index = 0;
tim = 0;
if (manimg == null)
{
Debuger.LogWarning("Image為空,請賦值");
return;
}
manimg.sprite = sprit_arr[index];
}
/// <summary>
/// 重播
/// </summary>
public void Replay()
{
isplay = true;
play_state = State.playing;
index = 0;
tim = 0;
}
}
}到此這篇關(guān)于聊聊Unity自定義組件之序列幀播放組件問題的文章就介紹到這了,更多相關(guān)Unity序列幀播放組件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中this用法系列(二) 通過this修飾符為原始類型擴展方法
定義一個靜態(tài)類,類中定義靜態(tài)方法,方法中參數(shù)類型前邊加上this修飾符,即可實現(xiàn)對參數(shù)類型的方法擴展,下面通過實例代碼給大家介紹下,需要的朋友參考下吧2016-12-12

