박민혁의 개발

유니티 2d 점프 시 코드 한줄로 바닥 체크 본문

TIL

유니티 2d 점프 시 코드 한줄로 바닥 체크

박민혁_kog 2023. 11. 1. 21:01

2d 한줄 바닥 체크 나도 나중에 이거 써야지 ㅎㅎ
원리 캐릭터의 포지션 + 키 절반(피벗기준 출발해서 절반)= 발바닥에 원을만들어서 바닥에 닿아있는가 체크

isGround =  Physics2D.Overlapcircle((Vector2)transfrom.position + new vector2(0, -0.5f), 0.07f , 1 << LayerMask.NameTolayer("Ground"));
  불값         만든다.동그라미   위치값= 현재위치값 y-0.5f=내 본체중앙에서 땅까지 좌표값    0.07f = 만드는원 반지름 (크기너무크면안댐)

너무 크게 할시 점프를 빠르게 2번 눌러 점프를 공중에서 한번더 해서 2번 점프하는 경우가 생기기 때문 

 

위 문제가 발생했을때 난 모바일 을 대상으로 만들고 있었기에 조이스틱&버튼과 컴퓨터 에서 테스트를 위해 키보드 입력값 2가지 방식으로 점프&이동을 할 수 있었는데

같은 함수를 실행 시켰을때 키보드로는 점프를 2배로 하고 버튼으로는 일반점프를 해서 같은 코드를 실행시켰을텐데 어째서 ? 이런 의문을 겪었다.

 

ps . addforce로 점프를 했었는데 이경우 점프할때 벨로시티값을 제로로 해주는게 좋은경우가 있다고 한다 

이유는 달리면서 점프시 이동값에 영향을 받아 더 높게 점프를 할수 있기 때문 

달리면서 점프 할때 더 멀리 더 높게 점프를 해야한다면 제로로 만들지 않는게 더 좋을듯 하다 

== 당장은 슈퍼마리오가 생각난다 달리면서 점프 등 여러 기술이 있지않은가?

void Jump()
{
리지드바디이름.velocity= Vecto2.zero;
리지드바디이름.AddForce(vector2.up*700);
}

 

 

 

 

수정 @@

1 << LayerMask.NameTolayer("Ground"));는 이해를 못했었는데 찾아서 아래에 추가함

 

int layerMask = 1 << 9    // 9번 레이어만 감지
int layerMask = (-1) << 9    // 9번 레이어만 무시
int layerMask = 1 << LayerMask.NameToLayer("이름"); 
                                         레이어마스크에서 이름이 "이름" 인것만 감지

<< 의미는 비트연산으로 좌측으로 쉬프트 이동 
즉 1 << 9 는 1을 좌측으로 9번 쉬프트 해 라는 의미로 
1을 16비트 2진수로 표현하면  0000 0000 0000 0001 이 된다 

(32비트로 설명하는게 맞는데 그러면 0이 더생겨서 낭비인듯함)
0000 0000 0000 0001 이  좌측으로 9번 쉬프트시 
0000 0010 0000 0000 이 된다

유니티에선 레이어가 켜져있는지 꺼져있는지 구별을 꺼져있을시 0 켜져있을시 1로 판단한다 
2진수 에서 각각 위치 하나 하나가 레이어 플래그를 뜻한다 
즉 위에0000 0010 0000 0000 는 9번째 위치의 레이어만 켜져있고 나머지는 0이라는뜻 

int layerMask = 1 << LayerMask.NameToLayer("이름");  이코드는 
레이어의 이름이 이름 인 경우에만 활성화 라는게 된다