Unity에서 유연한 게임 오브젝트 제어를 위한 변수 활용법

GoGoComputer·2024년 10월 27일

unity2d game

목록 보기
6/17
post-thumbnail

part 1/2: 변수

Unity에서 변수를 추가하여 게임 오브젝트의 움직임을 더욱 유연하게 조절하는 방법에 대해 자세히 알아보겠습니다. 변수를 사용하면 숫자를 더 쉽게 관리하고, 자동차와 같은 오브젝트의 움직임을 다양하게 변경할 수 있습니다.

현재 문제점 이해하기

우리가 만든 자동차는 현재 고정된 속도와 회전만을 가지고 있습니다. 즉, 엑셀을 밟아 속도를 높이거나, 좌우로 회전하는 등의 동적인 움직임을 구현하지 못하고 있습니다. 왜 그럴까요?

그 이유는 바로 하드코딩(hardcoding) 때문입니다. 하드코딩이란, 코드 안에 값을 직접 입력하여 수정이 어렵게 만드는 것을 의미합니다. 이렇게 하면 값을 변경하려면 매번 코드를 수정해야 하므로 비효율적입니다.

변수를 사용해야 하는 이유

이 문제를 해결하기 위해 변수를 사용해보겠습니다. 변수는 데이터를 저장하고 조작하며, 필요할 때 참조할 수 있는 일종의 상자라고 생각하면 됩니다. 변수를 사용하면 코드의 유연성이 높아지고, 유지보수가 쉬워집니다.

변수란 무엇인가요?

변수는 세 가지 주요 요소로 구성됩니다:

  1. 이름(name): 변수를 식별하는 데 사용됩니다.
  2. 값(value): 변수에 저장되는 실제 데이터입니다.
  3. 자료형(type): 변수에 저장되는 값의 종류를 정의합니다.

예를 들어, hitPoints라는 변수가 있다고 해봅시다:

int hitPoints = 20;
  • 이름: hitPoints
  • : 20
  • 자료형: int (정수형)

여기서 hitPoints는 현재 20이라는 값을 가지고 있으며, 게임 캐릭터의 체력을 나타낼 수 있습니다. 이 값은 상황에 따라 0이 될 수도 있고, 100이나 그 이상이 될 수도 있습니다.

변수의 자료형

변수는 저장하는 데이터의 종류에 따라 다양한 자료형이 있습니다. 주요 자료형은 다음과 같습니다:

  • int (정수형): 소수점이 없는 숫자입니다. 예: -10, 0, 42
  • float (부동소수점형): 소수점을 포함하는 숫자입니다. 소수점 아래 약 6~7자리까지 표현 가능합니다. 값을 지정할 때 숫자 뒤에 f를 붙입니다. 예: 3.14f, 0.01f
  • double (이중 정밀도 부동소수점형): float보다 더 많은 소수점 자리수를 표현할 수 있습니다. 소수점 아래 약 15자리까지 가능합니다. 예: 3.141592653589793
  • bool (불리언형): true 또는 false의 값만 가질 수 있습니다. 논리적인 상태를 나타낼 때 사용합니다.
  • string (문자열형): 문자들의 집합입니다. 텍스트를 저장할 때 사용하며, 큰 따옴표 "로 값을 감쌉니다. 예: "Hello, World!"

변수 선언과 초기화

변수를 선언하고 값을 지정하는 방법은 다음과 같습니다:

자료형 변수이름 =;

예를 들어:

  • float 변수 선언:

    float speed = 3.8f;

    여기서 speed라는 이름의 float 변수를 선언하고 3.8f라는 값을 대입했습니다.

  • bool 변수 선언:

    bool isAlive = true;

    isAlive라는 이름의 bool 변수를 선언하고 true 값을 대입했습니다.

  • string 변수 선언:

    string myName = "Rick";

    myName이라는 string 변수를 선언하고 "Rick"이라는 문자열을 대입했습니다.

변수 이름 짓기

변수 이름을 지을 때는 카멜 표기법(camelCase)을 사용합니다:

  • 첫 번째 단어는 소문자로 시작합니다.
  • 두 번째 단어부터는 첫 글자를 대문자로 씁니다.

예:

  • hitPoints
  • moveSpeed
  • steerSpeed

Unity에서 변수 사용하기

이제 실제로 Unity 프로젝트에서 변수를 추가해보겠습니다.

1. steerSpeed 변수 추가

자동차의 회전 속도를 조절하기 위해 steerSpeed 변수를 선언하겠습니다.

  1. 클래스 내부에 변수 선언: 스크립트 파일에서 Start() 메서드 위에 다음 코드를 추가합니다.

    float steerSpeed = 0.1f;

    여기서 steerSpeed는 자동차의 회전 속도를 나타내며, 초기 값은 0.1f입니다.

  2. Update() 메서드에서 변수 사용: 기존에 하드코딩된 값 대신 변수를 사용합니다.

    transform.Rotate(0, steerSpeed, 0);

    이렇게 하면 steerSpeed의 값을 변경하여 회전 속도를 쉽게 조절할 수 있습니다.

2. 과제: moveSpeed 변수 추가

이번에는 여러분이 직접 해볼 차례입니다. 자동차의 이동 속도를 조절하는 moveSpeed 변수를 추가하고, transform.Translate() 메서드에서 이 변수를 사용해보세요.

힌트:

  • 변수 선언:

    float moveSpeed = 0.01f;
  • 변수 사용:

    transform.Translate(0, 0, moveSpeed);

과제를 완료했다면 스크립트를 저장하고 Unity로 돌아가서 실행해보세요. 자동차가 이전과 동일하게 움직이는지 확인해보세요.

변수 값 변경하여 테스트하기

변수의 값을 변경하면 오브젝트의 동작이 어떻게 달라지는지 확인해볼 수 있습니다.

steerSpeed 값 변경

steerSpeed의 값을 1f로 변경해봅시다:

float steerSpeed = 1f;
  • float 변수에 정수 값을 대입할 때는 f를 생략할 수 있지만, 일관성을 위해 항상 f를 붙이는 것이 좋습니다.
  • 이렇게 값을 변경한 후 Unity에서 실행해보면, 자동차의 회전 속도가 훨씬 빨라진 것을 확인할 수 있습니다.

왜 변수를 사용할까요?

변수를 사용하면 다음과 같은 장점이 있습니다:

  • 유연성: 코드의 특정 부분만 수정하여 전체 동작을 변경할 수 있습니다.
  • 재사용성: 변수를 사용하면 동일한 값을 여러 곳에서 사용할 수 있습니다.
  • 가독성: 변수 이름을 통해 코드의 의미를 쉽게 파악할 수 있습니다.

하드코딩된 값은 코드의 수정과 유지보수를 어렵게 만듭니다. 반면 변수를 사용하면 값의 변경이 필요할 때 변수만 수정하면 되므로 코드 관리가 수월해집니다.


전체 코드

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Driver : MonoBehaviour
{
    float steerSpeed = 1f;
    float moveSpeed = 0.01f;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Rotate(0, 0, steerSpeed);
        transform.Translate(0, moveSpeed, 0);
    }
}

다음 단계: Unity 에디터에서 변수 조절하기

매번 코드를 수정하여 값을 변경하는 것은 비효율적입니다. 다음 단계에서는 변수에 public 접근 제한자를 사용하거나 [SerializeField] 속성을 추가하여 Unity 에디터의 인스펙터에서 직접 변수를 조절하는 방법을 알아보겠습니다.

예를 들어, 변수를 다음과 같이 수정합니다:

public float steerSpeed = 0.1f;

또는

[SerializeField]
float steerSpeed = 0.1f;

이렇게 하면 Unity 에디터에서 스크립트가 추가된 오브젝트를 선택했을 때 인스펙터에서 steerSpeed의 값을 직접 수정할 수 있습니다.

요약

  • 변수란? 데이터를 저장하고 조작하며 참조할 수 있는 상자와 같습니다.
  • 왜 사용하는가? 코드의 유연성과 유지보수를 쉽게 하기 위해서입니다.
  • 변수의 구성 요소: 이름, 값, 자료형.
  • 주요 자료형: int, float, double, bool, string.
  • 변수 선언 방법: 자료형 변수이름 = 값;
  • 변수 사용 방법: 메서드 내에서 변수명을 사용하여 동작을 조절합니다.
  • Unity 에디터에서 변수 조절: public 또는 [SerializeField]를 사용하여 인스펙터에서 값을 변경할 수 있습니다.

변수를 적절히 활용하면 게임 개발에서 복잡한 동작을 쉽게 구현하고 관리할 수 있습니다. 다음 시간에는 Unity 에디터를 활용하여 변수를 더욱 효과적으로 관리하는 방법에 대해 알아보겠습니다.

그럼 다음에 만나요!


part 2/2 SerializeField

Unity에서 변수를 직렬화하여 Inspector 창에서 조정하는 방법에 대해 자세히 알아보겠습니다. 이를 통해 게임 개발 과정에서 속도나 조향 속도 등을 실시간으로 변경할 수 있고, 특히 디자이너와 협업할 때 매우 유용합니다. 디자이너가 직접 코드를 수정하지 않고도 게임의 특정 요소를 조정할 수 있기 때문입니다.

1. 시작하기 전에

우리가 만든 steerSpeed 변수를 Inspector에서 조정할 수 있도록 만들어 보겠습니다. 이렇게 하면 게임 플레이 중에 속도를 조정하여 게임의 동작 방식을 실시간으로 확인할 수 있습니다.

2. 변수 직렬화의 중요성

변수를 Inspector에 노출시키는 것은 개발 시간과 노력을 크게 절약해줍니다. 코드를 수정하고 다시 컴파일하는 과정을 거치지 않고도 값만 변경하여 게임의 동작을 바로 확인할 수 있기 때문입니다. 특히 팀 내에서 디자이너가 게임 밸런싱이나 조정 작업을 할 때 매우 효율적입니다.

3. 코드 수정하기: 변수 직렬화

이제 실제로 코드를 수정해보겠습니다.

  1. Driver.cs 파일 열기: 우리가 수정할 스크립트 파일입니다.

  2. moveSpeed 변수 찾기: 이 변수는 자동차의 이동 속도를 결정합니다.

  3. [SerializeField] 어트리뷰트 추가하기:

    [SerializeField]
    float moveSpeed = 0.01f;
    • [SerializeField]는 Unity에서 제공하는 어트리뷰트로, private 변수도 Inspector에 노출시킬 수 있습니다.
    • 이렇게 하면 해당 변수를 Inspector 창에서 직접 조정할 수 있게 됩니다.
  4. 코드 저장하고 Unity로 돌아가기: 변경 사항을 저장한 후 Unity 에디터로 돌아가면 자동으로 컴파일이 진행됩니다.

4. Inspector에서 변수 확인 및 조정

  1. 자동차 오브젝트 선택하기: Hierarchy 창에서 자동차 오브젝트를 선택합니다.

  2. Inspector 창 확인:

    • Driver 스크립트 컴포넌트에서 moveSpeed 변수가 보일 것입니다.
    • 초기값으로 우리가 코드에서 설정한 0.01이 표시됩니다.
  3. 속도 값 변경하기:

    • moveSpeed 값을 0.03으로 변경해보세요.
    • 이제 Play 버튼을 눌러 게임을 실행하면 자동차가 더 빠르게 움직이는 것을 볼 수 있습니다.
  4. 실시간 조정:

    • 게임이 실행되는 동안에도 moveSpeed 값을 조정할 수 있습니다.
    • 값을 올리면 자동차가 더 빠르게 움직이고, 내리면 더 느려집니다.
    • 이를 통해 게임 플레이 중에도 실시간으로 변수의 영향을 확인할 수 있습니다.

5. 중요한 점: Inspector의 값 우선순위

코드에서 설정한 초기값이 있더라도, Inspector에서 값을 변경하면 그 값이 우선됩니다. 즉, Inspector에서 설정한 값이 저장되고 적용됩니다. 따라서 가끔 코드를 보면 0.01로 설정되어 있는데 게임에서는 다른 속도로 움직이는 경우가 발생할 수 있습니다. 이는 Inspector에서 값이 변경되었기 때문입니다.

6. steerSpeed 변수도 직렬화하기

이번에는 steerSpeed 변수를 Inspector에서 조정할 수 있도록 만들어보겠습니다.

  1. Driver.cs 파일에서 steerSpeed 변수 찾기.

  2. [SerializeField] 어트리뷰트 추가하기:

    [SerializeField]
    float steerSpeed = 0.1f;
  3. 코드 저장하고 Unity로 돌아가기.

  4. Inspector에서 확인:

    • 이제 steerSpeed 변수도 Inspector에 나타납니다.


      전체 코드

      using System.Collections;
      	using System.Collections.Generic;
      	using UnityEngine;
      
      	public class Driver : MonoBehaviour
      {
       [SerializeField] float steerSpeed = 1f;
       [SerializeField] float moveSpeed = 0.01f;
      
       // Start is called before the first frame update
       void Start()
       {
           
       }
      
       // Update is called once per frame
       void Update()
       {
           transform.Rotate(0, 0, steerSpeed);
           transform.Translate(0, moveSpeed, 0);
       }
      }

7. 도전 과제: Inspector로 자동차 운전하기

  1. moveSpeed 값을 낮추기:

    • 자동차가 너무 빠르게 움직이면 조작하기 어려우므로 moveSpeed 값을 0.01로 낮춥니다.
  2. 게임 실행 및 조정:

    • Play 버튼을 눌러 게임을 실행합니다.
    • 게임이 실행되는 동안 steerSpeed 값을 조정하여 자동차의 회전 속도를 변경해보세요.
    • 값을 높이면 자동차가 더 급하게 회전하고, 값을 낮추면 회전이 완만해집니다.
  3. 실시간으로 방향 전환하기:

    • steerSpeed 값을 조정하면서 자동차의 방향을 바꿔보세요.
    • 왼쪽으로만 돌던 자동차가 오른쪽으로도 돌게 할 수 있습니다.

8. 결과 및 다음 단계

Inspector에서 변수를 조정하여 자동차를 움직여보면서 변수의 중요성과 실시간 조정의 편리함을 느끼셨을 것입니다. 하지만 플레이어가 게임을 플레이할 때는 Inspector를 사용할 수 없으므로, 다음 단계는 키보드 입력을 통해 자동차를 조작할 수 있도록 만드는 것입니다.

이를 통해 플레이어는 키보드를 사용하여 자동차의 이동과 회전을 직접 컨트롤할 수 있게 될 것입니다.

9. 요약

  • [SerializeField] 어트리뷰트 사용: 변수를 Inspector에 노출시켜 실시간 조정 가능.
  • Inspector의 우선순위: Inspector에서 설정한 값이 코드보다 우선 적용됨.
  • 실시간 조정의 이점: 게임 실행 중에도 변수 값을 변경하여 즉각적인 변화를 확인할 수 있음.
  • 다음 목표: 키보드 입력을 받아 플레이어가 직접 자동차를 조작할 수 있도록 개선.

10. 마무리

이번 시간에는 Unity에서 변수를 직렬화하여 Inspector에서 조정하는 방법을 자세히 알아보았습니다. 이를 통해 개발 과정에서 더욱 효율적으로 작업할 수 있고, 팀원들과의 협업에서도 큰 도움이 됩니다. 다음 시간에는 키보드 입력을 통해 플레이어가 직접 게임을 조작할 수 있도록 하는 방법을 알아보겠습니다.

profile
IT를 좋아합니다.

0개의 댓글