[Unity] null ์ฒดํฌ

2024. 4. 27. 13:55ยท๐Ÿ“ Game/โœ Unity

1. UnityEngine.Object == null

๊ฐœ๋ฐœ ์‹œ ๊ฐ์ฒด๊ฐ€ ์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด == null ์ฒดํฌ๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ณค ํ•œ๋‹ค. ๊ณผ์—ฐ ์ด ๋ฐฉ๋ฒ•์ด ์ตœ์„ ์ผ๊นŒ?

 

2. fake null

"UnityEngine.Object == null์—์„œ์˜ null์ด ์ง„์งœ null์ด ์•„๋‹ˆ๋‹ค! ์ฆ‰, fake null์ด๋‹ค"๋ผ๋Š” ๋ง์ด ์กด์žฌํ•œ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ?

 

์›์ธ์€ ์œ ๋‹ˆํ‹ฐ์—์„œ์˜ null๊ณผ System์—์„œ์˜ null์˜ ์ฐจ์ด์ด๋‹ค. ์ด ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, UnityEngine.Object์™€ System.Object์˜ null ์ฒดํฌ ๊ฐ’์ด ๋‹ค๋ฅธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

var obj = new GameObject();
yield return null; 

Destroy(obj);
yield return null; 

print($".Net Object : {(obj as System.Object) == null}");
print($"Unity Object : {(obj as UnityEngine.Object) == null}");


//๊ฒฐ๊ณผ
//.Net Object : False
//Unity Object : True

 

UnityEngine.Object ํด๋ž˜์Šค๋Š” ์œ ๋‹ˆํ‹ฐ์—์„œ ์ƒ์„ฑํ•œ nativeObject ๊ฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Wrapping ํด๋ž˜์Šค์ด๋‹ค. ์œ ๋‹ˆํ‹ฐ๋Š” ์‹ค์ œ๋กœ๋Š” C++๋กœ ๊ตฌํ˜„๋˜์–ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„ nativeObject ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ํ•ด์ œํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ UnityEngine.Object๋Š” C#์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ ํ•ด์ œํ•œ๋‹ค.

  • C++ nativeObject: ์ฆ‰์‹œ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ
  • C# UnityEngine.Object: ์ฆ‰์‹œ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋˜์ง€ ์•Š๊ณ  ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ์— ์˜ํ•ด ํ•ด์ œ

 

์ฆ‰, ์•Œ๋งน์ด(C++ NativeObject)๋งŒ ์‚ฌ๋ผ์ง€๊ณ  ๊ป๋ฐ๊ธฐ(UnityEngine.Object)๋Š” ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌํ•ด ์ค„ ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

3. ๋น„๊ต ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ

Rider IDE์—์„œ fake null๋กœ null ์ฒดํฌ๋ฅผ ํ•˜๋ฉด ๋‹ค์Œ๊ฐ€ ๊ฐ™์€ ์•ˆ๋‚ด๊ฐ€ ๋‚˜์˜จ๋‹ค. ๋‹จ์ˆœํ•œ null ์ฒดํฌ์ธ ์ค„ ์•Œ์•˜๋Š”๋ฐ, ์™œ ๋น„์šฉ์ด ํด๊นŒ?

 

Rider

 

UnityEngine.Object์˜ ==, != ์—ฐ์‚ฐ์ž๋Š” ๋น„๊ต ์—ฐ์‚ฐ์ž๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•œ ๊ฒƒ์œผ๋กœ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋งŽ์€ ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  • object ํƒ€์ž…์œผ๋กœ ๋‹ค์šด์บ์ŠคํŒ… ํ›„ null ๋น„๊ต ์ง„ํ–‰
  • lhs ํ˜น์€ rhs๊ฐ€ null์ด ์•„๋‹ ๊ฒฝ์šฐ IsNativeObjectAlive() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ์•„์ง ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌ
  • IsNativeObjectAlive() ํ•จ์ˆ˜
    • ํฌ์ธํ„ฐ ๊ฐ’์ด ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌ
    • MonoBehaviour ํƒ€์ž…์ด๊ฑฐ๋‚˜ ScriptableObject ํƒ€์ž…์ผ ๊ฒฝ์šฐ์—” ์•„์˜ˆ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š๊ณ  False ๋ฆฌํ„ด
    • InstanceID๊ฐ€ ๋™์ผํ•œ ์˜ค๋ธŒ์ ํŠธ์ธ์ง€ ๊ฒ€์‚ฌ

 

 // UnityEngine.Object
public static bool operator==(Object x, Object y) { return CompareBaseObjects(x, y); }
public static bool operator!=(Object x, Object y) { return !CompareBaseObjects(x, y); }
static bool CompareBaseObjects(UnityEngine.Object lhs, UnityEngine.Object rhs)
{
	bool lhsNull = ((object)lhs) == null;
	bool rhsNull = ((object)rhs) == null;

	if (rhsNull && lhsNull) return true;

	if (rhsNull) return !IsNativeObjectAlive(lhs);
	if (lhsNull) return !IsNativeObjectAlive(rhs);

	return lhs.m_InstanceID == rhs.m_InstanceID;
}
static bool IsNativeObjectAlive(UnityEngine.Object o)
{
	if (o.GetCachedPtr() != IntPtr.Zero)
		return true;
	if (o is MonoBehaviour || o is ScriptableObject)
		return false;
	return DoesObjectWithInstanceIDExist(o.GetInstanceID());
}

[NativeMethod(Name = "UnityEngineObjectBindings::DoesObjectWithInstanceIDExist", IsFreeFunction = true, IsThreadSafe = true)]
internal extern static bool DoesObjectWithInstanceIDExist(int instanceID);

 

3. ๊ฐœ์„ 

1) is null (C# 7.0)

object[] data = { 1, null, 10, new Circle(5), new Person("Lee"), "" };

foreach (var item in data)
{
    if (item is null)
    {
        Console.WriteLine("NULL ์ฐพ์•˜์Œ");
    }
}

 

2023.01.14 - [๐Ÿ“ Language/โœ C#] - [C# 7.0] ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ (1) - ํŒจํ„ด ๋งค์นญ

 

[C# 7.0] ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ (1) - ํŒจํ„ด ๋งค์นญ

C# 7.0์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ํŒจํ„ด ๋งค์นญ ํŠœํ”Œ (Tuple) ๋กœ์ปฌ ํ•จ์ˆ˜ (Local Function) out ํŒŒ๋ผ๋ฏธํ„ฐ ์ž๋ฆฟ์ˆ˜ ๋ถ„๋ฆฌ์ž์™€ ์ด์ง„ ๋ฆฌํ„ฐ๋Ÿด Deconstructor ref local๊ณผ ref return async ์ปค์Šคํ…€ ๋ฆฌํ„ด ํƒ€์ž… ํ–ฅ์ƒ๋œ Expression-bodied ํ‘œํ˜„ throw exp

tech-interview.tistory.com

 

2) ReferenceEquals

object[] data = { 1, null, 10, new Circle(5), new Person("Lee"), "" };

foreach (var item in data)
{
    if (ReferenceEquals(item, null))
    {
        Console.WriteLine("NULL ์ฐพ์•˜์Œ");
    }
}

 

์ฐธ๊ณ 

https://doublsb.tistory.com/138

 

Unity Null Checkํ•  ๋•Œ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

Null ์ฒดํฌ๋กœ ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ผ์€ ๋งค์šฐ ์ž์ฃผ ๋ฐœ์ƒํ•˜๊ณค ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ตœ๊ทผ IDE๋ฅผ VS์—์„œ Rider๋กœ ๊ฐˆ์•„ํƒ”๋”๋‹ˆ null ์ฒดํฌ๋ฅผ ํ•  ๋•Œ๋งˆ๋‹ค ์ด๊ฒƒ์ €๊ฒƒ ์•Œ๋ ค์ฃผ์—ˆ๊ณ , ์ถฉ๊ฒฉ์ ์ธ ์‚ฌ์‹ค์„ ์—ฌ

doublsb.tistory.com

https://m.blog.naver.com/sorang226/222740387351

 

[Unity] ์œ ๋‹ˆํ‹ฐ์—์„œ "== null" ์“ฐ์ง€ ๋งˆ์„ธ์š”? (fake null ์ด๋ž€)

"์œ ๋‹ˆํ‹ฐ์—์„œ null ์€ ์ง„์งœ null ์ด ์•„๋‹ˆ๋‹ค" ์œ ๋‹ˆํ‹ฐ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋‹ค๋ณด๋ฉด ์ข…์ข… ๋“ฃ์Šต๋‹ˆ๋‹ค. fak...

blog.naver.com

https://ansohxxn.github.io/unitydocs/fakenull/

 

Unity C# > ์œ ๋‹ˆํ‹ฐ ์˜ค๋ธŒ์ ํŠธ์˜ fake null

๐Ÿš€ Destroy

ansohxxn.github.io

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Game/โœ Unity' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Unity] ์ฝ”๋“œ ๋‚ด ํž™ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”
  • [Unity] Mathf.Lerp() ํ•จ์ˆ˜
  • [Unity] ํ™œ์šฉ ๊ฐ€๋Šฅํ•œ AI ์ฝ”๋”ฉ ์„œ๋น„์Šค 2ํŽธ
  • [Unity] ํ™œ์šฉ ๊ฐ€๋Šฅํ•œ AI ์ฝ”๋”ฉ ์„œ๋น„์Šค 1ํŽธ
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[Unity] null ์ฒดํฌ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”