void Update()
{
if (Input.GetKey(KeyCode.W))
transform.position += new Vector3(0.0f, 0.0f, 1.0f);
if (Input.GetKey(KeyCode.S))
transform.position -= new Vector3(0.0f, 0.0f, 1.0f);
if (Input.GetKey(KeyCode.A))
transform.position -= new Vector3(1.0f, 0.0f, 0.0f);
if (Input.GetKey(KeyCode.D))
transform.position += new Vector3(1.0f, 0.0f, 0.0f);
}
플레이어가 비정상적으로 빠르게 움직인다
현재 60프레임이라고 가정 한다면 1/60마다 update되서 움직이기 때문이다.
마지막 프레임과 현재 프레임의 시간간격
new Vector3(0.0f, 0.0f, 1.0f) * Time.deltaTime;
//_speed는 현재 10.0f
new Vector3(1.0f, 0.0f, 0.0f) * Time.deltaTime * _speed;
거리 = 속도 * 시간 = 속력 * 방향 * 시간
속도 = 속력 + 방향
속력 = 방향을 가지지않는 스칼라값
스칼라 = 크기만 있는값
속력 : speed
방향 : Vector3
시간 : deltaTime
public으로 설정하면 Unity Inspector창에서 설정가능
public float _speed = 10.0f;
public GameObject _obj;
[SerializeField]
float _speed = 10.0f;
private 상태에서 public과 동일하게 Unity Inspector창에서 설정가능하다.
글로벌좌표 : 절대좌표
로컬좌표 : 플레이어(물체)를 기준으로 한다
x누르면 Global local 좌표변경
//동일하다
new Vector3(0.0f, 0.0f, 1.0f)
Vector3.forward
원래코드
void Update()
{
if (Input.GetKey(KeyCode.W))
transform.position += new Vector3(0.0f, 0.0f, 1.0f) * Time.deltaTime * _speed;
if (Input.GetKey(KeyCode.S))
transform.position -= new Vector3(0.0f, 0.0f, 1.0f) * Time.deltaTime * _speed;
if (Input.GetKey(KeyCode.A))
transform.position -= new Vector3(1.0f, 0.0f, 0.0f) * Time.deltaTime * _speed;
if (Input.GetKey(KeyCode.D))
transform.position += new Vector3(1.0f, 0.0f, 0.0f) * Time.deltaTime * _speed;
}
코드수정
void Update()
{
if (Input.GetKey(KeyCode.W))
transform.position += Vector3.forward * Time.deltaTime * _speed;
if (Input.GetKey(KeyCode.S))
transform.position += Vector3.back * Time.deltaTime * _speed;
if (Input.GetKey(KeyCode.A))
transform.position += Vector3.left * Time.deltaTime * _speed;
if (Input.GetKey(KeyCode.D))
transform.position += Vector3.right * Time.deltaTime * _speed;
}
로컬에서 월드로 바꿔준다
void Update()
{
// Local -> World
// TransformDirection
//World -> Local
//InverseTransformDirection
if (Input.GetKey(KeyCode.W))
transform.position += transform.TransformDirection(Vector3.forward * Time.deltaTime * _speed);
if (Input.GetKey(KeyCode.S))
transform.position += transform.TransformDirection(Vector3.back * Time.deltaTime * _speed);
if (Input.GetKey(KeyCode.A))
transform.position += transform.TransformDirection(Vector3.left * Time.deltaTime * _speed);
if (Input.GetKey(KeyCode.D))
transform.position += transform.TransformDirection(Vector3.right * Time.deltaTime * _speed);
}
로컬좌표 기준으로 편하게 하기
void Update()
{
if (Input.GetKey(KeyCode.W))
transform.Translate(Vector3.forward * Time.deltaTime * _speed);
if (Input.GetKey(KeyCode.S))
transform.Translate(Vector3.back * Time.deltaTime * _speed);
if (Input.GetKey(KeyCode.A))
transform.Translate(Vector3.left * Time.deltaTime * _speed);
if (Input.GetKey(KeyCode.D))
transform.Translate(Vector3.right * Time.deltaTime * _speed);
}