티스토리 뷰

반응형

Gamelog 11. 중력으로 던진다

뒤늦게 진격의 거인보다가 푹 빠져서 일주일을 보내버렸다. 몇화 안남은 내용이 아직 너무 궁금하지만, 아껴둔다고 생각하며 유니티를 켰다. 복숭아 던지는게 꽤나 귀여워서 금새 재밌어져 버렸다.

 

Gamelog 11. 중력으로 던진다

저번에 이어서 하는 것은 중력. 생각보다 잘 안되는데, 차근차근 해본다.

 

Gamelog 11_1. 무제한으로 점프한다.

 rbody.velocity = new Vector2(vx,vy);

GravityScale을 0으로 설정했더라도, 위 코드 사용시 x방향과 y방향을 강제적으로 지정하고 있기 때문에, 낙하하지 않는다.

rbody.velocity = new Vector2(vx, rbody.velocity.y);

위 코드로 변경하게 되면, 중력을 받으면서 이동할 수 있게 된다.

여기서 점프를 하려면, RigidBody에 AddForce()라는 함수를 사용한다.

rbody.AddForce(new Vector2(0,jumppower), ForceMode2D.Impulse);

이것만 사용해서 구현하면, 바닥에 닿지 않아도 점프를 할 수 있는 상태가 된다.

Unity Jump

 

Gamelog 11_2. 바닥에 닿으면 점프한다.

발이 지면에 닿았을 때만 점프를 하도록 수정해본다.
이를 위해서는 Box Collider 2D발 부분 충돌판정용으로 추가 적용해줘야 한다.

Box Collider 2D

`Box Collider 2D'를 하나 더 생성하여 발부분에 아래로 나오도록 판정용을 만든다.

Box Collider 2D

그리고 Is Trigger를 체크해준다. 그러면 닿으면 튕기거나 부딪히는 것이 아닌 조사의 용도로 변경되게 된다.
만약에 Box Collider 2D가 판정용으로 적용된 건지 헷갈릴 때는, 체크박스를 껐다켜보면 확인할 수 있다.

 

Is Trigger 활용

// 무언가에 닿았을 때
void OnTriggerStay2D(Collider2D collision) {
    groundFlag = true;
}

// 무언가에 닿지 않을 때
void OnTriggerExit2D(Collider2D collision) {
    groundFlag = flase;
}

위 두가지 함수를 사용하여 '무언가에 닿았을 때'와 '무언가에 닿지 않았을 때'에 할 행동을 정의할 수 있다.

이를 활용하여 if(Input.GetKey("space") && groundFlag)와 같은 방식으로 구현한다.

Unity gravity jump

그러면 이렇게 중력의 영향을 받으면서, 바닥에 닿았을 때만 점프를 하는 캐릭터를 구현할 수 있다.

 

Gamelog 11_3. AddForce를 활용해본다.

AddForce를 사용하여 점프를 할 수 있지만, 물체에 적용하면 물체를 던질 수도 있다.

if(leftFlag) {
    rbody.AddForce(new Vector2(-throwX, throwY), ForceMode2D.Impulse);
}
else {
    rbody.AddForce(new Vector2(throwX, throwY), ForceMode2D.Impulse);
}

Unity Circle Collider 2D

이번에는 복숭아를 던지도록 한다. 복숭아는 동그라니까 Circle Collider 2D를 적용한다. 컴포넌트가 적용된 복숭아로 프리팹을 Hierarchy창에서 Project창으로 드래그 앤 드롭하여 프리팹을 만든다.

Unity AddForce

캐릭터의 방향에 따라 위 방향키를 누르면 프리팹을 던지는 코드를 적용한 뒤, 복숭아 프리팹을 적용한다.
이때 드래그앤드롭을 사용해서 프리팹 등록도 가능하다.

더보기
if (Input.GetKey("up")) { 
    if (pushFlag == false) { 
        pushFlag = true;
        Vector3 area = this.GetComponent<SpriteRenderer>().bounds.size;
        Vector3 newPos = this.transform.position;
        newPos.y += offsetY;
        // 프리팹을 만든다
        GameObject newGameObject = Instantiate(newPrefab) as GameObject;
        newPos.z = -5; // 앞에 표시한다
        newGameObject.transform.position = newPos;

        Rigidbody2D rbody = newGameObject.GetComponent<Rigidbody2D>();
        if (leftFlag) { 
            rbody.AddForce(new Vector2(-throwX, throwY), ForceMode2D.Impulse);
        }
        else { 
            rbody.AddForce(new Vector2(throwX, throwY), ForceMode2D.Impulse);
        }
    }
}

Unity AddForce

그러면 위 키를 누르면 복숭아를 던지고 스페이스를 누르면 점프를 하는 캐릭터가 완성된다.
복숭아 던지는게 꽤나 귀여워서 재밌었다ㅎㅎ

 

반응형
댓글