[오늘 한 일]
캐릭터 2단점프 구현
맵 배치 이어서
저런 꼭지점에서 점프를 하다보면 점프가 중첩되서 엄청 높이 점프된다. 아무래도 옆면에서의 충돌과 위에서의 충돌이 중첩되서 생긴걸로 추측됨. 따라서 점프 사용이 리셋 되기전에 rigidbady2D의 velocity.y를 0으로 바꿔 주었다.
if (collision.gameObject.CompareTag("JumpGround"))
{
f(JumpOn) return;
var velocity = rigidbody.velocity;
velocity.y = 0;
rigidbody.velocity = velocity;
JumpOn = true;
Secondjump = false;
}
중첩되는 점프가 눈에 띄게 줄었으나 아직도 오류가 남아있었음.
ContactPoint2D GetContact(int index)
ContactPoint2D GetContact(int index) 메서드는 Collision2D 클래스에 포함된 메서드로, 지정된 인덱스에 해당하는 충돌 지점(ContactPoint2D)을 반환한다.
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("JumpGround"))
{
// 충돌 지점이 하나 이상 있는 경우
if (collision.contacts.Length > 0)
{
ContactPoint2D contact = collision.contacts[0];
// 충돌의 법선을 확인하여 충돌 방향 결정
if (contact.normal.y > 0.9f && Mathf.Abs(contact.normal.x) < 0.1f)
{
if (JumpOn) return;
var velocity = rigidbody.velocity;
velocity.y = 0;
rigidbody.velocity = velocity;
JumpOn = true;
Secondjump = false;
}
}
}
}
참고로 Mathf.Abs는 절대값을 가져오는 메소드이다.
if (contact.normal.y > 0.9f && Mathf.Abs(contact.normal.x) < 0.1f
이 경우 contact.normal.y 값이 양수이면서 contact.normal.x 값이 거의 0에 가까운 경우를 확인하는데 이것을 위에서 충돌한걸로 인지할 수 있다.
캐릭터가 바닥 타일안에 갇히는 현상이 일어났다.
처음에는 캐릭터의 점프의 빠르기를 조정하기 위해서 GravityScail을 10f로 설정해 놨는데 스케일이 너무 높아서 충돌체를 뚫는거라고 추측했다. 그래서 velocity의 값에 한계를 설정해줬다.
var velocity = rigidbody.velocity;
if(velocity.y < limitVelocityY)
{
velocity.y = limitVelocityY;
}
그러나 조금도 해결되지 않았다.
튜터님이 말씀하시길 콜라이더는 원래 내부에도 채워져 있기 때문에 조금 뚫는데도 갇힐수는 없다고 한다. 그래서 왜 겉에만 충돌체가 있는지 확인하기위해 컴포넌트에서 composite Collider2D 를 확인했다.
Geometry Type 이 Outlines 여서 문제였던 거였다. Polygons로 해주면 콜라이더가 내부에도 채워진다.
[주말 할 일]
맵 다 배치하기
캐릭터 애니메이션
[공부 할 거]
ContactPoint2D contact 를 사용하지 않아도, Platform Effecter2D로 일방향 충돌 설정 해줄 수 있을거 같음. 따로 공부