[TIL] 4주차 강의
카드 뒤집기 게임

간단한 카드 뒤집기 게임을 만들어보았다.
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를 활용하는 방식을 적극적으로 수용하는 것이 좋아보인다.
댓글남기기