오늘은 삼각함수를 통한 발사체의 궤적이나 물체의 움직임을 더 다양하게 조절하는 방법과 방대한 데이터를 효율적으로 관리할 수 있는 Dictionary에 대해 정리해보겠습니다.
Mathf.Cos는 입력받은 각도(라디안)에 대한 코사인 값을 반환하는 함수입니다. 단위 원에서 X축의 좌표값을 의미하며, -1에서 1 사이의 값을 반복해서 출력합니다.
게임에서는 주로 원형 이동의 X축 좌표를 계산하거나, 좌우로 왕복하는 진동 운동을 구현할 때 사용합니다.
예를 들어, 캐릭터 주변을 빙글빙글 도는 위성 아이템을 만들 때 X좌표를 담당합니다.
<style>
using UnityEngine;
public class CosMovement : MonoBehaviour
{
public float speed = 2.0f;
public float length = 3.0f;
void Update()
{
// 시간에 따라 -3에서 3 사이를 좌우로 왕복 이동
float xPos = Mathf.Cos(Time.time * speed) * length;
transform.position = new Vector3(xPos, 0, 0);
}
}
</style>
Mathf.Sin은 입력받은 각도(라디안)에 대한 사인 값을 반환하는 함수입니다. 단위 원에서 Y축의 좌표값을 의미하며, 코사인과 마찬가지로 -1에서 1 사이를 오갑니다.
게임에서는 물체가 위아래로 둥둥 떠 있는 효과(Floating), 원형 이동의 Y축 좌표, 혹은 파동(Wave) 형태의 궤적을 그리는 발사체를 만들 때 필수적으로 사용됩니다.
Cos와 Sin을 함께 사용하면 완벽한 원운동을 구현할 수 있습니다.
<style>
using UnityEngine;
public class SinMovement : MonoBehaviour
{
public float speed = 2.0f;
public float height = 0.5f;
void Update()
{
// 물체가 위아래로 부드럽게 둥둥 떠 있는 효과
float yPos = Mathf.Sin(Time.time * speed) * height;
transform.position = new Vector3(transform.position.x, yPos, transform.position.z);
}
}
</style>
Dictionary는 키(Key)와 값(Value)이 한 쌍으로 이루어진 자료구조입니다.
리스트가 번호(인덱스)로 데이터를 찾는다면, 딕셔너리는 우리가 지정한 고유한 별명(키)으로 데이터를 직접 찾아냅니다.
Dictionary는 데이터를 다룰 때 '안전성'이 가장 중요합니다.
만약 없는 키를 호출하면 에러가 발생하는 문제가 발생하게 됩니다.
<style>
using System.Collections.Generic; // 딕셔너리 사용을 위해 필수
using UnityEngine;
public class DictionaryBase : MonoBehaviour
{
// Key는 문자열(이름), Value는 정수(점수)인 딕셔너리 선언
Dictionary<string, int> scores = new Dictionary<string, int>();
void Start()
{
// 데이터 추가
scores.Add("Player1", 100);
scores["Player2"] = 250; // 이 방식도 가능
}
}
</style>
Dictionary의 활용 방식은 다음과 같습니다.
값 안전하게 읽기: TryGetValue를 사용하면 키가 있는지 확인하고 값을 동시에 가져올 수 있어 에러를 방지하는 방어 코드 작성이 가능합니다.
값 증가시키기: 기존 값이 있는지 확인하고, 있으면 수정하고 없으면 새로 추가하는 로직이 자주 쓰입니다.
전체 출력하기: foreach문을 사용하여 딕셔너리에 담긴 모든 데이터를 순회할 수 있습니다.
<style>
using System.Collections.Generic;
using UnityEngine;
public class DictionaryAdvanced : MonoBehaviour
{
Dictionary<string, int> inventory = new Dictionary<string, int>();
void Start()
{
inventory.Add("Potion", 5);
inventory.Add("Gold", 1000);
// 1. 값 안전하게 읽기
if (inventory.TryGetValue("Potion", out int count))
{
Debug.Log("포션 개수: " + count);
}
// 2. 값 수정 및 증가 (기존 값에 더하기)
if (inventory.ContainsKey("Gold"))
{
inventory["Gold"] += 500;
}
// 3. 전체 데이터 출력
foreach (KeyValuePair<string, int> item in inventory)
{
Debug.Log("아이템: " + item.Key + ", 보유량: " + item.Value);
}
}
}
</style>
오늘은 삼각함수(Sin, Cos)의 활용방법과 Dictionary에 대해 학습하였습니다.
특히 기존의 List만 배웠을 때는 기존의 값에서 수량을 증가시킨다거나 혹은 List전체를 순회하여 동일한 이름의 수량을 합치는 방식 등으로 인벤토리를 관리한다고 생각하였는데,
Dictionary를 활용하면 더 적은 메모리를 사용하면서 확실하게 찾아낼 수 있다라는 점이 인상적이었습니다.