public abstract class Test : MonoBehaviour
{
ย ย public virtual bool IsLocked { get; set; } = false;
ย ย public abstract class Street : Test
ย ย {
ย ย ย ย public class Street34 : Street
ย ย ย ย {
ย ย ย ย ย ย [SerializeField]
ย ย ย ย ย ย public override bool IsLocked { get; set; } = true;
ย ย ย ย }
ย ย }
}
Test ์ถ์ ํด๋์ค์ ๊ฐ์์์ฑ IsLocked๊ฐ ์๊ณ ๊ฐ์ด ๋ค์ด์์
์์ ํด๋์ค Street34๋ IsLocked๋ผ๋ ๊ฐ์์์ฑ์ ์ค๋ฒ๋ผ์ด๋ํจ
public class TestRoom : Test.Street.Street34
{
ย ย // Start is called before the first frame update
ย ย void Start()
ย ย {
ย ย ย ย Debug.Log($"{this.IsLocked.ToString()}");
ย ย }
}
๊ทธ๋ฆฌ๊ณ ๋น GameObject ๊ฐ์ฒด์ TestRoom์ด๋ผ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฐ๊ณ ์ด ์คํฌ๋ฆฝํธ๊ฐ Street34๋ฅผ ์์ํ๊ฒ ํ ๋ค์
IsLocked๋ฅผ ์ถ๋ ฅํ๊ฒ ํจ
๊ฒฐ๊ณผ๊ฐ : true
ใ ใ ์ ์๋ํจ
๊ทผ๋ฐ ์ฝ์์ฐฝ์ ์ค๋ฅ ๋ธ
The same field name is serialized multiple times in the class or its parent class. This is not supported: Base(TestRoom) <IsLocked>k__BackingField
๋ผ๊ณ ํจ
๊ทธ๋์ ์ฑ๋ดํํ ๋ฌผ์ด๋ด
์ด ์ค๋ฅ๋ ์ง๋ ฌํ(serialization)๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ์ง๋ ฌํ๋ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ฑฐ๋ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์กํ๊ธฐ ์ํด ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค.
Unity์์๋ MonoBehaviour๋ฅผ ์์๋ฐ์ ํด๋์ค๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง๋ ฌํ๊ฐ ๊ฐ๋ฅํ๋๋ก ๋์ด ์์ต๋๋ค. ์ด ๋ ์ง๋ ฌํ๊ฐ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ํด๋น ํด๋์ค๊ฐ SerializableAttribute๋ก ๋งํฌ๋์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์์ ์ฝ๋์์๋ IsLocked ํ๋กํผํฐ๋ฅผ ์ง๋ ฌํํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด์ ๋ TestRoom ํด๋์ค๊ฐ Test.Street.Street34 ํด๋์ค๋ฅผ ์์ํ๋ฉด์, IsLocked ํ๋กํผํฐ๋ฅผ ์ค๋ณต์ผ๋ก ์ง๋ ฌํํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ IsLocked ํ๋กํผํฐ๋ฅผ [NonSerialized] ์์ฑ์ผ๋ก ๋งํฌํ๊ฑฐ๋, [SerializeField] ์์ฑ์ ์ ๊ฑฐํ๋ฉด ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด [NonSerialized] ์์ฑ์ ์ฌ์ฉํ๋ฉด ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
csharp
Copy code
public abstract class Test : MonoBehaviour { [NonSerialized] public virtual bool IsLocked { get; set; } = false; public abstract class Street : Test { public class Street34 : Street { [NonSerialized] public override bool IsLocked { get; set; } = true; } } } public class TestRoom : Test.Street.Street34 { // Start is called before the first frame update void Start() { Debug.Log($"{this.IsLocked.ToString()}"); } }
์ด๋ ๊ฒ ๋ณ๊ฒฝํ๋ฉด, IsLocked ํ๋กํผํฐ๊ฐ ์ง๋ ฌํ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ค๋ณต ์ง๋ ฌํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋๊น... [NonSerialized]๋ฅผ ๋ถ์ด๋ ๋ง์ด์ง?
๊ทธ๋์ ๋ถ์
public abstract class Test : MonoBehaviour
{
ย ย [NonSerialized]
ย ย public virtual bool IsLocked { get; set; } = false;
ย ย public abstract class Street : Test
ย ย {
ย ย ย ย public class Street34 : Street
ย ย ย ย {
ย ย ย ย ย ย [NonSerialized]
ย ย ย ย ย ย public override bool IsLocked { get; set; } = true;
ย ย ย ย }
ย ย }
}
์ง์ ์ปดํ์ผ ์๋ฌ
์ฌ๊ฐ๋ ์ฝ๋ ์ค๋ช ํ๋ก์ ํธ ํ์ผ ์ค ๋นํ์ ์ค๋ฅ(Suppression) ์ํ
์ค๋ฅ CS0592 ์ด ์ ์ธ ํ์์์๋ 'NonSerialized' ํน์ฑ์ด ์ ํจํ์ง ์์ต๋๋ค. ์ด ํน์ฑ์ 'ํ๋' ์ ์ธ์์๋ง ์ ํจํฉ๋๋ค. Assembly-CSharp, Assembly-CSharp.Player C:\Users\alter\My project (8)\Assets\Test.cs 8 ํ์ฑ
์๋ ๋ฌด์จ ํด๋์ค ํ๋ ๋ถ๋ฌ์ค๋๋ฐ ๋ญ๊ฐ ์ด๋ ๊ฒ ์ง์ฆ๋ ใ ใ ใ ใ ใ ใ ใ
Test๊ฐ MonoBehaviour๋ฅผ ์์๋ฐ์์ผํ๋ฉด IsLocked๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ ํด๋์ค๋ฅผ ๋ฐ๋ก ๋ค๊ณ ์๋๊ฒ ๋์๋ฏ
field:NonSerialized๋ ์๋๋??