Change Detection - cheona-thousand-man/Unity-myBasics-Wiki GitHub Wiki
Fusion์ ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ผ๋ก ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ์ ๊ณต
-
Render()
๋ณ๊ฒฝ ๊ฐ์ง ๋ณ๊ฒฝ์ด ๊ฐ์ง๋์์ ๋ ์คํ๋๋ ์ฝ๋๊ฐ ๊ฒ์ ํ๋ ์ด ์๋ฎฌ๋ ์ด์ ์ ์ํฅ์ ๋ฏธ์น์ง ์๊ณ ์๊ฐ์ ์ธ ๋ชฉ์ ์ผ๋ก๋ง ์กด์ฌ- ๊ฑด๊ฐ ๋คํธ์ํฌ ์์ฑ์ด ๋ณ๊ฒฝ๋ ๋ UI Health ๋ฐ ์ ๋ฐ์ดํธ
- ์์ ๋คํธ์ํฌ ์์ฑ์ด ๋ณ๊ฒฝ๋ ๋ ํ๋ ์ด์ด์ ๋ฉ์ฌ ๋ ๋๋ฌ ์์ ์ ๋ฐ์ดํธ
-
FixedUpdateNetwork()
๋ณ๊ฒฝ ๊ฐ์ง [Host/Server Mode] ๋ณ๊ฒฝ ๊ฐ์ง๊ฐ ๊ฒ์ ํ๋ ์ด์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝ์ฐ- ์คํ๋ฏธ๋ ๋คํธ์ํฌ ์์ฑ์ด 50 ์ดํ๋ก ๋จ์ด์ง ๋ ํ๋ ์ด์ด์ ์ด๋ ์๋๊ฐ 50% ๊ฐ์
-
FixedUpdateNetwork
์์ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ์คํํ๋ฉด ํด๋ผ์ด์ธํธ ์ธก ์์ธก๊ณผ ์๋ฒ์ ์๋ฎฌ๋ ์ด์ ์ด ์ผ์นํ๊ณ ์ฌ๋ฐ๋ฅธ ๋กค๋ฐฑ ๊ฐ๋ฅ
-
- ์คํ๋ฏธ๋ ๋คํธ์ํฌ ์์ฑ์ด 50 ์ดํ๋ก ๋จ์ด์ง ๋ ํ๋ ์ด์ด์ ์ด๋ ์๋๊ฐ 50% ๊ฐ์
- ์ปค์คํ ๋ณ๊ฒฝ ๊ฐ์ง ์ปค์คํ ๊ฐ๊ฒฉ์ผ๋ก ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ์๋์ผ๋ก ์คํ
- [Shared Mode]
Render()
๋ณ๊ฒฝ ๊ฐ์ง๊ฐ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ถฉ๋ถํจ
- ๋คํธ์ํฌ ์์ฑ์ ๋ณ๊ฒฝ์ ๊ฐ์งํ๋ ค๋ฉด,
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)
๋ ๋ฉ์๋ ์ด๋ฆ ๋ฌธ์์ด์ ์์ฑ์ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ํจ์ ์ด๋ฆ์ ๋ฆฌํฉํ ๋งํ ๋ ์์ฑ์ด ์๋์ผ๋ก ์ ์ด๋ฆ์ผ๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
- 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}");
}
}
- 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๋
OnChangedRender
์์ฑ๋ณด๋ค ๋ ๋ง์ ์ ์ฐ์ฑ ์ ๊ณต -
FixedUpdateNetwork
์์ ๋ณ๊ฒฝ ๊ฐ์ง ๋๋ ์๋ ๊ฐ๊ฒฉ์์ ๋ณ๊ฒฝ ๊ฐ์ง ํ์ฉ