티스토리 뷰
뒤늦게 진격의 거인보다가 푹 빠져서 일주일을 보내버렸다. 몇화 안남은 내용이 아직 너무 궁금하지만, 아껴둔다고 생각하며 유니티를 켰다. 복숭아 던지는게 꽤나 귀여워서 금새 재밌어져 버렸다.
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);
이것만 사용해서 구현하면, 바닥에 닿지 않아도 점프를 할 수 있는 상태가 된다.
Gamelog 11_2. 바닥에 닿으면 점프한다.
발이 지면에 닿았을 때만 점프를 하도록 수정해본다.
이를 위해서는 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)
와 같은 방식으로 구현한다.
그러면 이렇게 중력의 영향을 받으면서, 바닥에 닿았을 때만 점프를 하는 캐릭터를 구현할 수 있다.
Gamelog 11_3. AddForce를 활용해본다.
AddForce를 사용하여 점프를 할 수 있지만, 물체에 적용하면 물체를 던질 수도 있다.
if(leftFlag) {
rbody.AddForce(new Vector2(-throwX, throwY), ForceMode2D.Impulse);
}
else {
rbody.AddForce(new Vector2(throwX, throwY), ForceMode2D.Impulse);
}
이번에는 복숭아를 던지도록 한다. 복숭아는 동그라니까 Circle Collider 2D
를 적용한다. 컴포넌트가 적용된 복숭아로 프리팹을 Hierarchy
창에서 Project
창으로 드래그 앤 드롭하여 프리팹을 만든다.
캐릭터의 방향에 따라 위 방향키를 누르면 프리팹을 던지는 코드를 적용한 뒤, 복숭아 프리팹을 적용한다.
이때 드래그앤드롭을 사용해서 프리팹 등록도 가능하다.
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' 카테고리의 다른 글
Gamelog 13. 점수를 얻었다 (0) | 2023.02.15 |
---|---|
Gamelog 12. 맵이 커졌다 (0) | 2023.02.15 |
Gamelog 10. 중력을 이용해본다 (0) | 2023.02.06 |
Gamelog 09. 뭔가 하는 느낌이다. (0) | 2023.02.05 |
Gamelog 08. 미니 게임 완성했다. (0) | 2023.01.29 |