ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (3) 스테이지씬 연출 추가
    Galaxy Ball/2. 싱글플레이 - 스토리모드 2024. 5. 14. 17:40

    <비포 - 애프터>

    시작하기전에 한가지 달라진게 있다면 Json 파일을 비직렬화하여 대사를 출력하는 스크립트인

    ShowText를 조금 수정했다. 전에는 오직 코드에서 "text"라는 파일만 비직렬화하는 전용코드였다면

    이제 Inspector창에서 편하게 파일이름을 써넣어 손쉽게 바꿀수 있다

     

     

    또 편리해질 수 있는 기능이 생각난다면 추가할 예정이다

    사실상 이제 미리 만들어둔 LineBox를 복붙만 해주면 어느씬에서든 활용이 가능해졌다

     

    이제 본론으로 들어가자

    보다시피 스테이지는 한정이 되어있고 플레이어는 이 정해진 스테이지를 넘어가게 할 수 없다

    그래서 이걸 어떻게 막을까 고민해보았다. 처음엔 박스 콜라이더를 깔고 반사시켜버릴려고 했지만

    타일 특성상 반사가 되면 더 어지롭게만 느껴질뿐이었다. 그래서 생각한 아이디어는 조금 색다른데

     

    우선 1차 방어막인 FirstDeadZone을 깔아준다

    태그는 StageDeadZone, 박스콜라이더에 IsTrigger 처리를 해주었다. 

    즉 통과가 가능하긴하다

    그리고 2차 방어막 SecondDeadZone을 만들어준다

     

    이것 역시 박스콜라이더에 IsTrigger까지는 똑같지만 태그를 방향에 따라 각각 다르게 잡아준다

    위같은 경우는 SDZ_Top으로 잡아주었다. 왜 태그가 다른지는 후에 설명하겠다

     

     public GameObject LineBox;
     
     ..............
    
    
    private void OnTriggerEnter2D(Collider2D collision)
     {
         if (collision.gameObject.tag == "StageDeadZone")
         {
             LineBox.SetActive(true);
             Debug.Log("대화창이 활성화 되었습니다");
         }
     }
     private void OnTriggerStay2D(Collider2D collision)
     {
         switch (collision.gameObject.tag)
         {
             case "StageDeadZone":
                 rigid.velocity = Vector2.zero;
                 break;
             case "Stage":
                 StageStart.gameObject.SetActive(true);
                 break;

     

    그리고 플레이어 구체를 관리하는 StageBallControl에서 코드를 수정해주자

     

    private void OnTriggerEnter2D(Collider2D collision)
     {
         if (collision.gameObject.tag == "StageDeadZone")
         {
             LineBox.SetActive(true);
             Debug.Log("대화창이 활성화 되었습니다");
         }
     }

     

    우선 충돌이 일어나자마자 충돌한 오브젝트의 태그가 "StageDeadZone"이라면 맨위에 받아준 LineBox를 활성화한다

    물론 알다시피 LineBox는 대사를 출력해주는 대사창이다

     

    [
       {
          "id":1,
          "text":"어..지금 너무 멀리온 것 같은데",
          "delaytime":0.05
       },
       {
          "id":2,
          "text":"이 너머에 너가 해야될 스테이지 같은건 없으니까 <br> 이만 돌아가봐도 괜찮아",
          "delaytime":0.5
       }
    ]

    LineBox에 들어갈 대사이다

     

     

     

     private void OnTriggerStay2D(Collider2D collision)
     {
         switch (collision.gameObject.tag)
         {
             case "StageDeadZone":
                 rigid.velocity = Vector2.zero;
                 break;
             case "Stage":
                 StageStart.gameObject.SetActive(true);
                 break;

     

    두번째 수정부분. 충돌상태인 내내 만약 충돌한 오브젝트의 태그가 똑같이 StageDeadZone이라면

    플레이어 구체의 속도를 0으로 초기화시켜 급 멈추게 해준다

     

    이렇게 2개의 수정을 하게 된다면 이렇게 될것이다

     

    콜라이더에 닿는 순간 대사가 출력되며, 출력이 끝나면 대사창은 비활성화가 된다

    그리고나서도 계속 무리해서 나갈려고 드래그하면 뚝뚝 끊기며 조금씩 이동하는것을 볼수 있다

     

    만약 여기서 박스 콜라이더가 끝날때까지 드래그를 멈추지 않는다면 결국 화면밖으로 나가버리고 만다

    그렇기에 SecondDeadzone이 필요한것이다

    아까 보여준 조금 더 반경이 큰 SecondDeadzone. 이번엔 확실하게 나갈수 없도록 만들어야 하기에

    다른 방법을 사용할 것이다

     

     private void OnTriggerStay2D(Collider2D collision)
     {
         switch (collision.gameObject.tag)
         {
             case "StageDeadZone":
                 rigid.velocity = Vector2.zero;
                 break;
             case "Stage":
                 StageStart.gameObject.SetActive(true);
                 break;
             case "SDZ_Bottom":
                 transform.Translate(0, 190, 0);
                 break;
             case "SDZ_Top":
                 transform.Translate(0, -190, 0);
                 break;
             case "SDZ_Left":
                 transform.Translate(170, 0, 0);
                 break;
             case "SDZ_Right":
                 transform.Translate(-170, 0, 0);
                 break;
         }
     }

    StageBallControl에 있는 아까 그 스위치문에 케이스를 추가시켜준다

    쉽게 말해 2차 방어막에 닿는순간 그 위치와 반대되는 방향으로 공을 이동시켜주는것이다

    그렇기에 이번엔 태그를 각각 만들어 4개 전부 다르게 달아준것이다

     

     

     

    이런 식인거다. 결국 빠져나오지 못하는 공간에서 뺑뺑이를 돌다가 결국 다시 돌아갈수밖에 없도록 만드는것

     

    하지만 여기서 한가지 문제가 생겼다

     

    대사 특성상 딱 한번만 나와야하는 대사가 충돌할때마다 활성화 된다는것.

    상황을 자연스럽게 만들기 위해 코드를 수정하자

     

    private bool hasbeenout = false;
      
      
      private void OnTriggerEnter2D(Collider2D collision)
      {
          if (hasbeenout) return;
          if (collision.gameObject.tag == "StageDeadZone")
          {
              LineBox.SetActive(true);
              Debug.Log("대화창이 활성화 되었습니다");
              hasbeenout = true;
          }
      }

     

    StageBallControll의 대화창을 활성화시키는 파트에서 hasbeenout이라는 bool 타입 변수를 만들어

    최초 딱 한번만 나오도록 조절하면 된다

     

    그리고 굳이 가운데 디버그를 찍어놓은 이유는 보통 대사창을 활성화시키는 역할을

    공의 컨트롤을 담당하는 스크립트에서 하는 경우가 많지 않기에 나중에 봤을때 헷갈리지 않도록 찍어놓은것이다

     

     

Designed by Tistory.