

오늘은 예전부터 듣고 있던 <retro의 유니티 게임 프로그래밍 에센스>를 이어서 들어 보겠습니다.
이전에 해당 강좌의 초급과 소코반 창고지기 게임을 해보았고, 이제는 섹션5인 C#프로그래밍 : 중급에 대해 배워보겠습니다.
참고로 이제부터 제대로 글을 써 올리니 이전까지의 글들은 다시 리뉴얼해서 올리겠습니다ㅎㅎ
그럼 가보자구~
오늘 배운 것 키워드
- 벡터 연산 기초
- 평행이동과 좌표계
- 부모 자식 관계
- 회전과 쿼터니언
- 인스턴스화
- 오버로
1. 벡터 연산 기초
백터란?
: 길이와 방향을 가진 존재(화살표)
(2,3)의 의미
1. 내가 (2, 3)에 있다.
2. 내 위치에서 "상대적으로" (2, 3)만큼 가고 있다.
정리
1. 벡터는 길이와 방향을 가진다.
2. 절대좌표 (1, 1) : 원점(0, 0)에서 (1, 1)에 있다.
상대좌표 (1. 1) : 내 위치가 어디든 "상대적으로" 움직임.
Vector3와 Vector2
- - Vector3 : (x, y, z)를 나타내는 벡터
- - Vector2 : (x, y)를 나타내는 벡터
위 그림에서 5는 (-4, 3)의 좌표에 도달하는 벡터의 길이(크기)이다.
벡터의 덧셈
벡터를 더한다 라는 의미 : 특정 벡터에서 더하는 벡터만큼 더 간다!
ex) (2, 3) + (1, 1) = (3, 3) => (2, 3)에서 (1, 1)을 더 간다!
(목적지의 위치) - (나의 위치) = (그 사이의 간격) = (나의 위치에서 목적지에 도달하기까지의 거리)
Player(2,4)에서 Enemy(-4, 1)까지의 거리는 위의 식을 사용해서 (-6, -3)라는 값을 얻을 수 있다.
이로 통해 알 수 있는 점 2가지!
1. 화살표로 방향을 알 수 있다.
2. 활살표의 길이 = 벡터의 크기 = 루트45(피타고라스의 정리를 이용)
벡터의 곱셈
이때 각 벡터의 크기는 (-1, 1)은 루트2, (-3,3)은 3루트2이다.
방향벡터 : 길이(크기)가 1인 벡터
=> 길이가 1이어서 단위로 사용할 수 있다.
2. 평행이동과 좌표계
큐브 움직이기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Mover : MonoBehaviour {
void Start() {
//targetPosition이라는 새로운 벡터3 (1, 0, 0)으로 만든다.
Vector3 targetPosition = new Vector3(1, 0, 0);
transform.position = targetPosition; //transform에 있는 position을 targetPosition으로 변경
}
}
큐브를 계속 움직이기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Mover : MonoBehaviour {
//move라는 이름의 (-5,-5,-5)의 좌표를 가진 벡터3를 만듬
public Vector3 move = new Vector3(-5, 5, -5);
void Update() {
if(Input.Getkey(KeyCode.Space) { //만약 스페이스바를 누르면
Move();
}
}
//움직이는 메서드
void Move() {
transform.Translate(move * Time.deltaTime); //시간 단위로 위치를 move()시킴
}
}
좌표계의 종류
Global Space(글로벌 좌표계) : 절대적 좌표
Local Space ( 로컬 좌표계) : 상대적 좌표
기본적인 평행이동은 로컬 좌표계를 중심으로 움직인다.
부모 자식 관계
부모 요소가 있으면 자식은...
글로벌 좌표계 : 게임 세상 좌표
로컬 좌표계 : 부모에 대한 상대적 좌표 / 부모가 없으면 로컬=글로벌 일치
=> 부모 요소가 있을 때, 로컬을 건드리면 부모에 대한 상대적인 위치, 회전, 비율 로 변한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SetPosition : MonoBehaviour {
void Start() {
transform.position = new Vector3(0,0,0) //절대적 위치를 (0,0,0)으로 옮기기
transform.localPosition = new Vector3(0,0,0)//상대적 위치를 (0,0,0)으로 옮기기
}
}
기본적으로는 글로벌 좌표계(절대 좌표)를 사용하지만, 코드상으로 localPosition을 사용해 로컬 좌표계(상대적 좌표)를
사용할 수 있다. 이는 Scale과 Rotation 모두 해당된다.
3. 오늘의 결과와 느낀점
벡터의 연산을 단순한 수학적 요소가 아니라 유니티에서, 게임속에서 어떻게 사용되는 지를 알 수 있어서 좋았고
평행이동의 경우에는 이때까지 프로젝트를 하면서도 부모와 자식간의 상대적인 움직임을 확인 한 적이 많은데 오늘을 통해 제대로 알 수 있었다. 대부분은 로컬좌표를 사용하는 것 같고 혹시나 혼동하지않게 조심해야겠다.
'Unity > 강좌' 카테고리의 다른 글
2D 종스크롤 슈팅 게임 #02. 총알 발사 (0) | 2024.06.24 |
---|---|
2D 종스크롤 슈팅 게임 #01. 플레이어 이동 구현 (0) | 2024.06.23 |
유니티 2D 종스크롤 슈팅 게임 만들기 #0. 준비준비준비 (0) | 2024.06.22 |
retr0의 유니티 (Unity C#) 게임 프로그래밍 에센스 #5-3 (0) | 2024.03.29 |
retr0의 유니티 (Unity C#) 게임 프로그래밍 에센스 #5-2 (2) | 2024.03.26 |

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!