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 ํ™œ์„ฑ



์•„๋‹ˆ ๋ฌด์Šจ ํด๋ž˜์Šค ํ•˜๋‚˜ ๋ถˆ๋Ÿฌ์˜ค๋Š”๋ฐ ๋ญ๊ฐ€ ์ด๋ ‡๊ฒŒ ์งœ์ฆ๋‚˜ ใ……ใ…‚ ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹