경험들/배우기

[Unity] 1/23 유니티 3D 기초 연습

detail_jy 2022. 1. 23. 19:57
728x90

Brackeys 라는 유튜브 채널의 유니티 기초 강좌를 듣고 있는데 이제까지 들은 강좌중에서 초보자용으로 제일 좋은 것 같다. 

쉽고 간결하게 설명도 잘해주고, 혼자 답을 찾아볼 수 있도록 유도해준다. 

 

게임개발 채널로 유명한데 아쉽게도 채널 운영을 중단했다고 한다. ㅠㅠ 

 

콘텐츠는 계속 있어서 다행이다. 

 

 

 

오늘 배운 것 정리 

 

1. Prefab 만들기 

- Hierarchy 에 있는 오브젝트를 드래그해서 Asset에 끌어주면 Prefab가 생성된다. 

- 생성된 Prefab를 씬에 드래그하면 게임 씬에 나타난다. 

- Prefab를 선택한 후, Inspector에서 속성값을 바꿔줄수도 있고, Hierarchy에서 개별 오브젝트 별로 바꿔줄수도 있다 

 

2. 바닥 (Ground) 레이어 Lock 하는 법 

하얀 바닥 부분은 건들지 않을거니까 오브젝트 선택할때 바닥이 실수로 선택되지 않도록 레이어를 잠가주는 법 

'Ground'를 선택하고 -> Inspector에서 Layer 부분에 드랍다운을 눌러줌 

 

맨 밑에 'Add Layer'를 눌러준 후 User layer 란 아무대나 이름을 붙여줌 'environment'라고 적어주었다.  

그런다음 상단 Layer 에서 드랍다운으로 하면 새로 생성된 레이어가 보이는데, 그 레이어에 잠금을 눌러주면됨

 

그렇게하면 씬에서 선택되지 않도록 설정할 수 있음. 

 

 

3. 물체의 방향 전환 할 때 반응속도 자연스럽게 높여주기 (ForceMode.VelocityChange)

 

물체의 physics와 관련 있는거라 개념을 이해하기는 어려운데, 

public float forwardForce = 2000f;
    public float sidewaysForce = 200f;

    void FixedUpdate()
    {
      // Add a forward force
      rb.AddForce(0, 0, forwardForce * Time.deltaTime);

      if ( Input.GetKey("d") )
      {
        //Only executed if condition is met
        rb.AddForce(sidewaysForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
      }

      if (Input.GetKey("a"))
      {
        //Only executed if condition is met
        rb.AddForce( -sidewaysForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
      }
    }

아래 코드를 보면 'd' 키를 누르면 sideways로 움직이고, 'a'키를 누르면 반대방향으로 움직이게 되어있다. 

옆방향으로 움직일 때 오브젝트에 부여한 sidewaysForce 값때문에 방향을 갑자기 틀 때 바로 확 방향이 바뀌는게 아니라 방향을 전환하는 시간이 좀 걸려 반응이 느리게 느껴지는데, 이 느낌을 없애고 방향전환시 반응속도를 더 빠르게 하기 위해서 해주는 것 같다. 

그래서 sideways force를 준 (x,y,z 값 뒤에 콤마를 붙이고 ForceMode.VelocityChange 를 넣어줌.. 

(사실 이해는잘안된다) 

 

여기서 추가로 다시 유니티로 돌아와서, 플레이어 선택한채, 인스펙터의 Rigidbody 컴포넌트에서 Drag 값을 0에서 1로 바꿔준다. 

 

Drag는 공기저항과 관련된 값이라고 한다 . (air resistance) 

이 값이 커질수록 공기에의해 더 빠르게 멈출수 있다고 한다.. 

 

4. 게임 씬에 안개 (Fog) 넣어주기 

 

Window -> Rendering -> Lighting -> 'Environment' 탭 -> Fog에 체크 해주기 

 

여기서 세부 조절 할 수있음. 색상, Fog의 농도 등 조정해주면 됨. 

 

안개 효과 

Fog를 넣어주는 이유는 게임할 때 장애물이 앞에 훤히 다 보이면 예측가능해서 재미없기 때문에 바로 앞에 있는것만 보여지게 하기 위해서라고 함. (게임을 잘 안해봐서 이런 이야기들이 다 생소하다..ㅋㅋ)

 

* 게임을 잘 안하는데 유니티는 게임 엔진이기 때문에 많은 튜토리얼들이 게임개발 쪽으로 특화되어 있어서 어쩔수는 없다.. 게임과 친해져야하나.. 

-----------------------------------------------------------------------------------------------------------------------

 

#07 - UI 넣어주기 

 

게임에는 오브젝트 뿐만 아니라 스코어나 포인트 같은 요소를 보여주기 위해 텍스트 UI요소가 들어간다. 

 

처음으로 Text를 넣는 방법을 배워봤다. 

 

마찬가지로 Hierarchy에서 우클릭하고 UI -> Text 순서로 해준다. 

Text는 2D요소이기 때문에 편의상 씬을 2D모드로 바꿔준다. 

 

텍스트 박스가 위처럼 생성되고, 

Inspector 쪽에는 텍스트 속성을 바꿔줄 수 있다. 다른 디자인 툴들과 텍스트 조정해주는 것은 비슷하다 

폰트도 바꿔줄 수 있는데, 

유니티 프로젝트에서 사용할 폰트를 애셋으로 넣어주어야 폰트 변경이 가능한 것 같다. 

필요한 폰트 파일을 다운 받아 애셋에 드래그 해주면 그 폰트 중에서 선택하는 것이가능하다. 

 

또 한가지 바꿔줄 것은, Hierarchy 에서 Text를 생성하면 자동적으로 'Canvas' 레이어도 함께 생기는데

Canvas를 선택하고 Inspector를 보면 텍스트를 게임 스크린에 맞춰 반응성으로 사이즈가 바뀌도록 설정할 수 있다. 

고정된 텍스트 사이즈가 아니라 화면을 키우면 비례해서 키우는것이다. 

 

일반적으로는 그렇게 하니까 UI scale mode를 아래와같이 설정한다

Match도 슬라이더를 Height 쪽으로 끌어준다. 

 

다음으로는 게임을 플레이할 때 숫자가 고정되어있는건 아니니 숫자가 바뀌도록 해줘야한다.

 

 

Text 오브젝트에 Component를 더해주어 새로운 Script파일을 만들어주고 'Score'로 파일이름을 적어준다. 

 

스크립트로 들어와 코드를 작성해준다. 

public Transform player;

이렇게 써준후, 유니티에서 Score Script 부분에 Player 란이 생성도니 것을 볼수있는데, 이때 player 오브젝트를 레퍼런스 해줘야한다. (이 단계를 깜빡해서 에러가 났었는데 이유를 한참 찾았다) 

 

using UnityEngine;
public class Score : MonoBehaviour
{
    public Transform player;

    void Update()
    {
        Debug.Log(player.position.z);
    }
 
 
Player를 레퍼런스 해주었다면 
플레이어가 움직임에 따라 포지션을 표시해줄 수 있는데, 이때 
Update 부분에 Debug.Log를 작성해준다. 괄호에는 player.position.z 라고 적어준다. z는 오브젝트가 앞으로 가는 방향이 x,y,z 중 z 방향이기 때문이다. 
 
 
그런다음 플레이 해주면 
콘솔에 바뀐 z 값이 계속 디스플레이 된다. 
 
 

이제 우리가 해야할건 저 숫자들을 

화면 UI로 보여주는 것이다. 

 

게임 장면에서 텍스트가 바뀌는 것을 보여주려면 

UnityEngine.UI 코드 한줄을 추가해줘야한다. (유저인터페이스를 위한 코드를 쓸때 꼭 써야한다) 

 

그런다음 Score Script에 Player을 추가한것처럼 Text 'type'을 추가해줘야한다 

아래와같이 public에 코드를 추가해준다. 

public Text scoreText;

그런다음 Update 부분에는 Debug.Log는 지우고 텍스트를 어떻게 표시할건지 적어줘야하는데, 

scoreText.text = player.position.z  ; 

 

이렇게 작성하면 에러가 난다. 텍스트를 표기하기 위해서는 variable 타입을 float나 integer이 아닌 'string'으로 바꿔줘야하기 때문이다. 

 

scoreText.text = player.position.z.ToString();
 
이렇게 바꾸고 난뒤에 유니티로 돌아와서 Score Script 속성중 새로 생성해준 'score text'에서 'Text'오브젝트를 꼭 선택해준다. 
 
 

게임 플레이를 시켜본다.

 

숫자가 마구 바뀐다. 근데 소수점 네자리까지 보여줄 필요는 없다.

 

정수로 보여주려면 마지막 코드만 살짝 바꿔주면 된다.

 

맨끝에 ToString("0") ; 이렇게. 

 

저렇게 해주면 숫자가 정수로 표시된다 ! 

 

오늘의 노트 작성은 여기까지! 

 

내일 또 새로운 내용을 이어서 해봐야지. 

 

참고한 유튜브 강의 링크: 

 

https://www.youtube.com/watch?v=j48LtUkZRjU&list=PLPV2KyIb3jR53Jce9hP7G5xC4O9AgnOuL 

 

반응형
LIST