LambFerret's Blog

#4 <스크립트 만들기 - 2 사다리> 본문

게임 개발/#1 너구리 (2D 플랫포머)

#4 <스크립트 만들기 - 2 사다리>

램페럿 2021. 7. 18. 14:54

들어가기앞서 나는 왜 구글에 코드를 검색하면 보통 티스토리가 많이 나오나 했다. 코드를 쓸 수 있는 기능이 따로 있는거였다니.. 앞으로는 UI를 눈여겨보고 다니겠습니다... 

print('Hello World!')

이제 공유하기 더 쉬워지겠네요

 


만들어야 하는 상호작용

  1. 이동
  2. 점프
  3. 사다리
  4. 피격 -> 패배
  5. 점수 -> 승리
  6. 적 이동

 사다리는 역시 2D 플랫포머라면 빠질 수 없는, Y축 이동에 대한 합리적인 장치라고 생각한다. 

 

이건 사다리가 아니라 접사다리다.

하지만 컴퓨터는 사다리의 개념을 잘 모르기에 이를 잘 가르쳐줘야하는데 아이디어는 이렇다. 

 

1. 사다리에 너굴맨이 접촉한다. 

2. 접촉상태에서 위아래 버튼을 누르면 Y축 이동을 한다. 

3. Y축 이동상태에서는 중력과 충돌을 무시한다. 

4. 접촉이 끝나면 다시 중력과 충돌을 가진다. 

 

순차적으로 코드를 짜보고 난 후에 아쉬운점을 찾아보기로하자. 우선..

 

1번 : 사다리에 너굴맨이 접촉한다. 

너굴맨의 태그와 레이어는 편의상 플레이어로 지정해놓는다. 

오른쪽의 플러스 버튼을 눌러 inLadder의 태그를 만들겠다. 이는 너굴맨이 사다리에 있는 상태라고 알려주는 것이다. 

 

레이어는 서로간의 충돌이나 무시의 관계가 있을때 하나씩 만들었다. 여기서 7번 레이어인 ladder를 만들어준다. 

 void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.layer == 7)
        {
            this.gameObject.tag = "inLadder";
        }

OnTriggerEnter2D에 7번레이어인 사다리가 닿았을 경우 너굴맨의 태그를 inLadder로 바꾼다. 

 

2번 : 접촉상태에서 위아래 버튼을 누르면 Y축 이동을 한다. 

3번 : Y축 이동상태에서는 중력과 충돌을 무시한다. 

 void Ladder(float k)
    {
        if (this.tag == "inLadder")
        {
            isAir = false;
            neogulMan.layer = 4;
            rb.gravityScale = 0;
            if (k > 0) 
            {
                this.transform.Translate(0, speed * Time.deltaTime, 0);
            }
            if (k < 0)
            {
                Debug.Log("k down");

                this.transform.Translate(0,-speed * Time.deltaTime, 0);
            }
        }
    }

  새로운 함수인 Ladder를 만들겠다. 파라미터로는 k를 받는데 이는 Vertical input값을 넣어줄 것이다. 만약 태그가 inLadder라면 너굴맨의 레이어를 4로 바꾸고 중력을없앤다. k값에 따라 Y축으로 이동을 한다.

원래대로라면 새로운 레이어를 하나 만들어야하지만 만들 당시에는 실험적으로 해본것들이라 Water레이어로 지정해버렸다. 

원래 절대로 이러면 안된다.. 나중에 고생한다...

 

Water레이어와 다른 레이어들의 충돌을 전부 꺼버려서 무시하게 만들었다. 이렇게 하면 Water너굴맨이 사다리타고 올라가도 천장에 머리를 박지 않을 것이다. 

 

물과의 충돌없이 땅으로 꺼진 솜사탕과 그걸 바라보는 너굴맨

 

4번 : 접촉이 끝나면 다시 중력과 충돌을 가진다. 

void LadderOut()
    {
        Debug.Log("ladder out");
        this.rb.gravityScale = 1;
        this.gameObject.layer = 9;
	this.tag = "Player";
    }

다시 너굴맨의 속성들을 되돌리는 함수를 만든다. 

 

그럼 마지막으로 이 함수들을 어디에 끼워넣어야할까?

 

void FixedUpdate()
    {
        float k = Input.GetAxisRaw("Vertical");
        if (k != 0)
        {
            Ladder(k);
        }
    }

사다리는 FixedUpdate 메소드에 넣는다. 이는 프레임별로 사다리에 오르는지 확인해야 하기 때문이다. 그럼 사다리아웃은?

void OnTriggerExit2D(Collider2D other)
    {
        if (other.gameObject.layer == 7)
        {
            LadderOut();
        }
    }

OnTriggerExit2D 함수에서 7번레이어에서 탈출할경우 사다리아웃 함수를 호출한다. 

 

 

그렇다면 한번 결과물을 보도록 하자 

지금보니 메이플 캐시샵 같다 

문제점이 두가지 있다. 너굴맨이 자꾸 사다리 뒤로 가는것과 점프해서 사다리를 타면 운동량이 보존된다. 

 

1. 레이어문제 

너굴맨의 Sprite Renderer

밑의 sorting layer를 보면 플레이어라는 새로운 레이어를 만들어 준 후 순서를 0번째로 만든다. 0순위는 뭐다? 내가 갑이라는 뜻이다. 

 

2. 점프로 사다리 타기

원래 너구리에는 점프 사다리 타기가 없을 것이다. 잘 기억은 안나기에 그냥 점프로 탈 수 있게 해보겠다. 방법은 간단하다. 그냥 Ladder메소드 시작할 때 :

rb.velocity = new Vector2(0, 0);

한줄만 적어넣도록 하자. 

 

휴!

 

난항을 기대한 부분이지만 생각보다 빠르게 끝난 파트였다.

 

다음 파트에서는 게임의 승리와 패배를 만들어보도록 하겠다. 

Comments