Unity/Unity 기초

Unity 강의 2일차 (4) - 비행기 프로그래밍

하참이 2025. 1. 16. 20:46

본 강의는 다음 문서를 참고하여 제작하였습니다. 자세한 내용은 하단 링크를 참조하시거나 댓글로 질문 남겨주시면 성심성의껏 답변 드리겠습니다.

 

https://learn.unity.com/tutorial/gwaje-1-bihaenggi-peurogeuraeming?uv=2021.3&pathwayId=63ca4663edbc2a7be103183f&missionId=62ceb5c2edbc2a08dbf5f531&projectId=63c62efbedbc2a291fd6a62a#

 

과제 1 - 비행기 프로그래밍 - Unity Learn

과제 개요: 자동차 주행 시뮬레이션에서 학습한 기술을 사용하여 공중에서 장애물 주위로 비행기를 조종합니다. 위쪽 및 아래쪽 화살표를 통해 사용자 입력을 받아 비행기의 상승 및 하강을 제

learn.unity.com

 


 

 

본 강의는 Unity 공식 홈페이지에서 주어진 문제를 해결하는 과정을 담도록 하겠습니다. 본인이 직접 문제를 풀고 싶으신 분들은 위 문서를 참고해주시면 되겠습니다.

 

 

우선 패키지를 Import 해봅시다.

 

 

 

 

 

Import하고 영상을 참조하여 과제를 제출하라고 합니다. 확인해보니 플래피버드와 같은 게임을 비행기로 구현한 것이네요.

 

 

 

 

 

 

첫 번째 문제를 봅시다. 비행기가 뒤로 이동한다고 합니다.

 

이전 단계를 공부한 분들이라면 비행기의 컨트롤러 스크립트를 확인 하면 될 것이라는 것을 알 수 있을 것 입니다.

 

 

 

 

 

역시 PlayerControllerX가 있네요. 여기서 Speed를 -값으로 바꿔주는 기상천외한 방법도 사용할 수 있겠지만 원하는 답은 그것이 아니겠지요. 코드로 넘어가봅시다.

 

 

    void FixedUpdate()
    {
        // get the user's vertical input
        verticalInput = Input.GetAxis("Vertical");

        // move the plane forward at a constant rate
        transform.Translate(Vector3.back * speed);

        // tilt the plane up/down based on up/down arrow keys
        transform.Rotate(Vector3.right * rotationSpeed * Time.deltaTime);
    }

 

 

 

이전의 코드와는 다른 부분들이 있네요.

 

일단 FixedUpdate는 넘어갑니다.

 

어? transform.Translate에서 Vector3.back이 speed와 곱해지고 있네요. Vector3.forward로 바꿔줍니다.

 

 

 

 

두번째 문제로는 비행기가 너무 빠르다는 문제가 있었습니다.

 

생각해보면 프레임 단위마다 스피드를 15씩 곱해주고 있었네요. 이럴경우엔 deltaTime을 사용해야 한다고 말씀 드렸습니다.

 

2번째 줄을 다음과 같이 변경합니다.

 

 

     transform.Translate(Vector3.forward * Time.deltaTime * speed);

 

 

 

 

세번째 문제로는 비행기가 자동으로 기울어진다고 합니다.

 

Rotate 관련한 문제인가보군요. 3번째 줄을 살펴봅시다.

 

아 Time.deltaTime은 적혀있지만 verticalInput을 곱해주지 않으니 입력을 해도 입력값이 대입이 되지 않았던 것 입니다.

 

verticalInput을 곱해줍니다.

 

 

 

    transform.Rotate(Vector3.right * rotationSpeed * Time.deltaTime * verticalInput);

 

 

위 키를 누르면 하강, 아래 키를 누르면 상향합니다. 비행기 게임은 이 조종법이 맞지만, 해당 사항이 불편하신 분들은 Vector3를 right가 아닌 left로 바꾸셔도 무방합니다.

 

 

 

 

6, 7번째 문제는 카메라가 비행기 전면에 위치하고, 카메라가 비행기를 따라가지 않는다고 되어있습니다.

 

카메라에 관련 스크립트 컴포넌트가 붙어있는지 확인하여 봅니다.

 

 

 

 

Follow Player X 가 잘 있네요!

 

그런데..  Plane 프로퍼티에 어떤 게임 오브젝트도 할당이 되어있지 않았습니다.

 

코드가 어떻게 되어있는지는 모르겠지만 일단 비행기를 따라가게 하려면 여기에 비행기 게임 오브젝트를 할당해주어야겠네요.

 

드래그 해서 할당해줍니다.

 

 

 

 

 

 

 

카메라 위치 말고도 다른 오류가 있을 수 있으니 한번 Follow Player X  스크립트를 확인해봅니다.

 

 

 

 

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

public class FollowPlayerX : MonoBehaviour
{
    public GameObject plane;
    private Vector3 offset;

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

    }

    // Update is called once per frame
    void Update()
    {
        transform.position = plane.transform.position + offset;
    }
}

 

 

 

보아하니 offset을 private로 변수를 선언해주었으나 값이 초기화가 되어있지 않았습니다.

 

적절한 값을 할당해주어 비행기를 바라보도록 카메라의 위치를 조정해줍니다.

 

 

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

public class FollowPlayerX : MonoBehaviour
{
    public GameObject plane;
    private Vector3 offset = new Vector3(20, 0, 0);

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

    }

    // Update is called once per frame
    void Update()
    {
        transform.position = plane.transform.position + offset;
    }
}

 

 

 

그리고 기존 카메라의 Transform의 Rotation 도 조절해줍니다.

 

 

 

 

 

Y값을 180 에서 270으로 바꿔주었습니다. 이제 카메라가 정확하게 비행기를 보고 게임을 진행할 수 있습니다.

 

 

 

 

 

보너스 : 비행기의 프로펠러를 회전시키는 스크립트를 생성할 수 있다고 합니다.

 

보너스? 이건 못참죠.

 

RollingFan 이라는 스크립트를 생성하고 다음과 같이 작성합니다.

 

 

 

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

public class RollingFan : MonoBehaviour
{
    private float speed = 200.0f;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Rotate(Vector3.forward * Time.deltaTime * speed);
    }
}

 

 

그리고 해당 스크립트 컴포넌트를 Player의 자식인 Propeller에 붙이면 잘 작동하는 것을 확인하실 수 있습니다.

 

 


 

 

문제를 푸니 정말 재미있네요! 앞으로 쭉쭉 나아가자구요!