텍스트 Rpg - C#

C#으로 만드는 텍스트 Rpg (7)

게임만드는학생 2025. 2. 6. 01:35

 

미션 6: 리플렉션을 활용한 동적 속성 접근

  • 목표: 리플렉션을 활용해 클래스의 정보를 탐색하고 동적으로 조작한다.
  • 미션:
    1. Player 클래스의 모든 프로퍼티와 값을 출력하는 리플렉션 코드를 작성해라.
    2. 리플렉션을 활용해 Player 클래스의 체력 값을 동적으로 수정하는 코드를 작성해라.

 

 

미션6을 해결했다. 

리플렉션이라는 기능을 사용해보는 것에 초점을 맞췄다. 그래서 텍스트 rpg에 필요한 기능이라기보다는

리플렉션을 사용해볼 함수를 하나 만들었다. 

 

이 리플렉션이라는 기능이 툴을 만들 때 아주 유용하게 사용되고 유니티에서는 플러그인이나 이벤트 시스템 좀 더 유연한 옵저버패턴을 만드는데 사용된다는데 아직 잘 모르겠다. 

 

우선 리플렉션이란 컴파일타임이 아닌 런타임에 클래스의 프로퍼티, 필드, 함수 등이 뭐가 있는지 접근할 수 있는 기능이다. 

예를들어 player 라는 클래스에 있는 변수 이름, 타입 등을 알아내고 사용할 수 있는 것이다. 또 객체를 넘겨주면 값 변경, 읽어오기도 가능하다. 

 

 public void PrintPropertyValueByReflection(Player player)
 {
     Type type = typeof(Player);

     Console.WriteLine("=== Properties ===");
     var properties = type.GetProperties();

     foreach (var property in properties)
     {
         object value = property.GetValue(player); // ✅ 프로퍼티 값을 가져오기 위해 `GetValue(player)` 사용
         Console.WriteLine($"{property.PropertyType} {property.Name} = {value}");
         if(property.Name=="Hp")
         {
             property.SetValue(player, 30);
         }
     }

     Console.WriteLine("=== Fields ===");
     var fields = type.GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

     foreach (var field in fields)
     {
         object value = field.GetValue(player); // ✅ 필드 값을 가져오기 위해 `GetValue(player)` 사용
         Console.WriteLine($"{field.FieldType} {field.Name} = {value}");
     }
 }

Player 클래스에 만든 함수이다. 

 

먼저 Type 이라는 변수에 Player 클래스를 담으면 type 변수로 다 접근이 가능하다. 

GetProperties 함수는 모든 프로퍼티를 다 읽어온다. 

for문을 돌고 각 프로퍼티에 대해서 GetValue함수를 통해 객체를 넘겨주면 그 객체의 해당프로퍼티의 값을 반환해준다. 

그리고 사용가능하다. Field도 마찬가지인 매커니즘이다. 

 

그리고 SetValue를 통해 값 변경도 가능하다.