유니티 공부 #7

김유원·2021년 5월 30일
0

유니티_공부

목록 보기
7/7
post-thumbnail

'레트로의 유니티 게임 프로그래밍 에센스' 3부

6장 - 1 : 탄막 슈팅 게임 : 닷지

이번주에는 지난 번에 작성한 플레이어 스크립트인 PlayerController를 개선하여 좀 더 나은 조작감을 구현하도록 하였다.

먼저 기존의 PlayerController 스크립트는 다음과 같다.

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

public class PlayerController : MonoBehaviour
{
    public Rigidbody playerRigidbody; //이동에 사용할 리저드바디 컴포넌트
    public float speed = 8f; //이동 속력

    void Start()
    {
        
    }

    void Update()
    {
        if(Input.GetKey(KeyCode.UpArrow) == true) //위쪽 방향키 입력이 감지된 경우 z방향 힘 주기
        {
            playerRigidbody.AddForce(0f, 0f, speed);
        }
        if (Input.GetKey(KeyCode.DownArrow) == true) //위쪽 방향키 입력이 감지된 경우 -z방향 힘 주기
        {
            playerRigidbody.AddForce(0f, 0f, -speed);
        }
        if (Input.GetKey(KeyCode.RightArrow) == true) //위쪽 방향키 입력이 감지된 경우 x방향 힘 주기
        {
            playerRigidbody.AddForce(speed, 0f, 0f);
        }
        if (Input.GetKey(KeyCode.LeftArrow) == true) //위쪽 방향키 입력이 감지된 경우 -x방향 힘 주기
        {
            playerRigidbody.AddForce(-speed, 0f, 0f);
        }
    }
    
    public void Die() //게임 오브젝트 비활성화
    {
        gameObject.SetActive(false);
    }
}

이러한 스크립트로도 충분히 이용할 수 있으나, 몇가지 문제점이 있다.

1. 조작이 게임에 즉시 반영되지 않는다.
- 1차 시연 영상에서 확인할 수 있는 문제인데. 기존의 AddForce() 메서드는 힘을 추가하기에 속도가 충분히 빨라질 때까지 시간이 걸리고, 이동 중 반대 방향으로 이동하려는 경우 관상에 의해 힘이 상쇄되어 방향 전환이 바로 이루어지지 않음. 이는 조작감의 불편으로 여겨질 수 있는 문제기에 수정해야함.
2. 입력 감지 코드가 복잡하다.
- 방향키를 감지하는 데 if문이 네 개나 사용하여 비효율적임.
3. playerRigidbody 컴포넌트를 드래그&드롭 할당하는 것이 불편하다.
- 변수에 컴포넌트를 직접 드래그&드롭하는 방식은 불편하며, 잘못된 값을 할당할 위험이 있기에 보다 직접적인 코드를 실행하고자 함.

이러한 문제점들을 개선하고자, 스크립트를 조금 수정하였다.

첫번째로, 3번 문제인 playerRigidbody 컴포넌트 할당 문제를 해결하였다.

    private Rigidbody playerRigidbody; //이동에 사용할 리저드바디 컴포넌트
    public float speed = 8f; //이동 속력

    void Start()
    {
        //게임 오브젝트에서 Rigidbody 컴포넌트를 찾아 playerRigidbody에 할당
        playerRigidbody = GetComponent<Rigidbody>();
    }

변수 playerRigidBody의 접근 한정자를 public에서 private로 변경하였고, 사용하지 않던 Start() 메서드 부분을 수정하여 변수 playerRigidbody에 리지드바디 컴포넌트의 참조를 할당하도록 하였다.


두번째로는 기존의 Update() 메서드를 수정하여 좀 더 나은 조작감을 만들고자 하였다. ```C# void Update() { //수평축과 수직축의 입력값을 감지하여 저장 float xInput = Input.GetAxis("Horizontal"); float zInput = Input.GetAxis("Vertical");
    //실제 이동 속도를 입력값과 이동 속력을 사용해 결정
    float xSpeed = xInput * speed;
    float zSpeed = zInput * speed;

    //Vector3 속도를 (xSpeed, 0 , zSpeed)로 생성
    Vector3 newVelocity = new Vector3(xSpeed, 0f, zSpeed);
    //리지드바디의 속도에 newVelocity 할당
    playerRigidbody.velocity = newVelocity;
}

여기서 Input.GetAxis() 메서드가 등장하는데, 이는 어떤 **축에 대한 입력값을 숫자로 변환하는 메서드**이다.

>✍ **Horizontal 축**의 경우
	- 음의 방향 : ←(왼쪽 방향키), A 키에 대응되어 -1.0이 출력됨.
    - 양의 방향 : →(오른쪽 방향키), D 키에 대응되어 +1.0이 출력됨.
    - 아무것도 누르지 않을 때는 0이 출력됨.
    
>✍ **Vertical 축**의 경우
	- 음의 방향 : ↓(아래쪽 방향키), S 키에 대응되어 -1.0이 출력됨.
    - 양의 방향 : ↑(위쪽 방향키), W 키에 대응되어 +1,0이 출력됨.
    - 아무것도 누르지 않을 때는 0이 출력됨.
    
이를 입력받아 각각을 speed와 곱하여 X 방향 이동 속도, Z 방향 이동 속도를 표현하여 조작감을 개선하였다.

이러한 점을 개선하여 2차 스크립트를 완성하였다.

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private Rigidbody playerRigidbody; //이동에 사용할 리저드바디 컴포넌트
    public float speed = 8f; //이동 속력

    void Start()
    {
        //게임 오브젝트에서 Rigidbody 컴포넌트를 찾아 playerRigidbody에 할당
        playerRigidbody = GetComponent<Rigidbody>();
    }

    void Update()
    {
        //수평축과 수직축의 입력값을 감지하여 저장
        float xInput = Input.GetAxis("Horizontal");
        float zInput = Input.GetAxis("Vertical");

        //실제 이동 속도를 입력값과 이동 속력을 사용해 결정
        float xSpeed = xInput * speed;
        float zSpeed = zInput * speed;

        //Vector3 속도를 (xSpeed, 0 , zSpeed)로 생성
        Vector3 newVelocity = new Vector3(xSpeed, 0f, zSpeed);
        //리지드바디의 속도에 newVelocity 할당
        playerRigidbody.velocity = newVelocity;
    }
    
    public void Die() //게임 오브젝트 비활성화
    {
        gameObject.SetActive(false);
    }
}

이와 같은 코드를 실행하였을 때의 시연 영상이다.

#2차 조작 확인

지난 1차 시연 영상과 비교하면, 갑작스럽게 가속도가 붙는 모습이 줄었으며 방향 조작이 좀 더 즉각적으로 이루어지고 있다는 것을 확인할 수 있다.

일단 이번 주에는 조작감 개선 방법을 알아내어 수정하였고, 다음 주 부터는 게임 오브젝트를 추가하는 등의 작업을 하여 게임을 완성해 나갈 것이다.

profile
개발 공부 블로그

0개의 댓글

관련 채용 정보