B45-플레이어 물리문제 고치기

phoenixKim·2021년 3월 10일
0

//출처는 골드메탈님 강의입니다!

//알게 된점 : 아이템 오브젝트들의 freeze position을 처음부터 체크해주면
중력이 적용되지 않는다.

To do List

  • 외부충돌에 의해 플레이어가 회전하는 모습이 발견된다.
    오늘은 이 문제를 고쳐보자.
  • 뿅망치, 총 vs 플레이어 충돌을 방지하자 but 획득은 가능해야 한다.
  • 탄피 vs 플레이어 물리 처리 아예 없애자.
  • 벽 충돌 방지 : ray를 이용하자.

자동회전 방지

  • FreezeRotation함수를 만든다.
    물리 회전속도를 0으로 만들어서 스스로 도는 현상을 제거하자.
    => 리지드바디 설정으로도 회전방지한 것이 아닐까란 생각을 한다.
    -> 실험을 해보자.
    충돌 후 회전되면서 넘어진 모습이다.

코드 적용 및 재실행해서 실험해보자.

- 적용했는데도 넘어진다... 위의 프리즈 로테이션까지 설정을 해야 하는듯하다.

	void FreezeRotation()
    {
        //물리 회전속도를 0으로 만들어서 스스로 도는 현상을 제거함.
        rigid.angularVelocity = Vector3.zero;
    }

    //0311 추가함.
    void FixedUpdate()
    {
		FreezeRotation();
    }

충돌 레이어 설정

: 플레이어와 탄피 등 충돌시 플레이어가 회전을 하게 된다.
탄피와 플레이어가 충돌하지 않도록 물리레이어를 설정하자!

  • 충돌 설정할 레이어들을 추가하자.

  • 위에서 설정한 4개의 프리팹들에다가 layer 설정을 하자
    플레이어는 플레이어 / 바닥은 바닥 / 탄피는 탄피 / 총알은 총알

  • 그 다음에 프로젝트 셋팅에서 physics에 가자~
    Layer Collision Matrix : 레이어들의 상호간 충돌을 설정한다.

    위에서 내가 직접적으로 설정한 값들의 충돌 여부에 대한 설정을 한다.
    그러니까 "BulletCase"/ "탄피"의 경우에는 "바닥"과 "탄피" 와의 충돌을
    하고 나머지는 충돌처리를 안하겠다는 의미이다.


    => 다시 실행해서 총을 쏜 다음에 탄피 위를 지나가면 이전과는 다르게 충돌처리가 되지 않는것을 확인할 수 있다!

  • 가지고 놀다가 알게 된점. 레이어 설정을 총에다가 한 다음에 플레이어와의
    충돌 안되게 하려고 했다. 그런데 이렇게 하게 되면 총획득조차 안된다.
    트리거 동작자체가 물리동작이므로 레이어 설정에 영향을 받는듯하다.
    해다 이슈는 다르게 해결해야 하는 듯하다.

벽 충돌 방지

  • 현재 플레이어가 벽으로 돌진하면 가아끔씩 벽을 관통을 하게되는 문제가 있다.

  • Debug.DrawRay함수를 사용하자...코드 추가하고, 실행해서 확인해보자..
    //세번째 매개변수의 디폴트는 흰색이다.

  • 요렇게 나온다! 이 레이를 이용해보자.

  • Physics.Raycast함수를 사용하자.

  • 만약에 move함수의 요기다가 사용을 하게 된다면... 문제가 발생한다.
    벽에 충돌한 후로는 캐릭터 회전이 안된다는 문제가 생긴다.

  • 그럼 어디다가??? 여기다가 추가해서 회전은 회전대로 되고, 이동은 막고!

  • 벽 Layer를 추가하고 실행해보면 벽 앞에서 앞으로 안나아가진다.

아이템 충돌 제거

=> 플레이어와의 충돌시마다 갱신되는 것이 아니라, 중력 처리 후 물리적인 효과는
필요 없기 때문에 floor와의 충돌시 물리 효과 없애는 방식으로 진행하자!

  • 플레이어가 아이템을 획득하지 않고 충돌하게 되면 플레이어는 회전하게 되고,
    아이템을 넘어진다!

  • 코드를 추가하고

  • 물리를 담당하는 collider 컴포넌트를 isTrigger가 체크된 collider보다 위에 있어야 한다.

  • MoveUp을 눌러서 위에다 위치시키자. 이 때는 Open Prefab모드에서 진행하자.

  • 변수 2개를 사용하는 이유??
    iskinematic은 물리를 사용하지 않는다는 것이고,(true로 해야한다.)
    collision은 충돌구를 사용하지 않는다는 것이다.
    collision.enabled를 false로 하지 않으면 충돌되는 상대방은 물리처리가 진행되므로, 이것도 처리해야한다.
    => 바닥에 충돌하면 중력에 의한 효과는 완료했으므로 아이템의 물리는 이제 필요없다.

profile
🔥🔥🔥

0개의 댓글

관련 채용 정보