如果這令人困惑,我不完全確定如何表達問題,非常抱歉。無論如何,就背景關系而言,我正在統一制作一種掃雷型別的游戲,而原始游戲的其中一個東西就是計時器。
uj5u.com熱心網友回復:
協程非常適合這一點。在這里試試這個代碼:
public Image image;
public Sprite[] sprites;
private bool isStop = true;
private void Start()
{
isStop = false;
StartCoroutine(Timer());
}
private IEnumerator Timer()
{
while (!isStop)
{
for (int i = 0; i < sprites.Length; i )
{
if (isStop) break;
image.sprite = sprites[i];
yield return new WaitForSeconds(1f);
}
}
}
uj5u.com熱心網友回復:
您可以轉換float
為int
int spriteIndex = (int)Math.Round(timer);
并用作spriteIndex
陣列精靈的索引。或者...如果您需要為每個精靈使用不同的時間間隔,您可以為此影片制作特殊的結構。例如:
[Serializable]
public struct SpriteFrame
{
public Sprite FrameSprite;
public float TimeToShow;
}
public class SpriteAnimationComponent : MonoBehaviour
{
public Image ScoreCount;
public List<SpriteFrame> Frames = new List<SpriteFrame>();
private int _currentFrame = 0;
private float _currentPlayAnimationTime = 0f;
private bool IsPlay => _currentFrame < Frames.Count;
public void Start()
{
UpdateFrame();
}
public void Update()
{
if(!IsPlay)
return;
_currentPlayAnimationTime = Time.deltaTime;
if(NeedShowNextFrame())
ShowNextFrame();
}
private bool NeedShowNextFrame()
=> Frames[_currentFrame].TimeToShow < _currentPlayAnimationTime;
private void ShowNextFrame()
{
_currentPlayAnimationTime -= Frames[_currentFrame].TimeToShow;
_currentFrame ;
if(IsPlay)
{
UpdateFrame();
}
}
private void UpdateFrame()
{
ScoreCount.sprite = Frames[_currentFrame].FrameSprite;
}
}
您需要在 SpriteFrame 上使用 SerializableAttribute ( [Serializable]
) 在 Unity Inspector 中顯示結構。在當前代碼影片顯示一次,但你可以讓它回圈。對于回圈影片,只需在_currentFrame %= Frames.Count
之后添加_currentFrame
uj5u.com熱心網友回復:
我假設你有 10 個精靈適合你的數字 0-9。
numberSprite[0] 將保存精靈為“0”,numberSprite[1] 將洞“1”,等等。
假設計時器在后端的 319.8f 秒處。您需要顯示 3 個精靈:3、1、9。
為此,您需要打破計時器值并將精靈分別設定為百分之一、十分之一和秒。你可以這樣做:
int timerInt = (int)Mathf.floor(timer); //Get the int value of the timer
int hundredth = (timerInt/100) % 10; // (319/100) => 3 ... (3 % 10) => 3
scoreCountHundredths.sprite = numberSprite[hundredth];
int tenth = (timerInt /10) % 10; //(319/10) => 31 ... (31 % 10) => 1
scoreCountTenths.sprite = numberSprite[tenth];
int second = timerInt % 10; // (319 % 10) => 9
scoreCountSeconds.sprite = numberSprite[second];
使用上面的代碼,您的計時器應該正確更新為 000-999 之間的任何數字,只需要上傳 10 個精靈。此外,如果您的計時器由于模 (%) 邏輯而超過 999,它將自動回圈。
警告。協程或 InvokeRepeating 在這里可能是一個陷阱: 協程可用于跟蹤更新精靈之間的時間,但您可能希望將此顯示直接與游戲中的時間聯系起來。依靠協程更新精靈將游戲內計時器與顯示幕分離,因為它們沒有內置的追趕行為。如果您的幀稍微延遲或完全滯后,則在使用協程或 InvokeRepeating 時,您將面臨時間運行速度變慢的風險。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/478321.html