티스토리 뷰

Unity

Dodge game - 총알 피하기 게임(2)

XXIN-dev 2020. 7. 7. 09:00

2020/07/06 - [Game : 좋아하는 것/Unity] - Dodge game - 총알 피하기 게임(1)

 

Dodge game - 총알 피하기 게임(1)

Dodge game를 만들어 보자. 해당 Game은 '레트로의 유니티 게임 프로그래밍 에센스'를 참고해서 만들었다. 01. Scene 구성 > Plane(바닥) 생성 Hierarchy 창에서 Create > 3D object > Plane 선택 Plane의 Transf..

cannabuffer.tistory.com

 

(1)에 이어서 해당 Player를 움직여보자(C# Script 사용)

 

Script 작성

 

Project 창에서 Create > c# script 선택해서 'PlayerCtrl' Script를 생성한다. Script 이름을 후에 변경하려면 Script 안에 설정된 이름도 같이 변경해줘야 한다.(script 상에서 public class PlayerCtrl : MonoBehaviour 이 부분) 

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

public class PlayerCtrl : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

처음 Script를 생성하면 이러한 모양이다.

 

* Start() : Game이 시작되면 가장 먼저 불려지는 부분

* Update() : 매 frame마다 불리는 부분

 

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

public class PlayerCtrl : MonoBehaviour
{
    Rigidbody rigidbody;

    public float speed = 8f;

    Vector3 moveVec;

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

    }

    // Update is called once per frame
    void Update()
    {

    }
}

- Rigidbody Component를 사용하기 위해서 Rigidbody 타입 변수 rigidbody를 선언

- 움직이는 속도는 float 타입의 변수 speed를 사용해서 8로 선언

- Vector3 : x, y, z를 원소로 가지는 타입으로 위치, 속도, 크기, 방향을 나타낼 수 있음

 

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

public class PlayerCtrl : MonoBehaviour
{
    Rigidbody rigidbody;

    public float speed = 8f;

    Vector3 moveVec;

    // Start is called before the first frame update
    void Start()
    {
        rigidbody = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {

    }
}

rigidbody에 GetComponent() 메서드를 사용해서 Rigidbody 타입의 Component를 할당한다. 

 

* GetComponent() : 원하는 타입의 Component를 자신의 게임 Object에서 찾아오는 메서드

 

▶︎ Start() 함수가 실행하는 순간, Player Object에서 Rigidbody 타입의 Component를 찾아서 할당해줌(자동 할당)

 

 

Update() 함수는 매 프레임마다 update 되기에 조작키를 설정하기에 적절!

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

public class PlayerCtrl : MonoBehaviour
{
    Rigidbody rigidbody;

    public float speed = 8f;

    Vector3 moveVec;

    // Start is called before the first frame update
    void Start()
    {
        rigidbody = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        moveVec.x = Input.GetAxis("Horizontal");
        moveVec.z = Input.GetAxis("Vertical");
        moveVec.y = 0f;

        rigidbody.velocity = moveVec * speed;
    }
}

설명했다시피 Vector3는 x, y, z를 원소로 가지기 때문에 해당 타입 변수 moveVec도 동일한 조건을 가진다.

 

* moveVec.x 에는 Input.GetAxis("Horizontal");

* moveVec.z 에는 Input.GetAxis("Vertical");

* moveVec.y는 위쪽으로 이동하는 것이기에 0f를 넣어준다.(이동할 필요 X)

 

# Input.GetAxis(string) : 축의 이름을 받아서 감지된 입력 값을 반환함

- "Horizontal" -> 수평 축에 대응하며 KeyCode.RightArrow(D) , KeyCode.LeftArrow(A)를 누르는 것과 동일한 움직임

- "Vertical" -> 수직 축에 대응하며 KeyCode.UpArrow(W), KeyCode.DownArrow(S)를 누르는 것과 동일한 움직임

 

(Edit > Project Settings > Input > Axes에서 더 자세하게 볼 수 있다)

 

더보기

Q. 왜 Input.GetKey() 말고 Input.GetAxis()를 사용하나요?

A. GetKey()를 사용하는 것보다 코드가 간결하기 때문에! GetKey()는 if문으로 작성돼서 방향키를 매번 if문을 거쳐서 감지해야 하기 때문에! GetKey()는 사용하는 키가 UpArrow에서 W로 바뀌면 코드 자체를 수정해야 하지만 GetAxis를 사용하면 둘 다 호환되기에 수정을 하지 않아도 괜찮다!

 

* Rigidbody의 velocity 변수rigidbody에 속력을 줌

- velocity 변수에는 벡터 값을 할당함, 이는 벡터 값만큼 이동함을 의미한다.

 

▶︎ moveVec에 speed를 곱한 값만큼 Player가 이동하게 된다.

 

Player에 Script를 드래그해서 넣으면(Add Component > PlayerCtrl 검색 > 추가) 움직인다.

 

링크
최근에 올라온 글
최근에 달린 댓글