Open Sprite Editor
분할 이미지의 경우Unity가 알아서 애니메이션화 해주지만 예외의 경우 직접 애니메이션화 해주어야 한다.
Open Sprite Editor를 클릭하여 Unity에게 애니메이션의 첫 번째 프레임과 끝 프레임을 알려줄 수 있고 자르거나 이동도 가능하다.
분할된 이미지들을 모두 선택하여 Scene의 화면에 드래그 앤 드롭하면 끝이다.
그럼 Create New Animation 화면이 나타나게 되는데 저장할 위치를 정한 뒤 Save 한다.
저장 경로는 Assets - Animations로 한다.
Pixels Per Units
Rect Tool을 이용하여 캐릭터의 크기를 조절해도 되지만 우측의Pixels Per Unit을 수정해도 된다.
Rigidbody 2D
Add Component - Rigidbody 2D를 클릭하여 물리 법칙을 적용시킬 수 있다.
Collider
충돌을 감지하는Component이다.
강의에선 Box Collider 2D를 사용하는데 Mesh Collider가 사용 중인 경우 Box Collider 2D를 사용 할 수 없다.
Mesh Collider를 삭제하고 Box Collider 2D를 추가한다.
Player Jump
힘, 중력 등을 적용하기 위해서Rigidbody 2D Component가Script에 접근할 수 있어야 한다.
public class Player : MonoBehaviour
{
[Header("Settings")]
public float jumpForce;
[Header("References")]
public Rigidbody2D playerRigidBody; // add like Flutter
// ...existing code...
이후 Rigidbody 2D를 드래그 앤 드롭하여 Script에 접근하도록 한다.
Input.GetKeyDown
키보드 입력을 감지하는 함수이다.
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
playerRigidBody.linearVelocityX = jumpForce;
playerRigidBody.linearVelocityY = jumpForce;
}
}
x축과 y축의 속도를 정해주는 방식이다.
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
playerRigidBody.AddForceY(jumpForce, ForceMode2D.Impulse);
}
}
마찬가지로 x축과 y축에 Force를 전달해 주는 방식이지만 Kimchi Run 게임에서 x축 이동은 사용하지 않기에 AddForceY 함수를 사용했다.
void Rigidbody2D.AddForceY(float force, [ForceMode2D mode = ForceMode2D.Force])
Adds a force to the Y component of the Rigidbody2D.linearVelocity only leaving the X component of the world space Rigidbody2D.linearVelocity untouched.
첫 번째 인자값으론 jumpForce, 두 번째 인자값으론 ForceMode2D 함수의 Impulse 메소드를 사용했다.
Impulse를 사용하면 그 즉시 플레이어에게 Force가 부여된다고 한다.
ForceMode2D.Force로 해봤더니 점프가 안된다.
Gravity Scale
이름 그대로 중력 크기이다.
기본 값으로 사용했더니 달에 있는 것처럼 천천히 뜨고, 천천히 내려온다.
MonoBehaviour.OnCollisionEnter2D(Collision2D)
하나의 Collider가 다른 Collider와 충돌하는 경우 자동으로 호출되는 함수이다.
현재로서는 점프키를 반복해서 누르면 그 만큼 계속해서 점프가 되기 때문에 하늘까지 날아가버린다.
그래서 위 함수를 사용해서 Player가 Platform에 닿으면 isGrounded 변수를 true로 지정해 무한 점프를 방지한다.
private bool isGrounded = true;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
{
playerRigidBody.AddForceY(jumpForce, ForceMode2D.Impulse);
isGrounded = false;
}
}
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.name == "Platform")
{
isGrounded = true;
}
}