2023. 7. 1. 14:02ㆍSWU_프로젝트/GURU - unity
오늘 학습할 내용은 다음과 같다.
1. 프로젝트 생성과 환경설정
2. 플레이어 이동제작
3. 총알 이동 제작
1. 프로젝트 생성과 환경설정
일단 프로젝트를 생성해보자.
나는 다시 2020.3 버전이 필요해서 install Editor를 통해서 다운받을 것이다.
( 같은 2020버전이면 상관없지만, 연도가 다르다면 내가 구현하는 방법과는 다를 수 있다. )
install Editor에 들어가면 다음과 같이 버전들이 나오고 , 더 많은 버전을 보고 싶다면, Archive에 들어가서 확인 할 수있다.
지난 번과 똑같은 PLATFORMS으로 다운받았는데 , Visual Studio같은경우 나는 있으므로, 다운받지 않아도 된다.
자 이제, 프로젝트를 생성할 준비를 다했으니, 프로젝트를 생성해보자.
우선 Editor Version을 맞게 선택하고, 3D, project name 을 ShootingGame으로했다. ShootingGame을 만들 것이기 때문!그리고 create project를 선택하면, 프로젝트 생성이 완료된다.
위치는 아무곳이나 상관없지만, 한글이 포함되지 않는게 좋다. 안그러면 이상한 동작을 할 수도 있다.
이제부터 제작 환경을 설정해볼 것이다.
- 씬 설정
오른쪽 상단의 layout을 Default에서 Tall 로 바꿔주었다. 바꿔주었을 때 나처럼 scene과 Game이 한 창에 보이지 않는다면, Game을 잡아다 아래로 끌어주면 아래 사진처럼 한창에 보이게 된다.
이제 Scene 뷰를 ios 모드로 변경하고 기즈모를 클릭하여 화면이 Back 뷰가 되도록 설정할 것인데 ,
요 아래 사진을 보면 빨간색 네모 박스안에 있는 Back이라는 글자가 persp이라고 쓰여있을 것이다.
클릭하면, Ios로 변하게 되고 주위에 x,y 이렇게 쓰여있는 부분을 클릭해서 Back뷰가 되도록 전환한다.
(오른쪽은 x, 위쪽은 y)
- 카메라 설정
이제 카메라를 설정해볼 것이다.
Hierarchy 창 → Sample Scene 선택 → Main Camera & Directional Light 존재
기본적으로 Scene 에는 반드시 하나이상의 Main Camera 가 존재하는데, 카메라에는 카메라 Component가 붙어 카메라의 역할을 한다.
위 사진 부분을 카메라 Component 라고 부른다.
다시 설정으로 돌아와서,
- MainCamera에서 Transform → position 에서 y 값을 0으로 변경해준다.
- Projection 에서 Perspective 를 Orthographic으로 변경해준다.
이런 모양이 된다면, 잘 설정된 것이다.
- 조명 설정
이제 조명 설정을 해줄 것이다.
Hierarchy 창에 Directional Light를 선택하고, 오른쪽 Inspector 아래에 있는 Light 박스의 체크표시를 해제해준다.
Light 를 꺼주기위한 과정이다.
위 사진과 같이 Window - Rendering -Lighting 창을 열어준다.
Lighting 창이 열리면 Auto Generate 옵션을 비활성화한다.
우리는 Light를 안쓰기때문에 Performance를 떨어뜨릴 우려를 막기위해서이다.
이제 배경색을 바꿔보자.
위 처럼 Lighting창에서 Environment 항목에서 Environment Lighting의 Source를 Color로 변경해준다.
그리고 Ambient Color를 클릭하고 R,G,B를 모두 255로 변경하여 흰색으로 지정해준다.
- 해상도 설정
Game 창에서 기본 Free Aspect 로 되어있는 부분을 클릭하면 + 버튼이 보인다.
나는 세로로 긴 화면을 보고 싶기 때문에 +버튼을 눌러서 직접 설정할 것이다.
Label은 비워놔도 된다. 설정할 값을 넣고 Ok를 누르면된다.
이렇게 640 x 960 의 세로로 긴 화면으로 바뀌었다.
이렇게 옆으로 화면을 가져와서 본다면 보기 더 편할 것이다.
2. 플레이어 이동 제작
Hierarchy창에 3D Object 를 선택, Cube 를 선택한다.
Cube 가 만들어졌다.
이제 Script를 추가할 것인데, 폴더로 관리하면 더 편하고 보기 좋으므로 폴더를 만들어줄 것이다.
Project 에 + 를 클릭하여 Folder 를 추가해준다.
New Folder가 생겼고, 나는 Scripts로 이름을 변경해주었다.
이 폴더는 Script를 보관하는 용도로 사용할 것이다.
Scripts 를 더블클릭하고 그 안에 Script를 만들어 playermove라는 이름으로 변경해주었다.
지난 번에도 말했듯이 반드시 파일명과 클래스 이름은 동일해야한다.
Cube 이름을 Player로 변경해주고, Script - playermove를 끌어다가 Player에 넣어준다.
이제 Script를 작성해볼 것이다.
Translate 는 오브젝트를 x축, y축, z축으로 이동시키는 함수이다.
해당 함수에 대해 간단히 설명하자면,
- PlayerMove.cs 에 아래 코드를 작성하고 저장한다.
- Unity 로 돌아가 실행 결과를 확인한다.
- 스크립트를 수정하여, 왼쪽, 위, 아래로도 이동할 수 있도록 스크립트를 수정하여 본다.
- 코드의 Vector3.right 를 Vector3.left, Vector3.up, Vector3.down 으로 교차하면 된다.
. deltaTime
- deltaTime은 모든pc에서 동일한 시간에 동일한 거리만큼 이동하게 하기 위해서 곱해주는 것이다.
- deltaTime을 곱해줌으로써 컴퓨터 성능과 관계없이 동일한 환경에서 게임할 수 있게해준다.
- delta 는 변화된 것을 뜻하는데, 그림에서 중간의 구간들은 PC 에서 초당 처리할 수 있는 횟수를 말한다.
- 위쪽 그림은 초당 4번을 실행 할 수 있고, 아래 그림은 초당 2번을 실행 할 수 있기에 초당 움직일 수 있는 거리가 달라진다.(한번에 1m씩 움직인다면 위는 4m, 아래는 2m 이동)
- 동기화 처리를 위해 구간에 걸린 시간(위 0.25, 아래 0.5) 를 각각의 이동 거리에 곱해주면 최종 1 m 씩으로 움직인 거리가 같아진다.
- 회전, 크기 변환 작업에도 deltaTime 을 곱해 주어 동기화 시켜야 한다.
Vector
- Vector 는 크기와 방향을 갖고 있다.
- 사칙연산 중 더하기, 빼기, 곱하기(내적, 외적) 이 가능하다.
- 크기는 그림에서 파란색, 방향은 빨간색 화살표로 표시한다.
Vector 더하기
- Vector 는 모든 힘의 합을 표현할 수있다.
- 오른쪽 화살표 키와 위쪽 화살표 키를 누르면 대각선으로 가는 방향을 만들어 낼 수 있다.
- 골프게임, 당구, 앵그리버드, 포트리스 같은 게임을 제작하는데 사용할 수 있다.
Vector 빼기
- 원하는 지점으로 가는 방향을 찾아 낼 때 유용하게 사용할 수 있다.
- Direction = B – A 의 의미는 A 가 B 로 가고자 하는 방향을 찾는 수식이다.
(참고)
라이프사이클 함수 (Life Cycle Function)
- 유니티 객체의 생애주기를 뜻한다.
- 표에서 처럼 태어남은 Start, 살다가는 Update, 죽다는 OnDestory 함수로 매칭된다.
- 유니티에서의 이벤트 함수에는 접두어로 On 을 붙여준다.
프로젝트 이동에 대해 알아봤으니 이제 실행을 시켜볼건데
Scene뷰는 잘보이는데 , Game뷰에 오브젝트가 보이지 않았다. 나처럼 이런경우가 있을까해서 내용을 첨부해봤다.
(그냥 다 지우고 다시 프로젝트를 만드니까 생겨났다.)
일단 해결되면 해결한 방법을 추후에 올리겠다.
(그냥 다 지우고 새로 만드세요! )
빠르게 훅 지나가지만 움직이는걸 확인할 수 있다.
위에는 transform.Translate(Vector3.right * 5 * Time.deltaTime); 이렇게 속도를 5라고 규정해놨는데, 사용자가 정할 수 있도록 할 수 있다.
위 사진의 빨간 박스의 내용을 써서 inspector창에 노출시킬 수 있다.
이렇게 맨아래 Speed가 생긴 것을 확인할 수있다.
inspector창의 Script창의 숫자보다 우선한다는 것을 알아두자!
(갈길을 잃은 내 마우스도..)
나는 오른쪽으로 움직이는 것만 해봤는데, 왼쪽으로 움직이고 싶으면 - (마이너스) 해주면 된다.
이제 다른 움직임도 봐보자.
마치, 조이스틱의 움직임을 입력한다고 생각하면 된다.
float h = Input.GetAxis("Horizontal"); - 수평 (x, y, 0)
Console창을 통해 확인해볼 수 있다.
아래 영상도 첨부, 실시간으로 수치가 뜬다 .
사용자 입력 처리
Unity 의 [Edit-Project Settings – Input Manager] 의 속성에 등록되어 있는 Horizontal 을 활용
위에 메뉴창에서 Edit 에 Project Settings를 선택하면, 아래 그림에서처럼 Input Manager가 나온다.
Axes ▼ 를 누르면 우리가 사용한 Horizontal 이 나오고 left = Negative Button , right = Positive Button으로 나와있는 것을 확인 할 수있다.
좌우 방향키로 설정이 되어있지만, Alt Negative Button , Alt Positive Button 이 각각 a,d 로 설정되어있으므로 a와 d를 눌러도 같은 효과를 볼 수있다.
이제 수직 방향도 확인해보자.
float v = Input.GetAxis("Vertical"); - 수직
이렇게 Console창에 h와 v로 수평 수직방향이 다 나타나는 것을 확인 할 수있다.
(동시에 누르면 동시에 변하기도 한다.)
아래 동영상을 첨부해서 수치값에 변화도 담아봤다.
방향 만들기
- 사용자 입력에 따라 방향 만들어서 이동한다.
- 사용자 입력에서 받은 값을 방향을 만드는데 사용한다.
- 만들어진 방향을 최종 이동 로직에 적용한다.
영상을 보고 자유자제로 움직일 수 있다. 재밌다.
위에 코드를 더 간단하게는 아래와 같이 써도 된다. 다만 new 를 쓰는게 좋은 방법은 아니다..
public class PlayerMove : MonoBehaviour
{ // 플레이어가 이동할 속력
public float speed = 5;
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 dir = new Vector3(h, v, 0);
transform.Translate(dir * speed * Time.deltaTime); }
}
- Vector3.right * h 를 x, y, z 에 대한 각 성분의 값으로 표현해 보면 (1, 0, 0) * h = (h, 0, 0) 이 된다.
- Vector3.up * v 는 (0, 1, 0) * v = (0, v, 0) 된다.
- 둘을 합하면 (h, 0, 0) + (0, v, 0) = (h, v, 0) 이 되므로, 스크립트를 코드처럼 각 성분으로 변경할 수 있다.
그리고 , 오브젝트를 직접 손으로 움직이다보면,
position값이 변하는 것을 확인할 수있는데, 그런 의미에서 아래처럼 사용해도 된다.
transform.position+= dir*speed*Time.deltaTime } - 누적해서 더 해지거나 빼질 수 있도록 한다.
3. 총알 제작
Hierarchy 창에서 + 선택, Cube를 새롭게 생성하여 이름을 Bullet으로 지어준다.
이렇게 scale 을 조정한 것은 총알처럼 보이려고.. 바로 아래 사진 처럼 !
Bullet으로 Script를 만들어준다.
그리고 마찬가지로 Bullet에 Bullet script를 끌어다가 넣어준다.
총알을 만들기 전 구상해본다면,
위로 계속 이동하고 싶다.
필요속성 : 이동속도
순서 : 1. 방향 구하기
2. 이동하기
- 유니티 에디터 상에 노출하여 기획자가 수정할 수 있도록 접근 제한자를 public 로 하여 speed 변수를 하나 만든다.
- 라이프사이클 함수 중 살아가는 중 계속 호출되는 함수 는 Update 이기 때문에 이 곳에 구현할 것을 추가한다.
- 먼저 위로 가는 up 방향을 구하고 이동 공식 P = P0 + vt 를 이용하여 해당 방향으로 이동
일단 위에서 만든대로라면 자동으로 총알이 발생되는데, 게임을 하다보면 사용자가 어떠한 버튼이나 조작을 해야 총알이 발생된다. 그렇기때문에 나는 Script를 하나 더 작성할 것이다.
- playerFire는 player에 집어넣어준다.
- 하나의 오브젝트에 여러가지 Script를 넣어줄 수 있다.
총알을 발사하는 사용자의 과정을 설명하자면,
- 총의 방아쇠를 당기면 총알 공장에 전화를 하여, 생산된 총알을 받아 발사 하는 흐름으로 이해 할 수 있으며 ,
- 이는 총알 파일을 열어 메모리에 올리는 흐름과 같다.
- 이러한 흐름을 처리해 주는 함수가 Instantiate 함수이다.
또한 , 총알은 여러발이 나오므로, 프리팹(미리 만들어진 오브젝트, 부속품)이라는 편리한 기능을 사용해줄 것이다.
우선 프래팹을 넣을 수 있는 멤버 변수를 작성한다.
Bullet 프리팹 제작
아래 그림처럼 Prefabs이라는 폴더를 만들고, Hierarchy창에서 Bullet을 끌어다가 놓으면 된다.
이렇게 Prefab이 만들어진 것을 확인할 수있다.
그럼 이제 Hierarchy 창에 Bullet은 삭제해주고, Prefabs한 Bullet을 아래 그림처럼 Bullet Factory 에 끌어다놓는다.
이렇게 Bullet Factory를 완성했으니,
그러면 이제 발사 위치를 생성해보자.
Player를 우클릭하고 , Create Empty를 선택한다.
이름을 FirePos로 변경해준 후, 아래 그림처럼 Fire Position에 끌어다 놓아준다.
나는 스페이스를 눌렀을 때, 총알이 발사되도록 만들 것이다.
if (Input.GetButtonDown("Fire1")) -- 만약 사용자가 발사 버튼을 누르면( GetButtonDown - 어떤 버튼을 눌렀을 때 )
GameObject bullet = Instantiate(bulletFactory); --총알 공장에서 총알을 만든다.
bullet.transform.position = firePosition.transform.position; -- 총알을 발사한다.( bullet.transform.position 초기위치 )
만들고나니 너무 재밌다..ㅎ 신난 모습을 영상으로 담아봤다.
오늘은 오류가 나서 조금 당황했다, 하지만 괜찮다(^ㅡ^)!
'SWU_프로젝트 > GURU - unity' 카테고리의 다른 글
GURU_unity_2주차 슈팅 게임 제작3-1 (0) | 2023.07.05 |
---|---|
GURU_unity_2주차 슈팅 게임 제작2 (4) | 2023.07.04 |
GURU_unity_1주차 C#스크립트 익히기 3 (2) | 2023.06.29 |
GURU_unity_1주차 C#스크립트 익히기 2 (6) | 2023.06.29 |
GURU_unity_1주차 C#스크립트 익히기 1 (6) | 2023.06.28 |