Change Detection - cheona-thousand-man/Unity-myBasics-Wiki GitHub Wiki

๊ฐœ์š”

Fusion์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ์ง€๋ฅผ ์ œ๊ณต

  • Render() ๋ณ€๊ฒฝ ๊ฐ์ง€ ๋ณ€๊ฒฝ์ด ๊ฐ์ง€๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ณ  ์‹œ๊ฐ์ ์ธ ๋ชฉ์ ์œผ๋กœ๋งŒ ์กด์žฌ
    • ๊ฑด๊ฐ• ๋„คํŠธ์›Œํฌ ์†์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ UI Health ๋ฐ” ์—…๋ฐ์ดํŠธ
    • ์ƒ‰์ƒ ๋„คํŠธ์›Œํฌ ์†์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ํ”Œ๋ ˆ์ด์–ด์˜ ๋ฉ”์‰ฌ ๋ Œ๋”๋Ÿฌ ์ƒ‰์ƒ ์—…๋ฐ์ดํŠธ
  • FixedUpdateNetwork() ๋ณ€๊ฒฝ ๊ฐ์ง€ [Host/Server Mode] ๋ณ€๊ฒฝ ๊ฐ์ง€๊ฐ€ ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ
    • ์Šคํƒœ๋ฏธ๋‚˜ ๋„คํŠธ์›Œํฌ ์†์„ฑ์ด 50 ์ดํ•˜๋กœ ๋–จ์–ด์งˆ ๋•Œ ํ”Œ๋ ˆ์ด์–ด์˜ ์ด๋™ ์†๋„๊ฐ€ 50% ๊ฐ์†Œ
      • FixedUpdateNetwork์—์„œ ๋ณ€๊ฒฝ ๊ฐ์ง€๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์ธก ์˜ˆ์ธก๊ณผ ์„œ๋ฒ„์˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์ด ์ผ์น˜ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๋กค๋ฐฑ ๊ฐ€๋Šฅ
  • ์ปค์Šคํ…€ ๋ณ€๊ฒฝ ๊ฐ์ง€ ์ปค์Šคํ…€ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ์ง€๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰
  • [Shared Mode] Render() ๋ณ€๊ฒฝ ๊ฐ์ง€๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ถฉ๋ถ„ํ•จ

OnChangedRender

  • ๋„คํŠธ์›Œํฌ ์†์„ฑ์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๋ ค๋ฉด, OnChangedRender ์†์„ฑ์„ ํ•ด๋‹น ์†์„ฑ์— ์ถ”๊ฐ€
    • ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์ธ์ˆ˜๋กœ ๋ฐ›์Œ
    • ์ฃผ์–ด์ง„ ๋ฉ”์„œ๋“œ๋Š” ๋™์ผํ•œ NetworkBehaviour์—์„œ void ํ•จ์ˆ˜

์ค‘์š”: OnChangedRender๋Š” ๊ฐ์ฒด๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ์ฒ˜์Œ์œผ๋กœ ์Šคํฐ๋  ๋•Œ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด Spawned ํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๊ณ  ๊ฑฐ๊ธฐ์„œ ๋ณ€๊ฒฝ๋œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

public class Example : NetworkBehaviour
{
    [Networked, OnChangedRender(nameof(OnColorChanged))]
    public Color NetworkedColor { get; set; }

    public Material material;

    public void OnColorChanged()
    {
        material.color = NetworkedColor;
    }
}

nameof(OnColorChanged)๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๋ฌธ์ž์—ด์„ ์†์„ฑ์— ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ์†์„ฑ์ด ์ž๋™์œผ๋กœ ์ƒˆ ์ด๋ฆ„์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

OnNetworkedPropertyChanged

  • NetworkedProperty์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ํ˜ธ์ถœ
  • ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ํ›„ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์™€์˜ ๋™๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์—…๋ฐ์ดํŠธ, ๊ฒŒ์ž„ ๋กœ์ง ์ˆ˜ํ–‰
public class Player : NetworkBehaviour
{
    [Networked]
    public int HP { get; set; }

    public override void OnNetworkedPropertyChanged<T>(T oldValue, T newValue)
    {
        base.OnNetworkedPropertyChanged<T>(oldValue, newValue);

        // ์ฒด๋ ฅ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค UI ์—…๋ฐ์ดํŠธ
        if (typeof(T) == typeof(int) && newValue is int newHP)
        {
            UpdateHealthUI(newHP);
        }
    }

    private void UpdateHealthUI(int newHP)
    {
        // UI ์š”์†Œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ฝ”๋“œ
        Debug.Log($"Player's health updated to: {newHP}");
    }
}

OnStateChanged

  • NetworkBehaviour์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ํ˜ธ์ถœ
  • ์ƒํƒœ ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ ์ถ”๊ฐ€์ ์ธ ์ดˆ๊ธฐํ™”๋‚˜ ์„ค์ • ์ž‘์—… ์ˆ˜ํ–‰
  • NetworkedProperty๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ์ฒด์˜ ์ „์ฒด์ ์ธ ์ƒํƒœ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ๊ฐ์ง€
public class Player : NetworkBehaviour
{
    [Networked]
    public bool IsDead { get; set; }

    public override void OnStateChanged()
    {
        base.OnStateChanged();

        // ํ”Œ๋ ˆ์ด์–ด์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋จ
        if (IsDead)
        {
            HandlePlayerDeath();
        }
    }

    private void HandlePlayerDeath()
    {
        // ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ฃฝ์—ˆ์„ ๋•Œ ์ฒ˜๋ฆฌํ•  ๋กœ์ง
        Debug.Log("Player has died. Triggering death sequence...");
        // ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒŒ์ž„ ์˜ค๋ฒ„ ํ™”๋ฉด์„ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ๋ฆฌ์Šคํฐ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    }
}

์ด์ „ ๊ฐ’

๋ณ€๊ฒฝ ๋ฐœ์ƒ ์ „์˜ ์ด์ „ ๊ฐ’ ์ ‘๊ทผ

[Networked]
[OnChangedRender(nameof(CounterChanged))]
public int Counter { get; set; }

void CounterChanged(NetworkBehaviourBuffer previous)
{
    var prevValue = GetPropertyReader<int>(nameof(Counter)).Read(previous);
    Log.Info($"counter changed: {Counter}, prev: {prevValue}");
}

GetPropertyReader<T>๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํƒ€์ž…์€ ๋„คํŠธ์›Œํฌ ์†์„ฑ์˜ ํƒ€์ž…๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ChangeDetector

  • ChangeDetector๋Š” OnChangedRender ์†์„ฑ๋ณด๋‹ค ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ ์ œ๊ณต
  • FixedUpdateNetwork์—์„œ ๋ณ€๊ฒฝ ๊ฐ์ง€ ๋˜๋Š” ์ˆ˜๋™ ๊ฐ„๊ฒฉ์—์„œ ๋ณ€๊ฒฝ ๊ฐ์ง€ ํ—ˆ์šฉ
โš ๏ธ **GitHub.com Fallback** โš ๏ธ