簡易カウントダウンタイマ

using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;
using UnityEngine.UI;

public class CountDownTimer : UdonSharpBehaviour
{
   [UdonSynced]
   bool TimerActive; //タイマ有効フラグ

   [SerializeField]
   int TimerMinitesVal; //タイマ設定値(分単位)

   [UdonSynced]
   int Timer_Minites; //分の表示用変数

   [UdonSynced]
   int Timer_Seconds; //秒の表示用変数

   [SerializeField]
   Text TimerText; //カウントダウンを表示するuGUI Text

   System.DateTime startTime; //カウントスタートした日時

   System.TimeSpan countTimeSpan; //設定値を適用するTimeSpan

   void Start()
   {
       countTimeSpan = new System.TimeSpan(0, TimerMinitesVal, 0);
   }
   
   //Button等でTimerStartを叩く
   public void TimerStart()
   {
       if (Networking.IsOwner(Networking.LocalPlayer, this.gameObject))
       {
           if(!TimerActive)
           {
               SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, nameof(SetStartTime));
               TimerActive = true;
           }
       }
   }
   
   //開始時刻を保持
   public void SetStartTime()
   {
       startTime = System.DateTime.Now;
   }

   public void TimerFinish()
   {
       TimerActive = false;
       
   }
   
   //Update内で開始時刻と現在時刻の差をTimeSpanとして計算し、
   //設定分数を適用したTimeSpanとの差からカウントダウン分数と秒数を得る
   private void Update()
   {
       if(TimerActive)
       {
           if(Networking.IsOwner(Networking.LocalPlayer, this.gameObject))
           {        
               var timeSpanFromStart = System.DateTime.Now - startTime;
               var DifTimeSpan = countTimeSpan - timeSpanFromStart;

               Timer_Minites = DifTimeSpan.Minutes;
               Timer_Seconds = DifTimeSpan.Seconds;

               TimerText.text = string.Format("{0:0} : {1:00}", Timer_Minites, Timer_Seconds);

               RequestSerialization();

               if (DifTimeSpan.TotalSeconds < 0)
               {
                   TimerFinish();
               }
               
           }
       }
   }

   public override void OnDeserialization()
   {
       if(TimerActive)
       {
           TimerText.text = string.Format("{0:0} : {1:00}", Timer_Minites, Timer_Seconds);
       }
   }

  

}

この記事が気に入ったらサポートをしてみませんか?