3. 탱크 이동 처리 및 포탑 회전

MOON·2022년 7월 9일
0
post-thumbnail

탱크의 이동 : 전 후진

우선 Tank.cs 스크립트를 만들어 탱크와 관련되 내용을 작성할 예정이다.

public class Tank : MonoBehaviour
{ 
	public int moveSpeed;
    public float move;
    public float moveVertical;
    
    void Start()
    {
		moveSpeed = 5;
    }

스크립트를 열면 기본적으로 아래와 같은 구성으로 되어있다.

지금은 moveSpeed 변수로 초기 속도를 저장, move는 나중에 사용할 속도, moveVertical을 통해 Vertical의 값을 가지고 오려고 한다.

여기서 Vertical은 Edit - Project Settings - Input Manager에 들어가면 Vertical을 확인이 가능하다.

Vertical을 클릭하면 Negative Button, Positive Button으로 입력 버튼을 누르면 값을 이용할수 있게 된다.

Start() 함수에서 moveSpeed를 5로 저장합니다.

	void Update()
	{
		move = moveSpeed * Time.deltaTime;
        moveVertical = Input.GetAxis("Vertical");
        this.transform.Translate(Vector3.forward * move * moveVertical);
     }
}

Update() 함수 작성 - 프레임마다 호출되는 함수
이동할 거리 = 속도 * 시간
축의 값을 가져옴
이동 행렬에 셋팅

Input.GetAxis() 는 지정한 키를 누르고 있으면
지속적인 감지가 이루어짐-1.0 ~ 1.0 사이의 값, 키를 누르고 있지 않으면 “0” 값

Time.deltaTime : 현재 프레임과 직전 프레임 사이의 시간
이동 거리 = 방향(단위벡터 키보드 값 (-1.0 ~ 1.0)) 속도 * 시간
this : 이 스크립트를 포함하고 있는 객체(게임오브젝트)

탱크 좌 우 이동

public class Tank : MonoBehaviour
{
	public int moveSpeed;
    public float move;
    public float moveVertical;
    
    public int rotSpeed;
    public float rotate;
    public float rotHorizon;
    
    void Start()
    {
    	moveSpeed = 5;
        rotSpeed = 120;
    }

이번에는 회전을 위해 초기값으로 사용할 변수와 나중에 사용할 회전각, Horizontal을 사용할 변수를 선언하였다. rotSpeed는 120으로 초기화 하였다.

	void Update(){
    	move = moveSpeed * Time.deltaTime;
        rotate = rotSpeed * Time.deltaTime;
        
        moveVertical = Input.GetAxis("Vertical"); // 전후진 값
        rotHorizon = Input.GetAxis("Horizontal") // 회전 값
        
        transform.Translate(Vector3.forward * move * moveVertical);
        transform.Rotate(new Vector3(0.0f, rotate* rotHorizon, 0.0f));
     }
}

이동은 Translate 함수를 이용하여 forward(앞)방향을 통해 이동하게 된다.
회전은 Rotate 함수를 이용하여 new 새로운 벡터를 선언 동시에 y값을 제외한 나머지는 0으로 만들며 키보드를 누름에 따라 값에 따라 회전이 적용된다.

포탑(터렛) 좌우 회전

우선 키 입력에 따라 조작이 가능하게 키를 등록해야 한다.
Edit - Project Settings - Input Manager를 통해 들어가 상단에 size를 늘려서 원하는 키를 등록이 가능하다.

회전시킬 터렛을 할당시키기 위해 GameObject로 변수를 하나 선언합니다.
등록했던 키를 GetAxis함수로 가져와 rotTurret에 저장합니다.

Update함수에서 해야 회전시킬때마다 값을 구합니다.
Rotate함수를 통해 회전하며 Vector3.up = new Vector3(0,1,0)과 동일하다. y축을 기준으로 좌우로 회전하게 된다.

public으로 선언하여 접근이 가능해졌다.
만들어놓은 터렛 오브젝트르 드래그 앤 드롭하면 된다.

포(GunBarrel) 위/아래 회전

포 회전의 기준점을 주기 위해 빈 오브젝트를 만든다.
빈 게임 오브젝트 생성 : GunBase (Position (0, 0, 0))
생성한 빈 오브젝트를 포탑(Turret)의 앞부분에 위치한다.

Turret의 하위 그룹으로 위치 시킨다.
Turret > GunBase > GunBarrel

Input.GetAxis함수를 통해 ("Mouse ScrollWheel")키 값을 가져온뒤 Rotate함수를 통해 회전시킨다.
Vector3.right를 x축으로 회전이 가능하다.
eulers는 오일러 각도로 우리가 친숙한좌표로 회전시킨다는 이야기다. 사용할때는 쿼터니언으로 변환한다고 한다.

터렛 할당과 같은 방식으로 GunBase를 GameObject변수에 할당한다. 드래그 앤 드롭으로 할당하면 된다.



위 방식으로 통하여 포신이 360도 회전하는 것을 방지한다.
eulerAngles : 회전(x축 회전, y축 회전, z축 회전) 값으로 정의 -> 일반적인 회전 표현
Mathf : 다양한 수학 계산을 빠르게 계산하기 위한 클래스. 다양한 함수를 제공. 모두 float로 계산
Mathf.Clamp(float num, float min, float max) : num값을 min, max에 맞추어 재조정 함
min보다 작으면 min값을, max 값보다 크면 max 값을 반환



이것으로 기본적인 이동처리 완료

profile
나만의 공간

0개의 댓글