728x90
2D 탑다운 게임을 개발하다보면 점프를 구현해야하는 경우가 종종있습니다. 오늘은 제가 사용하는 간단한 방법에 대해서 소개해 드리겠습니다.
제가 사용하는 방법을 간단하게 설명드리면, 먼저 2D 탑다운 게임에서 높이가 있다는 것을 표현할려면 그림자가 있어야합니다. 그리고 그 그림자를 만들어내는 오브젝트가 있겠죠. 따라서 게임오브젝트의 계층구조를 아래와 같이 만듭니다. Body오브젝트가 그림자를 그려내는 오브젝트가 되겠죠. 스프라이트는 정사각형을 사용했습니다.
이 상태에서 점프를 구현하려면 Body오브젝트만 위아래로 움직여주면 되겠죠. 그리고 Body오브젝트가 충분히 그림자에 가까워 졌다면 점프가 끝난것이라고 가정하면됩니다.
아래와 같은 코드가 되겠죠.
private void Update()
{
if (isGrounded == true)
return;
bodyTrans.transform.position += new Vector3(0.0f, currentJumpPower * Time.deltaTime, 0.0f);
currentJumpPower -= gravityValue * Time.deltaTime;
if (bodyTrans.position.y <= shadowTrans.position.y + groundOffset &&
currentJumpPower <= 0.0f)
{
isGrounded = true;
bodyTrans.position = new Vector2(bodyTrans.position.x, shadowTrans.position.y + groundOffset);
grounded?.Invoke();
}
}
이렇게 하면 Body오브젝트의 위치가 Shadow오브젝트에 충분히 가까워 지면 점프를 멈추게 됩니다. 얼마나 충분히 가까워 지면 멈출것인지는 groundOffset변수로 설정했습니다.
아래는 코드 전문입니다.
namespace FJ
{
public class FakeJumper : MonoBehaviour
{
[SerializeField] private Transform bodyTrans;
[SerializeField] private Transform shadowTrans;
[SerializeField] private bool doJumpOnStart;
[SerializeField] private float gravityValue = 9.8f;
[SerializeField] private float jumpPower = 10.0f;
[SerializeField] private float groundOffset = 0.0f;
[SerializeField] private UnityEvent grounded = new UnityEvent();
private float currentJumpPower;
private bool isGrounded = false;
public UnityEvent Grounded => grounded;
public bool IsGrounded => isGrounded;
public float GravityValue => gravityValue;
private void Start()
{
if (this.doJumpOnStart == true)
{
Jump(jumpPower);
}
}
private void Update()
{
if (isGrounded == true)
return;
bodyTrans.transform.position += new Vector3(0.0f, currentJumpPower * Time.deltaTime, 0.0f);
currentJumpPower -= gravityValue * Time.deltaTime;
if (bodyTrans.position.y <= shadowTrans.position.y + groundOffset &&
currentJumpPower <= 0.0f)
{
isGrounded = true;
bodyTrans.position = new Vector2(bodyTrans.position.x, shadowTrans.position.y + groundOffset);
grounded?.Invoke();
}
}
public void Jump(float jumpPower)
{
this.currentJumpPower = jumpPower;
isGrounded = false;
}
}
}
728x90
반응형
'Unity > Tip' 카테고리의 다른 글
유니티 앵커와 피벗 그리고 위치의 관계에 대하여 (0) | 2023.09.26 |
---|---|
눈누 폰트로 유니티 TextMeshPro Font Asset 만드는 방법 (0) | 2023.09.03 |
[컴포넌트 알아보기] 캔버스 스케일러(Canvas Scalar) (0) | 2023.08.20 |
유니티에서 레이어마스크를 비트연산을 통해 써야하는 이유 (0) | 2023.08.20 |
Sprite와 Texture의 차이 (0) | 2023.06.22 |