목차 1. 프로젝트 생성과 환경설정 2. 플레이어 이동 제작 3. 총알 이동 제작 |
1. 프로젝트 생성과 환경설정
먼저 3D 템플릿으로 프로젝트를 생성한다.
버전은 상관없으나 본글은 2020.3.30f1 을 사용했기 때문에 년도가 차이난다면 내용이 상이할 수 있다.
3D템플릿을 사용하긴 하지만 이번에 실제로 만들것은 탑뷰에서 본 시점이기 때문에 시점을 변경하고 카메라 위치도 변경시켜준다.
다음으로는 [Hierarchy] - [Directional Light] 에서 Light의 체크박스를 없애 Light를 비활성화 시킨다.
[window] - [Rendering] - [Lighting] 에서 Auto Generate도 비활성화를 시킨다.
다음으로 Enviroment 항목에서 Source를 Color로 변경하고 Ambient Color를 백색으로 변경한다.
이는 주변광을 백색으로 변경한다는 의미이다.
해당창에서는 원하는해상도로 변결할 수 있다. 보기에 원하는 해상도가 없다면 Add New Item 메뉴를 사용하여 만들 수 있다.
나는 640*960으로 제작하였다.
2. 플레이어 이동 제작
큐브를 생성한 뒤 위치를 조정하여 중앙으로 옮겨준다.
이 큐브를 Player로 사용할 것이기 때문에 이름을 마우스 우클릭을 하여 [Rename]을 누르고 이름을 변경해준다.
다음으로는 플레이어 동작을 위한 C# 스크립트를 생성하고 이 스크립트를 Player 오브젝트에 적용시켜준다.
기본적으로 동작하기 위한 스크립트를 작성해보도록 하자
transform.Translate(Vector3.right*speed*Time.deltaTime);
해당 코드는 현재 게임 오브젝트의 위치를 오른쪽 방향으로 speed의 속도로 이동시키는 역할을 한다.
여기서 'transform'은 현재 스크립트가 적용된 게임 오브젝트의 Transform 컴포넌트를 나타낸다. 'Translate()'함수는 해당 Transform을 이동시키는 메서드이다.
'Vector3.right'는 +x축을 나타내는 단위 벡터이다.
'Time.deltaTime'은 이동 속도를 조정하기 위한 값이다. 'Time.deltaTime'은 이전 프레임부터 현재 프레임까지 이 시간 간격을 나타내며, 이를 이용하여 이동 속도가 프레임 속도에 영향을 받지 않고 일정하게 유지된다. 이렇게 함으로써 프레임 속도에 따라 이동 속도가 변하지 않고, 게임이 동일한 속도로 실행될 수 있다.
public float speed = 5;
위의 코드 transform 코드와 함께 사용하면 speed 변수의 값에 따라 이동 속도가 달라진다. 'speed'변수를 다른 값으로 변경하면 이동속도가 변경되며, 게임을 실행 중에도 Inspector 창에서 변수 값을 수정하여 실시간으로 이동 속도를 조절할 수 있다.
코드와 Inspector 창의 speed 값이 다르다면 Inspector창에서 명령한 속도가 우선 적용되어 실행된다.
위의 코드를 실행시킨 영상이다. 처음에는 속도를 5로하여 재생시키고 다음에는 한프레임씩 바꾸어 보았으며 마지막으로 Inspector창을 이용해서 속도를 10으로 변경해보았다
다음으로는 키보드를 이용해서 좌우로 움직이는 기능을 스크립트에 작성해 보도록하자
float h = Input.GetAxis("Horizontal");
print(h);
위 코드는 Unity의 입력(Input) 시스템을 사용하여 수평(Horizontal)입력 값을받아 변수 h에 저장하는 코드이다.
이후 print(h)를 통해 h 변수의 값을 콘솔에 출력하는 함수이다. 이를 통해 현재 수평 입력 값을 확인할 수 있다
다음은 실행 창이다. 키보드를 눌렀을 때 값이 점진적으로 변함을 확인할 수 있다.
-> (오른쪽 방향키) 버튼을 눌렀을 시에는 값이 1이 될 때까지 값이 변화하며
<- (왼쪽 방향키) 버튼을 눌렀을 시에는 값이 -1이 될때까지 값이 변화한다.
부드러운 이동을 위해 눌렀을 때 값이 0에서 1로 바로 변화하는 것이 아닌 가속도가 반영된 값을 통해 값이 천천히 변화하게된다.
float v = Input.GetAxis("Vertical");
해당 코드를 추가하면 상하의 움직임도 키보드를 통해 사용할 수 있게된다.
**오브젝트 이동 실습
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
public float speed = 5;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
print("h: " +h + ", v: " + v);
Vector3 dir = Vector3.right * h + Vector3.up * v;
//Vector3 dir = new Vector3(h, v, 0);으로도 작성할 수 있음
transform.Translate(dir*speed*Time.deltaTime);
//transform.position += dir * speed * Time.deltaTime;으로도 작성할 수 있음
}
}
실행하면 다음과 같이 방향키를 이용하여 움직일 수 있다.
AWSD를 사용해서도 똑같이 사용할 수 있다.
3. 총알 이동 제작
큐브 오브젝트를 하나 더 생성한 뒤 이름을 Bullet으로 변경한다.
Scale과 Position도 변경한 뒤 (총알 모양처럼 보일 수 있도록..) Bullet 스크립트도 생성하고 오브젝트에 적용시킨다.
위의 내용을 기반으로 위쪽으로 오브젝트를 이동시켜 총알을 발사하는 것처럼 보이도록 스크립트를 작성한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bullet : MonoBehaviour
{
public float speed = 5;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
Vector3 dir = Vector3.up; //방향 구하기
transform.position += dir * speed * Time.deltaTime;
}
}
실행 시 다음과 같이 Bullet 오브젝트가 움직이는 것을 확인 할 수 있다.
하지만 위 코드는 실행시키기만 하면 총알이 자동으로 나가게 된다. 따라서 버튼을 클릭하였을 시에만 총알을 나가게 하기 위해 또다른 스크립트를 작성하여야 한다.
다음처럼 PlayerFire 스크립트를 하나 더 생성한 후 Player 오브젝트가 추가해준다.
다음으로는 총알 한발이 아닌 여러개의 총알을 발사하기 위해서 총알을 복제하여 사용할 것이다. 따라서 폴더를 하나 더 만들어 오브젝트를 보관하는 폴더를 생성해준다.
폴더에 Bullet 오브젝트를 드래그&드랍하여 넣어준다.
다음으로는 PlayerFire 스크립트에 아래 코드를 작성한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerFire : MonoBehaviour
{
public GameObject bulletFactory; //총알 원본
public GameObject firePosition; //발사 위치
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
키를 눌렀을 시에만 Bullet이 나오게 하기 위해서 [Hierarchy] 창에서 Bullet 오브젝트를 삭제해준다. 다음으로 Prefabs에 들어가 있는 Bullet을 [Player] - [Bullet Factory] 에 드래그&드랍하여 적용시켜준다.
Player 오브젝트 하위에 [Creat Empty]를 하여 새로운 Hierarchy를 생성하고 이름은 'FirePosition'으로 변경한다.
생성 한 뒤 [Player] - [Fire Position]에 드래그&드랍을 해서 적용시킨다.
마지막으로 PlayerFire 스크립트를 다음과 같이 수정하면
마우스 클릭시 총알이 나가게 된다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerFire : MonoBehaviour
{
public GameObject bulletFactory; //총알 원본
public GameObject firePosition; //발사 위치
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
GameObject bullet = Instantiate(bulletFactory); //총알 복제
bullet.transform.position = firePosition.transform.position;
}
}
}
실행하면 위와같이 마우스 좌클릭을 사용해서 총알을 발사할 수 있게 된다.
수업 영상 내용은 별로 길지 않았는데 실제로 따라하고 정리하는게 이전시간보다 더 복잡했던 것 같다.
그래도 아무튼 이번주 밀리지 않고 다 끝냈다~~ 오늘은 아주 기초긴 했지만 지난 시간에 배운것들을 활용해서 프로젝트를 만들어보기도해서 재미있었다.
주말동안에는 할 수 있다면 C# 스크립트 좀 다시 봐야할 것 같다^-^
'프로젝트해요 > 게임_개발' 카테고리의 다른 글
[Unity] #7. 슈팅 게임 제작(3) (4) | 2023.07.05 |
---|---|
[Unity] #6. 슈팅 게임 제작(2) (4) | 2023.07.04 |
[Unity] #4. C# 스크립트(3)_메서드&클래스 (6) | 2023.06.30 |
[Unity] #3. C# 스크립트(2)_제어문&배열 (6) | 2023.06.29 |
[Unity] #2. C#스크립트 기초_변수와자료형 (6) | 2023.06.28 |