chyam

[unity] - 로켓을 움직여 도착지에 도달하는 미니게임 본문

unity

[unity] - 로켓을 움직여 도착지에 도달하는 미니게임

chyam_eun 2025. 1. 8. 15:27

유데미에서 배운 내용을 정리하는 글입니다.

 

먼저, '양파 디자인'은 핵심 요소를 정하고, 그다음으로 중요한 요소를 계속 정하는데, 이것이 양파와같이 쌓인다고 해서 붙여진 이름입니다. 핵심요소 외의 요소들은 중심요소를 더 좋게 만들어야합니다.

이 프로젝트에서의 핵심요소는 '움직임'이고, 그 다음은 '충돌과 레벨 진행' 입니다.

아래는 최종적으로 맵을 꾸민 뒤의 사진입니다. 우주를 느낌으로 만든 맵입니다.

 

아래는 알아두어야할것 입니다.

 

프리펩을 많이 사용하는데, 이때 프리펩 안에서 수정하는것이 아니라

hierarchy창에 있는 프리펩을 변경하고 난뒤 assets에 있는 프리펩에 적용하고 싶으면, 

Overrides를 누르고 Apply All을 눌러주어야합니다.

 

우주를 배경으로 한 맵이라서 중력을 약간 다르게 한다던지, 공기저항(Drag)을 다르게할 수도 있고, 여기서 사용하진 않았지만 바람이 부는것처럼 만들 수도 있습니다.

이것들은 RigidBody에서 수정하면 됩니다. 처음 공기저항은 0인데 0.25로하여 약간 느려지게됩니다.

위에서 Freeze Position에 Z를 체크한 이유는 Z축은 이동을 안할거라서 해두었고, Freeze Rotation에 x,y를 체크한 이유는 x,y를 고정하기위해서입니다. 쉽게 생각하면 Y축으로 회전한다는것은 아래와 같이 회전한다는 뜻입니다.

현재 목표는 Z축을 기존으로 회전하는것이므로 나머지를 고정시켜주었습니다.

 

만약 오른쪽에서 바람이 불어와서 밀리는 효과를 보고 싶다면, 

[Edit]-[Project Settings]-[Physics] 에서 Gravity의 X값을 -로 해주면 됩니다.

 

메인카메라에는 Audio Listener이 있고, Audio Source는 소리가 날 개체에 있어야합니다.

[Edit]-[Project Settings]-[Audio]-[System Sample Rate] 가 1이어야 오디오가 재생됩니다.

오디오를 추가하면 스피커 표시가 뜨는데 이를 작게 만들기 위해서는 위와같이 3D icons 를 조절해주시면 됩니다.

Scene을 여러개를 만들어 로드하려면 [File]-[Build Settings]에서 'Add Opne Scenes'를 눌러서 추가해주어야합니다. 오른쪽에 0, 1 이것들은 씬 레벨이라고 합니다.

또한 hierarchy창에 있는 프리펩을 다시 Assets으로 끌어오면 위와같이 뜨는데, Original Prefab은 원본을 수정하면 같이 수정되는것, Prefab variant은 원본을 수정하면 따로 수정한것과 합해져서 결과가 나오는것입니다.

 

Scene에 Global과 Local이 있는데, Global을 하면 축이 도형기준으로 생기고 Local로하면 그냥 축 기준으로 생깁니다.

Global
Local

 

> 맵을 어둡게 만들려면?

[Window]-[Rendering]-[Lighting]을 누르고 Environment를 누른뒤 Skybox Material에 새로운 Mateial을 만들고 넣습니다. 새로운 Material을 아래와같이 만들어줍니다. Sky Tint으로 하늘색을 바꿀수있습니다. 카메라도 아래처럼하면 완전 어두워집니다.

 

 

> 조명에 대해서

Light에는 Main Directional Light(Sun)과 Point Light, Spotlight 등이 있습니다.

Point Light에서는 range나 intensity로 빛을 조절합니다.

Spotlight는 콘모양으로 빛이 나옵니다. 

Material에서 Emission을 조정하면 자체적으로 빛이 날수 있습니다.

 


총 4개의 스크립트(움직임, 충돌, 움직이는 물체, 나가기)를 사용합니다. 전체 스크립트는 적지않고 알아둘만한 부분만 적겠습니다.

 

AddRelativeForce는 상대적인 힘으로, 파라메타가 (1,1,1)이면 1씩 커진다는 뜻입니다.

AddRelativeForce(0,1,0)은 AddRelativeForce (Vector3.up)과 같습니다. (y축으로 1씩 커지는것)

 

audio를 사용할때 보통 audio.Play()를 사용하는데, 오디오를 중첩해서 쓰고싶을때는 audio.PlayOneShot(이름)을 사용합니다.

이때 소리가 나는중인지를 알기위해서는 audio.isPlaying을 사용하면됩니다.

 

> Scene을 이동할때 알아야할것들

다른 Scene을 불러오려면 SceneManager.Load(씬 인덱스/이름)을 해주면 됩니다.

현재 사용중인 Scene의 인덱스를 반환하고 싶으면 SceneManager.GetActiveScene().buildIndex를 해주면됩니다. 

SceneManager.sceneCountInBuildSettings는 빌드에 있는 Scene의 개수를 반환해줍니다.

 

Invoke("함수이름", 시간)을 해주면 함수를 ~초뒤에 실행합니다. 지연해주는 역할입니다.

 

edit collider을 누르면 세세하게 충돌 범위를 수정할수 있습니다.

 

> Particle System

hierarchy에서 우클릭으로 Particle System을 추가하면 위의 사진이 기본인데, 

그냥 아무 물체에서 Component에 Particle System을 추가하면 아래와같이 나옵니다. 유니티에서 분홍색이 입혀진 오브젝트는 보통 제공된 재질이 없다는 뜻입니다. ( Renderer에 material이 없다는 것 )

파티클도 오디오처럼 .Play하면 실행되고, Stop하면 멈추고, isPlaying으로 실행여부를 알 수 있습니다. Play on awake를 누르면 시작하자마자 실행됩니다.

 

 

메소드를 따로 저장할때 스크롤하여 Ctrl+.을 누르면 됩니다.

 

> 양옆으로 움직이는 물체 만들기

양옆으로 움직이는 물체를 만드려면 0에서 1사이를 계속 곱하여 차근차근 올라갔다가 내려가게 만들어야합니다. 이때 sin함수를 사용해야하는데, tau라는 것을 2파이로 만들어 편하게 계산하였습니다. Mathf.Epsilon은 매우 작은수로 이것보다 작을땐 리턴하여 멈춥니다.

sin함수는 -1~1사이를 움직이므로 0~1을 움직이기위해 약간 조정해줍니다.

현재는 삭제하였지만 변수앞에 [Range(0,1)]을 붙여주면 0부터1까지 조절할수있는 슬라이더가 생깁니다.

if (period <Mathf.Epsilon) {  return; }
float cycles = Time.time / period; //몇초에 한 사이클.

const float tau=Mathf.PI *2; //원주율*2
float rawSinWave=Mathf.Sin(cycles*tau); //-1~1 (반지름 1인 원의 사인파그리기)

movementFactor=(rawSinWave+1f)/2f; //0~1

Vector3 offset = movementVector * movementFactor; 
transform.position = startingPosition+offset;

 

게임을 나가는방법은 Application.Quit()를 사용하면 됩니다.