박민혁의 개발
유니티 2d 점프 시 코드 한줄로 바닥 체크 본문
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("이름"); 이코드는
레이어의 이름이 이름 인 경우에만 활성화 라는게 된다
'TIL' 카테고리의 다른 글
유니티 일정 범위 대상에게 일정 간격으로 상호작용하기 (1) | 2023.11.03 |
---|---|
플레이어주변을돌아가는 투사체 (1) | 2023.11.02 |
내 유니티에서 캐릭터는 점프하면 왜?? 벽에 걸리는가? (1) | 2023.10.31 |
중복 없는 랜덤 뽑기 (1) | 2023.10.30 |
csv 파일 불러오기 (0) | 2023.10.27 |