본문 바로가기

Unity/Unity2D_Shooting

Unity2D_shooting - 스프라이트 및 이동로직

1. 2d 비행기 스프라이트 이미지설정

  - Spirte Mode = Mulitple

  - Pixel Per Unit = 24

  - Filter Mode = Point(no filter)

  - Compression = None

  - 이 후 Sprite Editor에서 가로세로 Pixel = 24, padding = 1씩 주고 이미지를 아틀라스화 함

 

 

2.이동로직 스크립트

 

3.플레이어 콜라이더 및 테두리 콜라이더

 - 플레이어에 collider2D 추가 및 empty오브젝트들을 만들어 collider2D속성으로 테두리 생성

  *tip)어떤 오브젝트가 가진 속성들을 아래와 같이 Copy Component로 복사하여 다른 오브젝트에 붙여넣기가 가능 

 

4.충돌

 - 이제 콜라이더를 가진 각 오브젝트들에게 rigidbody속성을 추가하여 물리충돌을 구현시킨다

 - 고정된 테두리 오브젝트는 rigidbody의 body type을 static으로 하고

 - 코드로서 이동을 구현하는 플레이어 오브젝트는 body type을 kenematic으로 한다

 

*body type관련 설명 - 블로거출처[개발자키우기] : superwony.tistory.com/64

body type 

dynamic : 디폴트 타입으로 다른 body type과 모두 충돌하고 중력과 힘의 영향을 받습니다.

위치나 회전값을 동적(코드)으로 변경하는 오브젝트에 사용하기엔 비효율 적입니다. ( 시스템 리소스 문제 ) 

  • mass : 오브젝트의 질량을 설정합니다.
  • linear drag : 해당 값이 클수록 물체의 이동에 영향을 줍니다. 다른 오브젝트와 접촉이 없어도 스스로 움직임을 멈춥니다.
  • angular drag : 해당 값이 클수록 물체의 회전에 영향을 줍니다. 다른 오브젝트와 접촉이 없어도 스스로 회전을 멈춥니다.
  • collision detection : discrete, continuous 중 continuous 로 설정한 경우 충돌된 물체끼리 서로를 통과하지 않지만 더 많은 cpu 시간을 사용해 꼭 필요한 오브젝트에만 설정해야합니다.

 

kinematic: 동적(코드)으로 제어하는 오브젝트에 적합한 타입입니다. 중력과 힘의 영향을 받지않기 때문에 동적(코드)으로 제어 했을때 정확하게 반영됩니다. dynamic 타입을 갖는 오브젝트와 충돌하고 그외 나머지 kinematic 과 static 타입과는 충돌하지 않습니다.

  • kinematic 타입이 다른 kinematic타입이나 static타입과 충돌하게 하려면 직접 Oncollider()함수 및 Ontrigger()함수로 코드 구현을 통해 구현해야 합니다

 

static : 움직이지 않는 오브젝트에 적합한 타입입니다.

 

이 세가지 타입을 오브젝트 성질에 맞게 설정해야 리소스를 덜 잡아먹어 최적화에 도움이 됩니다.

 

예를 들어 게임에서 움직이지 않고 정적인 블럭은 static 타입으로 설정하고, 움직이는 플레이어의 경우 dynamic이나 kinematic으로 설정하는게 좋습니다. 

 

5.충돌시 떨림 해결

  - 플레이어의 rigid body type을 dymamic으로 하고 static 상태의 테두리와 충돌을 하면 떨림현상이 발생한다

   *tranform이동 + 물리충돌 = 떨림발생

  - 따라서 떨림을 해결하기 위해

    (1). 플레이어 rigid body type을 kinematic 으로 하고

    (2). 플레이어 스크립트에 플레이어가 border콜라이더에 충돌시에 멈추게하여 테두리 밖으로 나가지 못하게 하는

          코드를 추가 작성한다

 

*ontriggerEnter()는 다른 콜라이더와 겸칩이 있는 상태에서 어떤 것을 한다는 나의  상태를 나타 낼뿐이지

이 것 자체를 조건으로 쓸 수 가 없다

따라서 조건으로써 가치가 있는 비교연산자를 사용할 수 있게 플래그변수를 사용함으로써 

겹침 상태를 true와 false로 나타낼 수 있도록 하고 조건이나 결과로 쓰게 하는 것이다
********************************************************************************************************************

    //            내 상태, 조건                       ---->         그 상태로 인한 비교연산자가 사용가능한 코드변화 

    //1-나는 지금 위쪽 화살표를 누르고 있다 ---->                    v = 1   

    //1-나는 TOP오브젝트와 겹침이 시작됬다  ---->            isTopTrigger = true

    //2-나는 TOP오브젝트와 겸침이 끝났다    ---->            isTopTrigger = false;

 

    //원하는 상태, 결과

    //1-나는 위로 이동하지 않는다           ---->                   v = 0

    //2-나는 위로 이동한다                    ---->                   v = 1

 

 

 

 

-같은방식으로 4방향 모두 Border바깥으로 나가지 못하게 코딩