티스토리 뷰
2020/07/06 - [Game : 좋아하는 것/Unity] - Dodge game - 총알 피하기 게임(1)
(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 검색 > 추가) 움직인다.
'Unity' 카테고리의 다른 글
Dodge Game - 총알 피하기 게임(최종) (0) | 2020.08.02 |
---|---|
Dodge Game - 총알 피하기 게임(4) (0) | 2020.08.01 |
Dodge game - 총알 피하기 게임(3) (0) | 2020.07.09 |
Dodge game - 총알 피하기 게임(1) (0) | 2020.07.06 |