[ 목차 ]
오늘은 유니티를 시작한다!
이제부터 본격적으로 게임을 만들기 위한 공부가 시작된다.
우선 유니티와 깃허브 연결 방법부터
간단한 인터페이스를 확인하면서
움직이는 동작을 구현하는 것을 할 거다.
너무 설레고 기대하는 중..
걸작! 만들기 위해
다시 힘차게 파이팅!
1. 유니티 프로젝트 생성
유니티의 버전과 이름을 생성하고,
들어오면 이런 창이 보일 것이다.
Editor Version으로 여러 개 버전이 설치되어 있다면 하나 선택한다.
All templates 중에서 어떤 것을 선택해야 하냐!
기본적으로는 3D (built-In Render Pipeline)으로 시작해 볼 것이다.
나의 버전은 6000.0.40 f1이다. Unity 6 기준으로 회고를 할 것이다.
(1) 레이아웃 변경
유니티를 키게 되면 이런 화면이 나올 것이다.
사실 레이아웃이 조금 다를 텐데,
개인적으로 유니티 작업을 했을 때 레이아웃을 변경해두었기 때문이다.
그렇다면 레이아웃은 어떻게 변경할까?
오른쪽 위에 보면 Layout 아이콘이 있을 것이다.
하나씩 눌러보면 레이아웃 변경이 가능할 것이다.
(2) 오브젝트 생성
이제 오브젝트를 생성해 볼 것이다.
Hierarchy의 빈곳에 오른쪽 마우스를 클릭한다.
그러면 이런 선택하는 창이 나올 것이다.
여기에서 3D 오브젝트 - Cube 를 누른다.
이렇게 Scene 뷰에서 이러한 큐브가 생성이 되었을 것이다.
이것은 오른쪽의 Inspector에서
Transform으로 x y z 값의 위치 조정을 할 수 있다.
보통 0 0 0으로 시작하는 것이 좋다.
(3) 스크립트 생성
이제 코드를 만들러 스크립트를 생성할 것이다.
Project에서 오른쪽 마우스 클릭하면 Creat - MonoBehaviour Script
이렇게 Projecct 창에 # 모양 아이콘의 스크립트가 생성되었다.
이름은 알잘딱 지정이다.
이 스크립트를 클릭하면 스크립트 창이 나온다.
여기에서 중요한 점은 스크립트 이름이 비주얼 스튜디오의 class 이름과 Project 이름이 동일해야 한다.
이제 스크립트를 오브젝트에 연결할 것이다.
스크립트를 누르면서 드래그로 Cube에 가져다 놓으면
Cube의 inspector에 스크립트가 추가된 것을 볼 수 있다.
이것 외에도 다른 방법이 있다.
Cube - Inspector를 보면
Add Component가 있을 것이다.
여기서 C#을 입력해주면 New Script가 뜰 것이다.
새로운 스크립트를 생성하겠다는 것이다.
(4) 스크립트 작성
이제 다시 스크립트 창에 들어간다.
콘솔에 출력을 하기 위해서 간단한 스크립트를 작성해 볼 것이다.
Debug.Log("");
이 코드가 콘솔 C#에서는
Console.WirteLine();
이거와 동일하다.
유니티에서는 디버그 로그로 출력한다.
using UnityEngine;
public class Test : MonoBehaviour
{
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
Debug.Log("안녕하세요.");
}
// Update is called once per frame
void Update()
{
}
}
이제 위 중앙에 플레이 버튼을 클릭하면
Console 창에 안녕하세요. 라는 Text가 출력된다.
스크립트에 대해서 간단한 설명이다.
여기서 기본적으로 있는
void Start() 와 void Update()의 차이는 무엇일까?
- void Start : 시작 시에 한 번만 실행
- void Update : 계속 반복 실행
이렇게 나누어진다.
참고로 디버그 로그도 되고, print도 된다.
using UnityEngine;
public class Test : MonoBehaviour
{
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start() //시작시 한 번만 실행
{
Debug.Log("안녕하세요.");
}
// Update is called once per frame
void Update() //계속 반복
{
print("여기는 반복이다.");
}
}
이렇게 콘솔 창에 수많은 반복 출력을 볼 수 있다.
여기서 겹치는 것을 한 번에 볼 수 있는 방법은 없나?
하는 불편함이 생길 수 있다.
겹치는 콘솔 출력을 한 번에 정리해 주는 방법은
Console 창에 Collapse 를 누르면 겹치는 것을 숫자로 표현해 준다.
말했듯이 start는 한 번 출력이니 1개의 실행만 된 것을 알 수 있다.
2. 유니티 깃허브 연결
이제 유니티 파일을 깃허브에 연결하는 방법을 알아보겠다.
github 사이트에 들어가서 로그인을 한다.
New 클릭
새로운 repository를 만드는 것이다.
이름과 README file 체크
Add .gitignore 유니티로 변경 후
Create repository
새로 생성된 repository에서 Code 를 누르면 URL이 뜰 것이다.
이것을 복사한다.
이제 유니티 깃허브 데스크톱으로 이동한다.
File - Clone repository
URL에 들어가 복사해 두었던 URL을 넣어준다.
연결 완료~
여기에서 수정되거나 추가되면 새로운 Changed files가 생길 것이다.
3. 스크립트 이해하기
스크립트를 이해하고 활용하는 것을 해볼 것이다.
우선 GameObject를 생성한다.
Hierarchy - Creat Empty(GameObject)
이렇게 아무것도 없는 오브젝트가 생성되었다.
이번엔 새로운 스크립트를 만들어볼 것이다.
위의 스크립트 생성하는 2가지 방법 중 아무거나 사용해도 된다.
변수 선언 및 출력
간단한 변수를 선언하고, 출력하는 것을 실습해 본다.
정수형, 실수형, 문자열, 논리형
using UnityEngine;
public class VariableExample : MonoBehaviour
{
//변수 선언
public int playerScore = 0;
public float speed = 5.5f;
public string playername = "Hero";
public bool isGameOver = false;
void Start()
{
Debug.Log("Player Name: " + playername);
Debug.Log("Player Score: " + playerScore);
Debug.Log("Speed: " + speed);
Debug.Log("Is Game Over?: " + isGameOver);
}
}
여기서 스크립트 파일이 여러 개이고, 다른 파일과 섞여 있으면 찾기 불편해질 테니
새로운 폴더를 생성해 스크립트 파일을 모아두도록 하는 것을 습관화하자.
Project - Create - Folder
이름: Script로 정해 생성
이렇게 따로 Asset 안에 파일이 나누어진다.
MonoBehaviour 기본 함수 이해
기본 함수에 보통 Start()와 Update()가 있다.
그 외에도 다양한 메서드가 있는데,
이번 실습 예제로 FixedUpdate() 메서드를 알아보자.
이것은 물리 엔진과 관련된 업데이트 메서드이다.
매 프레임마다 호출되는 Update() 와는 달리,
일정한 시간 간격으로 호출되며, 주로 물리 계산(충돌, Rigidbody 움직임)에 사용된다.
using UnityEngine;
public class MonoBehaviourExample : MonoBehaviour
{
void Start()
{
Debug.Log("Start: 게임이 시작될 때 호출됩니다.");
}
void Update()
{
Debug.Log("Update: 프레임마다 호출됩니다.");
}
private void FixedUpdate()
{
Debug.Log("FixedUpdate: 물리 연산에 사용됩니다.");
}
}
연산자와 조건문
유니티에서 연산자와 조건문을 사용하는 스크립트를 작성할 것이다.
우선 기존의 스크립트 삭제 방법을 알아보자.
Inspector에서 스크립트의 오른쪽에 보면 점 세 개가 있는 아이콘이 있다.
클릭해 보면 Remove Component 를 클릭하면 삭제된다.
이제 연산자와 조건문에 대한 스크립트를 새로 작성해 본다.
정수형으로 체력을 선언하고, 연산자를 통해 체력 감소해 출력해 본다.
조건문으로 체력이 0이 되면 Game Over! 문자열을 출력한다.
using UnityEngine;
public class ConditionExample : MonoBehaviour
{
//연산자와 조건문
public int health = 100;
void Update()
{
health -= 1; //체력 감소
Debug.Log("Health: "+ health);
//조건문
if(health <= 0)
{
Debug.Log("Game Over!");
}
}
}
반복문 for / while
for 문을 통해 1부터 10까지 출력하는 스크립트이다.
using UnityEngine;
public class LoopExample : MonoBehaviour
{
void Start()
{
//for문 : 1부터 10까지 출력
for(int i=1; i<=10; i++)
{
Debug.Log("Count: "+ i);
}
}
}
while 문을 통해 조건이 참일 때 실행하는 반복문을 작성해 보았다.
using UnityEngine;
public class LoopExample : MonoBehaviour
{
void Start()
{
//while문: 조건이 참일 때 실행
int counter = 0;
while(counter < 5)
{
Debug.Log("While Count: "+ counter);
counter++;
}
}
}
함수
함수를 정의하고 Start에서 호출하는 것을 작성해 본다.
using UnityEngine;
public class FunctionExample : MonoBehaviour
{
//함수 정의
void SayHello()
{
Debug.Log("Hello, Unity!");
}
int AddNuumber(int a, int b)
{
return a + b;
}
void Start()
{
SayHello(); //함수 호출
int total = AddNuumber(3, 5);
Debug.Log("Total:" + total);
}
void Update()
{
}
}
클래스와 객체
클래스를 새로 만들어 다른 클래스에 있는 코드를 호출할 수 있다.
using UnityEngine;
public class Player
{
public string name;
public int score;
public Player(string playerName, int playerScore)
{
name = playerName;
score = playerScore;
}
public void ShowInfo()
{
Debug.Log("Player: " + name + ", Score: " + score);
}
}
public class ClassExample : MonoBehaviour
{
void Start()
{
Player player1 = new Player("Hero", 10);
player1.ShowInfo();
}
void Update()
{
}
}
키보드 입력에 따른 이동
실수형 변수를 선언하고,
Update() 메서드 안에
Input.GetAxis("Horizontal"); 코드를 사용한다.
이 코드는 유니티에서 제공하는 입력 시스템을 통해 좌우 방향 입력을 가져온다.
Horizontal은 키보드 좌우를 뜻하는 것이다.
혹은 A , D도 사용 가능하다.
transform.Translate
이것이 오브젝트의 위치를 이동시키는 함수를 작성한다.
Vector3.right
벡터로 오른쪽 방향을 나타낸다.
move * speed * Time.deltaTime
(방향) * (스피드) * (프레임 고정)
이동량을 계산하는 식이다. 외워두면 좋다!
using UnityEngine;
public class MoveObject : MonoBehaviour
{
public float speed = 5.0f;
void Update()
{
//키 입력에 따라 이동
float move = Input.GetAxis("Horizontal"); //키보드 좌우
transform.Translate(Vector3.right * move * speed * Time.deltaTime);
}
}
하지만 이 코드를 실행하려는데 Unity 6에서는 오류가 발생할 수 있다.
그럴 때의 해결법이다.
Edit - Project Settings
Player - Other Settings
Active Input Handling
Both로 변경
이렇게 설정을 바꾸면 정상적으로 작동된다.
벡터 (Vector)
벡터란 무엇인가?
수학이나 물리에 Vector 개념이 있다.
이것을 코딩에 가져온 것이라고 간편히 이해하면 된다.
Vector2는 x, y 좌표를 뜻하고, Vector3는 x, y, z를 뜻한다. z값의 추가 유무이다.
public Vector2 v2 = new Vector2(10, 10); //x y좌표다.
벡터 더하기
벡터의 x 값을 따로 정의해 두 x 값을 더하는 실습이다.
using UnityEngine;
public class VectorStudy : MonoBehaviour
{
//public Vector2 v2 = new Vector2(10, 10); //x y좌표다.
//public Vector3 v3 = new Vector3(1,1,1); //x y z 좌표
void Start()
{
Vector3 a = new Vector3(1, 0, 0);
Vector3 b = new Vector3(2, 0, 0);
Vector3 c = a + b;
Debug.Log("Vector" + c);
}
void Update()
{
}
}
이 스크립트에 길이를 구하는 코드를 추가해 본다.
using UnityEngine;
public class VectorStudy : MonoBehaviour
{
//public Vector2 v2 = new Vector2(10, 10); //x y좌표다.
//public Vector3 v3 = new Vector3(1,1,1); //x y z 좌표
void Start()
{
Vector3 a = new Vector3(1, 1, 0);
Vector3 b = new Vector3(2, 0, 0);
Vector3 c = a + b;
Debug.Log("Vector" + c);
Debug.Log("길이: " + c.magnitude);
}
void Update()
{
}
}
정규화 normalize
벡터의 크기를 1로 만들고 방향만 유지하는 것이다.
using UnityEngine;
public class VectorStudy : MonoBehaviour
{
void Start()
{
//정규화 normalize
//벡터의 크기를 1로 만들고 방향만 유지
Vector3 a = new Vector3(3, 3, 3);
Vector3 normalizedVector = a.normalized;
Debug.Log("1의 길이 방향만 설정하는 정규화: " + normalizedVector);
}
void Update()
{
}
}
벡터의 관한 방향 예시 주석과 함께한 코드이다.
//Vector3.right 오른쪽 (1, 0, 0)
//Vector3.left 왼쪽 (-1, 0, 0)
//Vector3.up 위쪽 (0, 1, 0)
//Vector3.down 아래 (0, -1, 0)
//키 입력에 따라 이동
float move = Input.GetAxis("Horizontal"); //키보드 좌우
//방향 * 스피드 * 프레임 고정(Time.deltaTime / 이게 없으면 프레임이 너무 빠름)
transform.Translate(Vector3.right * move * speed * Time.deltaTime);
상하좌우에 대한 코드이다.
using UnityEngine;
public class MoveObject : MonoBehaviour
{
public float speed = 5.0f;
void Update()
{
//Vertical = 상하 Horizontal = 좌우
Vector3 move = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"), 0);
//position = 좌표 / translate = 좌표 이동
//position 상위 개념이 Transform
//transform.position += move * speed * Time.deltaTime;
transform.Translate(move * speed * Time.deltaTime);
}
}
여기에서 Transform 과 position 차이를 헷갈릴 수 있다.
4. Rigidbody (중력) 적용
이제 게임할 때 캐릭터가 점프하고 다시 땅으로 돌아가고, 중력에 의한 작용을
유니티에서 구현해 볼 것이다.
3D Object - Sphere로 공 형태의 오브젝트를 추가하고
Inspector - Add Component - Rigidbody (2D 게임일 때는 Rigidbody 2D 선택)
추가하면 이러한 항목이 생길 것이다.
이제 공이 착지할 땅을 만들어주어야 한다.
Hierarchy에 Plane을 추가해 준다.
이제 스크립트를 작성해 보자.
Inspector에 보일 public 코드 하나를 작성한다.
Rigidbody 타입의 변수를 선언하는 것이다.
using UnityEngine;
public class MoveWithGravity : MonoBehaviour
{
public Rigidbody rb;
void Start()
{
}
void Update()
{
}
}
이렇게 공 오브젝트에 위의 스크립트를 추가하면
Rigidbody 넣을 칸이 생긴다.
Inspector의 Rigidbody를 드래그 앤 드롭으로 넣을 수 있고,
Hierarchy의 Sphere를 드래그 앤 드롭으로 넣을 수 있다.
이제 공이 얼마큼의 점프 힘을 받는지,
그리고 키 입력을 통한 점프를 구현할 것이다.
using UnityEngine;
public class MoveWithGravity : MonoBehaviour
{
public Rigidbody rb;
public float jumpForce = 5.0f; //점프힘
void Start()
{
}
void Update()
{
//Space 키를 누르면 점프
if(Input.GetKeyDown(KeyCode.Space))
{
//Rigidbody: 물리효과를 추가해 중력 적용
//AddForce: 점프를 위해 오브젝트에 힘을 준다.
//ForceMode.Impulse: 순간적으로 힘을 가하는 옵션
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
}
}
이렇게 적용하면 스페이스바를 입력하면 힘 값만큼 점프할 것이다.
이제 배운 내용을 토대로 실습을 할 것이다.
Player(공)이 상하좌우로 움직이는 코드와 스피드를 넣는다.
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float speed = 5.0f;
void Update()
{
float moveX = Input.GetAxis("Horizontal");
float moveZ = Input.GetAxis("Vertical");
Vector3 move = new Vector3(moveX, 0, moveZ);
transform.Translate(move * speed * Time.deltaTime);
}
}
카메라가 공을 따라다니는 방법이 있다.
Hierarchy에서 Main Camera를 Sphere의 자식으로 넣어준다.
이제 공이 피해 갈 장애물을 설치한다.
Cube를 생성 후 자유롭게 배치해 본다.
공이 Cube에 닿으면 부딪칠 것이다.
5. 모바일 화면 맞추기
Scene뷰와 Game뷰가 있을 것이다.
Game뷰는 게임을 실행했을 때의 실제 화면인 것이다.
그렇다면 모바일 화면이나 PC 화면 비율로 설정하고 싶다면 어떻게 할까?
Game 뷰의 Free Aspect를 누른다.
Add를 누르면 커스텀 비율 만들어서 저장할 수도 있다.
오늘은 유니티에 대해 기초적인 인터페이스와
간단한 움직임을 구현해 보았다.
유니티로 넘어가니 더욱 재밌어진다...
그리고 기존에 유니티를 만져봐서 익숙하게 잘 따라갈 수 있어서 좋았다.
혼자 공부할 때는 이게 무슨 기능이고, 이해가 안 가고
복붙만 하는 나였는데..
이젠 이해할 수 있으니 좀 뿌듯하기도 한다. ㅎvㅎ
개자이너로 한 발짝 전진하길!
'Development > 멋쟁이사자처럼 게임개발 부트캠프' 카테고리의 다른 글
[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 13일차 - Dragon Flight (2) (2) | 2025.03.19 |
---|---|
[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 13일차 - Dragon Flight (1) (2) | 2025.03.18 |
[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 11일차 - 델리게이트 & 이벤트 (0) | 2025.03.16 |
[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 10일차 - 네임스페이스 & 필드 & 생성자, 소멸자 & ref, out & 추상 클래스 (2) | 2025.03.13 |
[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 9일차 - 메서드, 쿼리 구문 & select & 알고리즘 & 상속 & 메서드 오버라이딩 (0) | 2025.03.11 |