-
(28) 메인맵 제작#4 + 수정사항Galaxy Ball/2. 싱글플레이 - 스토리모드 2024. 6. 14. 17:52
싱글플레이의 챕터는 총 3챕터로 이루어져 있다
1. 프롤로그 + 튜토리얼 (1~5번 스테이지)
2. 태양계 (6~15번 스테이지)
3. 우주 (16~65번 스테이지)
1챕터에서 2챕터로 넘어갈땐 아예 다른 씬으로 변환될 예정이지만
2챕터에서 3챕터로 넘어가는것은 같은 씬에서 활동범위를 더 확장시켜줄 생각이다
2챕터의 무대가 될 태양계 영역. 위에 적은대로 15스테이지까지 클리어시 3챕터가 시작될텐데
지금으로부터 정확히 한달전에 했었던 튜토리얼씬에 쓰인 연출을 이번에도 이용해보겠다
사각 콜라이더를 4개 만들어 구역을 가둔뒤 플레이어와 충돌이 일어나는 순간 바로 그 반대쪽에 보내버리는것이다
이번에도 똑같이 사각 콜라이더로 경계를 지어주었고, 이 원리는 전에도 적은것처럼 공과 콜라이더 충돌하면
해당 콜라이더의 반대 방향으로 보내는것이었고
private void OnTriggerStay2D(Collider2D collision) { switch (collision.gameObject.tag) { case "StageDeadZone": rigid.velocity = Vector2.zero; break; case "SDZ_Bottom": transform.Translate(0, 620, 0); Debug.Log("빠져나가지 못하도록 위치 조절합니다"); break; case "SDZ_Top": transform.Translate(0, -620, 0); Debug.Log("빠져나가지 못하도록 위치 조절합니다"); break; case "SDZ_Left": transform.Translate(610, 0, 0); Debug.Log("빠져나가지 못하도록 위치 조절합니다"); break; case "SDZ_Right": transform.Translate(-610, 0, 0); Debug.Log("빠져나가지 못하도록 위치 조절합니다"); break; } }
이것이 그 기능에 해당하는 코드였다
경계선에게 각각 맞는 태그를 달아두어 태그에 따라 위치를 조절해주었는데
일단 태그의 개수가 너무 많아진것도 있고, 이렇게 하면 새로운 경계벽을 만들때 또
새로운 태그가 4개나 추가되는것이 너무 비효율적으로 느껴졌다
private void OnTriggerStay2D(Collider2D collision) { if (collision.gameObject.tag == "StageDeadZone") { rigid.velocity = Vector2.zero; } switch (collision.gameObject.name) { case "Bottom": transform.Translate(0, 620, 0); Debug.Log("빠져나가지 못하도록 위치 조절합니다"); break; case "Top": transform.Translate(0, -620, 0); Debug.Log("빠져나가지 못하도록 위치 조절합니다"); break; case "Left": transform.Translate(610, 0, 0); Debug.Log("빠져나가지 못하도록 위치 조절합니다"); break; case "Right": transform.Translate(-610, 0, 0); Debug.Log("빠져나가지 못하도록 위치 조절합니다"); break; } }
그래서 해당 코드를 더이상 태그가 아닌 이름으로 구별하도록 만들었다
물론 이렇게 하기 위해서 첫번째 데드존은 이름을 앞글자만 따와 바꿔주었다
이렇게하면 메인 스테이지에서도 바로 연계해서 사용할 수 있다
왜냐면 위 코드는 플레이어가 컨트롤하는 공에 똑같이 들어가는 Stage Ball Controller 스크립트이기 때문
하지만 튜토리얼 스테이지와 메인 스테이지의 사이즈, 비율 모두 다르기에
위 코드처럼 튜토리얼씬에서 Bottom에 닿을시 y축으로 620만큼 이동해준다고 해서 메인스테이지도
똑같이 해줄수 없다. 그렇기에 한가지 조건을 더 추가해 상황에 따라 다르게 잡아줘야 한다
switch (collision.gameObject.name) { case "Bottom": if (gameManager.StageClearID < 6) { transform.Translate(0, 470, 0); } transform.Translate(0, 170, 0); Debug.Log("빠져나가지 못하도록 위치 조절합니다"); break; case "Top": if (gameManager.StageClearID < 6) { transform.Translate(0, -470, 0); } transform.Translate(0, -170, 0); Debug.Log("빠져나가지 못하도록 위치 조절합니다"); break; case "Left": if (gameManager.StageClearID < 6) { transform.Translate(460, 0, 0); } transform.Translate(165, 0, 0); Debug.Log("빠져나가지 못하도록 위치 조절합니다"); break; case "Right": if (gameManager.StageClearID < 6) { transform.Translate(-460, 0, 0); } transform.Translate(-165, 0, 0); Debug.Log("빠져나가지 못하도록 위치 조절합니다"); break; }
여러모로 유용하게 쓰이는 StageClearID. 어차피 5스테이지까지 끝내고나면 스토리진행 후
바로 씬변환을 할것이기 때문에 StageClearID가 6을 넘어가는 순간 IF문을 넘어가고 그 다음줄에 있는
위치조절을 실행시키면 된다
이러면 이제 같은 스크립트를 공유해도 각자 다른 값으로 위치조절을 하게 된다
그리고 15스테이지를 클리어하면 이 벽은 자동으로 제거되어야한다
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Border : MonoBehaviour { void Update() { StageGameManager gameManager = FindObjectOfType<StageGameManager>(); if(gameManager.StageClearID > 15) { Destroy(gameObject); } } }
그래서 새로운 스크립트를 하나 작성한뒤 Border 부모 오브젝트에 넣어주었다
원래는 GameManager에 같이 넣어주려고 했는데 이상하게 그건 아무리 해도 되질 않아
어쩔수 없이 따로 스크립트를 하나 생성해주었다
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Border : MonoBehaviour { public GameObject ch2Border; public GameObject ch3Border; void Update() { StageGameManager gameManager = FindObjectOfType<StageGameManager>(); if(gameManager.StageClearID > 15) { Destroy(ch2Border); } if(gameManager.StageClearID > 65) { Destroy(ch3Border); } } }
아 정정하겠다. 어차피 3번째 벽도 언젠가는 파괴시켜야 하기 때문에 지금 미리 코드를 구현해놓겠다
2번째 벽은 15번 스테이지를 클리어하면, 3번째 벽은 65번째, 마지막 스테이지를 클리어하면 파괴된다
탱커 유닛은 태그를 Enemy에서 Untagged로 바꿔주었다
이렇게하면 승리조건에 탱커유닛은 파괴하지 않아도 된다
새로운 유닛도 하나 추가했다. 이 유닛은 탱커 유닛과 똑같이 공격도 하지 않지만
차이점이라면 내구도를 상당히 높게 잡았고, 태그가 Enemy라서 승리조건에 포함된다는것이다
'Galaxy Ball > 2. 싱글플레이 - 스토리모드' 카테고리의 다른 글
(30) 수정 사항 & 스테이지 제작#3 (0) 2024.06.18 (29) 메인맵 제작#5 + 스테이지 제작#2 (1) 2024.06.16 (27) 스테이지 제작 #1 (0) 2024.06.14 (26) 각종 수정 사항 + 아이템 유닛 추가 제작 (1) 2024.06.13 (25) 메인맵 제작#3 (0) 2024.06.12