TickTimer - cheona-thousand-man/Unity-myBasics-Wiki GitHub Wiki

๊ฐœ์š”

  • Photon์—์„œ ๋„คํŠธ์›Œํฌ ๊ฐ์ฒด ์ƒํƒœ ๋™๊ธฐํ™”ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ(๋™๊ธฐํ™”๋œ ๊ฐ€์ƒ์˜ ํƒ€์ด๋จธ)
  • NetworkRunner์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ
  • ๋ชฉํ‘œ Tick(TickTimer ์ดˆ๊ธฐํ™” ์‹œ ์ €์žฅ)์„ ์ €์žฅํ•˜๊ณ  ํ˜„์žฌ simulation Tick(NetworkRunner์—์„œ ๊ฐ€์ ธ์˜ด)์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์‚ฌ ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ์ฒด

API

  • CreateFromSeconds ์ œ๊ณตํ•œ Seconds์™€ ํ˜„์žฌ Tick์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์‚ฐ๋œ ๋ชฉํ‘œ Tick์ด ํฌํ•จ๋œ TickTimer ๋ฐ˜ํ™˜
  • CreateFromTicks ์ œ๊ณตํ•œ Ticks๊ณผ ํ˜„์žฌ Tick์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์‚ฐ๋œ ๋ชฉํ‘œ Tick์ด ํฌํ•จ๋œ TickTimer ๋ฐ˜ํ™˜
  • RemainingTime TickTimer ๋งŒ๋ฃŒ๊นŒ์ง€ ๋‚จ์€ Seconds ๋ฐ˜ํ™˜
  • RemainingTicks TickTimer ๋งŒ๋ฃŒ๊นŒ์ง€ ๋‚จ์€ Ticks ๋ฐ˜ํ™˜
  • IsRunning ๋ชฉํ‘œ Tick > ํ˜„์žฌ Tick ? true : false
  • Expired ๋ชฉํ‘œ Tick <= ํ˜„์žฌ Tick ? true : false
  • ExpiredOrNotRunning TickTimer ์ƒํƒœ๊ฐ€ default or TickTimer.None or Expired์ผ ๊ฒฝ์šฐ true ๋ฐ˜ํ™˜

TickTimer ์ดˆ๊ธฐํ™”

  • TickTimer๊ฐ€ ๋งŒ๋ฃŒ๋œ ๊ฒฝ์šฐ, ๋งค Tick๋งˆ๋‹ค true ๋ฐ˜ํ™˜
  • ๋งŒ๋ฃŒ ํ›„ ๋‘ ๋ฒˆ์งธ Tick๋ถ€ํ„ฐ๋Š” ์žฌ์„ค์ •ํ•˜๋Š” ๊ฒŒ ์œ ์šฉ
[Networked] TickTimer timer { get; set; }

void FixedUpdateNetwork()
{
  if (timer.Expired(Runner))
  {
    // Execute Logic

    // Reset timer
    timer = TickTimer.None;
    // alternatively: timer = default.

    Debug.Log("Timer Expired");
  }
}

์ปค์Šคํ…€ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

  • CustomTickTimer ์ƒ์„ฑ
public struct CustomTickTimer : INetworkStruct
{
  private int _target;
  private int _initialTick;

  public bool Expired(NetworkRunner runner) => runner.IsRunning && _target > 0
    && (Tick) _target <= runner.Simulation.Tick;

  public bool IsRunning => _target > 0;

  public static CustomTickTimer CreateFromTicks(NetworkRunner runner, int ticks)
  {
    if (runner == false || runner.IsRunning == false)
      return new CustomTickTimer();

    CustomTickTimer fromTicks = new CustomTickTimer();
    fromTicks._target = (int) runner.Simulation.Tick + ticks;
    fromTicks._initialTick = runner.Simulation.Tick;
    return fromTicks;
  }

  public float NormalizedValue(NetworkRunner runner)
  {
    if (runner == null || runner.IsRunning == false || IsRunning == false)
      return 0;

    if (Expired(runner))
      return 1;

    return ElapsedTicks(runner) / (_target - (float)_initialTick);
  }

  public int ElapsedTicks(NetworkRunner runner)
  {
    if (runner == false || runner.IsRunning == false)
      return 0;

    if (IsRunning == false || Expired(runner))
      return 0;

    return runner.Simulation.Tick - _initialTick;
  }
}
  • CustomTickTimer ์‚ฌ์šฉ
[Networked]
public CustomTickTimer MyTickTimer { get; set; }

public void StartTimer()
{
  if (Runner.IsServer)
  {
    MyTickTimer = CustomTickTimer.CreateFromTicks(Runner, 120);
  }
}

public override void FixedUpdateNetwork()
{
  Debug.Log($"Elapsed {MyTickTimer.ElapsedTicks(Runner)} ticks.");
  Debug.Log($"Normalized Value {MyTickTimer.NormalizedValue(Runner)}.");

  if (MyTickTimer.Expired(Runner))
  {
    // Execute Logic

    // Reset timer
    MyTickTimer = default;

    Debug.Log("Timer Finished on tick: " + Runner.Simulation.Tick);
  }
}