카드 뒤집기 게임

gif_1

간단한 카드 뒤집기 게임을 만들어보았다.

Object.Instantiate

게임의 확장성을 위해서, 게임 내 카드들은 미리 생성되는 것이 아니라, 정해진 값 만큼 게임 시작 시 복사되어 생성되는 방식으로 구현되었다.

유니티의 Instantiate 메서드는 게임 플레이 중 오브젝트를 복제할 때 사용되며, 다양한 오버로드로 제공되어 원하는 위치에 생성하거나, 부모 오브젝트를 지정해줄수도 있다.

메서드 설명
Instantiate(T original) 원본 오브젝트를 그대로 복제
Instantiate(T original, Transform parent) 특정 부모(Transform) 밑에 오브젝트를 생성
Instantiate(T original, Transform parent, bool worldPositionStays) 부모를 설정하면서, 월드 위치 유지 여부 지정
Instantiate(T original, Vector3 position, Quaternion rotation) 특정 위치와 회전값을 설정하여 생성
Instantiate(T original, Vector3 position, Quaternion rotation, Transform parent) 특정 위치와 회전을 적용하면서 부모도 설정
  • ‘Transform parent’ 를 설정하면 해당 오브젝트가 지정된 부모 아래에 생성된다.
  • ‘worldPositionStays’가 true로 설정되면 부모가 설정되더라도 원본의 월드 위치를 유지한다.
  • ‘Vector3 position’ 과 ‘Quaternion rotation’을 설정하여 원하는 위치와 방향으로 오브젝트를 생성할 수 있다.

System.Linq

카드를 랜덤으로 배치하는 과정에서 System.Linq 라는 네임스페이스의 OrderBy 기능을 사용하였다.

int[] arr = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, };
arr = arr.OrderBy(x => Random.Range(0f, 7.0f)).ToArray(); //랜덤 순서로 정렬

위 코드가 어떻게 배열을 무작위로 정렬한다는 것인지 처음에는 이해가 잘 되지 않았다.

검색해보니 LINQ(Language-Integrated Query)는 배열, 리스트, 데이터베이스,XML등 다양한 데이터 소스에 대해 SQL과 비슷한 쿼리 문법으로 데이터를 검색, 필터링, 정렬할 수 있는 기능을 제공한다고 한다.

강의에서 사용된 OrderBy 메서드는 컬렉션의 요소를 특정 키를 기준으로 오름차순 정렬하는 데 사용된다고 한다.

var sortedCollection = collection.OrderBy(element => keySelector)
  • collection : 정렬한 컬렉션(배열, 리스트 등)
  • element : 컬렉션의 각 요소
  • keySelector : 정렬 기준이 되는 값

OrderBy 사용 예제

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

var people = new List<Person>
{
    new Person { Name = "Alice", Age = 25 },
    new Person { Name = "Bob", Age = 30 },
    new Person { Name = "Charlie", Age = 20 }
};

// 나이(Age) 기준으로 정렬
var sortedPeople = people.OrderBy(p => p.Age);

foreach (var person in sortedPeople)
    Console.WriteLine($"{person.Name} ({person.Age})");

// 출력:
// Charlie (20)
// Alice (25)
// Bob (30)

즉 강의에서 사용한 카드 셔플 방식은 각 x에 대해 Random.Range(0f, 7.0f)의 랜덤한 float값을 생성하고, 그 랜덤값을 기준으로 오름차순 정렬한다고 해석할 수 있다.

LINQ의 주요 기능

정렬 기능 외에도 LINQ는 데이터를 관리할 때 사용하기 용이한 다양한 기능을 제공한다.

  • 필터링(Where) : 조건에 맞는 요소만 선택
int[] numbers = { 1, 2, 3, 4, 5, 6 };
        var evenNumbers = numbers.Where(n => n % 2 == 0);

        foreach (var num in evenNumbers)
            Console.WriteLine(num);  // 출력: 2, 4, 6
  • 매핑(Select) : 각 요소를 변환
var squaredNumbers = numbers.Select(n => n * n);
  • 집계(Sum, Average, Count, Max, Min)
int sum = numbers.Sum();  // 전체 합계
double avg = numbers.Average();  // 평균값
int count = numbers.Count();  // 개수
int max = numbers.Max();  // 최댓값
int min = numbers.Min();  // 최솟값
  • 조건 검사(All, Any, Contains)
bool allEven = numbers.All(n => n % 2 == 0);  // 모든 요소가 짝수인지 검사
bool anyEven = numbers.Any(n => n % 2 == 0);  // 하나라도 짝수인지 검사
bool containsThree = numbers.Contains(3);  // 3이 포함되어 있는지 검사
  • 그룹화 (GroupBy)
var grouped = numbers.GroupBy(n => n % 2 == 0 ? "Even" : "Odd");
foreach (var group in grouped)
{
    Console.WriteLine($"{group.Key}: {string.Join(", ", group)}");
}
// 출력:
// Odd: 1, 3, 5
// Even: 2, 4, 6

앞으로 데이터를 조작할 경우 LINQ를 활용하는 방식을 적극적으로 수용하는 것이 좋아보인다.

댓글남기기