using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public Vector2 inputVec;
public float speed;
Rigidbody2D rigid;
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
}
void Update()
{
inputVec.x = Input.GetAxisRaw("Horizontal");
inputVec.y = Input.GetAxisRaw("Vertical");
}
void FixedUpdate()
{
Vector2 nextVec = inputVec.normalized * speed * Time.fixedDeltaTime;
rigid.MovePosition(rigid.position + nextVec);
}
}
public class Player : MonoBehaviour
MonoBehaviour 클래스를 상속받는 Player 클래스를 정의한다.
public Vector2 inputVec; public float speed; Rigidbody2D rigid;
필요한 변수를 정의한다.
Vector2 타입의 inputVec
float(실수) 타입의 speed
Rigidbody2D 타입의 rigid
스크립트를 초기화한다.
게임 오브젝트와 그에 부착된 스크립트가 작동하기 시작할 때 필요한 설정과 준비 작업을 위해 사용된다.
void Awake() { rigid = GetComponent<Rigidbody2D>(); }
해당 오브젝트에 부착된 'Rigidbody2D' 컴포넌트에 대한 참조를 'rigid' 변수에 할당한다.
공통점
모두 초기화 함수이다.
차이점
Awake()는..
1) 스크립트 인스턴스가 처음 로드될 때, 즉 해당 스크립트가 포함된 게임 오브젝트가 생성될 때 정확히 한 번 호출된다.
2) 스크립트나 게임 오브젝트의 활성화 상태와 상관없이 실행된다. 즉, 비활성화된 상태여도 Awake는 호출된다.
3) 주로 자체적인 초기화에 사용된다. 예를 들어, 컴포넌트 참조를 설정하거나, 초기 변수 값을 설정하는 등의 작업이 여기에 해당한다. 다른 오브젝트의 Awake 함수가 실행되었는지, 혹은 실행 순서는 보장되지 않기 때문에 다른 오브젝트의 컴포넌트에 접근하여 초기화하는 데에는 적합하지 않다.
Start()는..
1) 스크립트 인스턴스가 활성화될 때, 정확히 한 번 호출된다. 이는 게임 시작 시 첫 번째 Update 메소드가 호출되기 전이다.
2) 스크립트가 활성화된 상태에서만 호출된다. 즉, 스크립트가 처음부터 비활성화되어 있다면, 활성화될 때까지 Start의 실행이 지연된다.
3) 주로 다른 오브젝트와의 상호작용이 필요한 초기화 작업에 사용된다. 모든 Awake 메소드가 호출된 후에 실행되기 때문에, 다른 오브젝트의 컴포넌트에 접근하거나, 전역 상태를 설정하는 등의 작업을 안전하게 수행할 수 있다.
매 프레임마다 호출되는 함수이다. 게임 오브젝트의 동적인 행동: 사용자 입력 처리, 오브젝트의 움직임, 타이머 업데이트 등을 구현하는 데 주로 사용된다.
void Update() { inputVec.x = Input.GetAxisRaw("Horizontal"); inputVec.y = Input.GetAxisRaw("Vertical"); }
Input.GetAxisRaw("Horizontal")과 Input.GetAxisRaw("Vertical")는 각각 수평 및 수직 입력 축의 값(-1, 0, 1)을 반환한다. 이 값들은 inputVec에 저장되어 플레이어의 움직임 방향을 결정한다.
물리 업데이트가 발생하는 각 프레임마다 호출되는 함수이다. 물리 엔진과 관련된 로직: Rigidbody를 사용한 움직임, 충돌 감지, 힘과 토크의 적용 등을 구현하는 데 주로 사용된다.
void FixedUpdate() { Vector2 nextVec = inputVec.normalized * speed * Time.fixedDeltaTime; rigid.MovePosition(rigid.position + nextVec); }
inputVec 벡터를 *정규화하여 방향만을 유지한 다음, speed와 Time.fixedDeltaTime (마지막 물리 업데이트 이후 경과된 시간)을 곱하여 실제 이동 거리를 계산한다.
rigid.MovePosition 메소드는 Rigidbody의 위치를 안전하게 변경하여 플레이어가 새 위치로 움직이도록 한다.
*해당 벡터의 크기를 1로 만드는 것. 벡터의 방향은 유지되면서 길이만 변경됨.
벡터 계산 과정에서 대각선 이동이 수평, 수직 이동보다 빠르게 될 수 있다. (1:1:√2) 이를 방지하기 위함
공통점
모두 게임 오브젝트의 동적인 동작을 처리하는 데 사용되는 함수이다. 지속적으로 호출된다.
차이점
Update()는..
1) 프레임마다 호출된다. 따라서 게임의 프레임률에 따라 호출 빈도가 달라진다. 이는 게임의 성능과 직접적으로 관련이 있다.
2) 비물리적인 게임 로직 처리: 사용자 입력 처리, 애니메이션 상태 변화, 타이머 업데이트, 간단한 움직임 계산 등에 사용된다.
3) Update에서 시간과 관련된 계산을 할 때는 Time.deltaTime을 사용하여 프레임 간의 시간 차이를 고려한다.
FixedUpdate()는..
1) 고정된 시간 간격마다 호출된다. 일반적으로 물리 업데이트 주기에 맞춰져 있어, 게임의 프레임률과는 독립적이다. 이는 물리 시뮬레이션의 일관성을 유지하는 데 중요하다. (이 간격은 Unity의 Time 설정에서 "Fixed Timestep" 값으로 조정된다.)
2) 물리 기반의 움직임이나 충돌 처리 등, Unity의 물리 엔진과 연관된 작업을 처리하는 데 사용된다. 예를 들어, Rigidbody에 힘을 적용하거나 복잡한 물리 계산을 수행할 때 적합하다.
3) FixedUpdate에서 시간과 관련된 계산을 할 때는 Time.fixedDeltaTime을 사용한다. 이 값은 고정된 간격을 반영한다.
MonoBehaviour 클래스를 상속받는 Player 클래스의 스크립트이다.
이동을 위한 방향키 입력값을 벡터로 받는 inputVec 변수, 이동 속도를 정의하는 speed 변수, Rigidbody2D 컴포넌트를 참조할 수 있는 rigid 변수를 각각 정의한다.
Awake 함수에서는 초기화를 수행한다. Player 오브젝트에 부착된 Rigidbody2D 컴포넌트를 rigid 변수가 참조하도록 한다.
Update 함수에서는 방향키 입력을 제어한다. 방향키 입력값을 가져와 inputVec 변수에 저장한다. x방향과 y방향 각각 나누어 저장한다. 이를 매 프레임 수행한다.
FixedUpdate 함수에서는 플레이어의 이동을 제어한다. 우선 Player가 현재 위치로부터 이동해야 할 벡터값을 계산한다. 이는 inputVec을 정규화한 값에 speed 변수의 값과 다음 FixedUpdate 호출까지의 시간 간격 값을 전부 곱한 것과 같다. 그 다음 rigid(= Player에 부착된 Rigidbody2D 컴포넌트)가 rigid의 현재 위치 + 앞에서 계산된 벡터값의 위치에 놓이도록 한다. 이를 일정한 시간 간격으로 수행한다.
출처 :
링크텍스트