[멋쟁이사자처럼 부트캠프 TIL회고] Unity 게임개발 3기 36일차
어제는 오랜만에 푹 쉬느라 패스ㅎ.ㅎ
오늘의 목표
1. 카메라 이동
2. UI
3. 배경음악과 버튼 사운드
4. 버그 수정
01. 카메라 이동
MainCamera 외에 화살이 날아가는 것을 잡아줄 추가 카메라 생성 (ArrowCam)
화살의 발사 시점과 재장전 시점(재생성 시점)에 각각의 카메라를 끄고 켜줌
if (Input.GetKeyDown(KeyCode.Space))
{
spawnAction?.Invoke();
ArrowCam.enabled = false;
Maincam.enabled = true;
}
void OnMouseUp()
{
Maincam.enabled = false;
ArrowCam.enabled = true;
}
ArrowCam이 카메라를 따라가게 만들고 싶음.
public void ArrowCamMove(GameObject currentArrow)
{
if (currentArrow == null) return;
ArrowCam.transform.position =
new Vector3(currentArrow.transform.position.x, currentArrow.transform.position.y, -10);
ArrowCam.transform.LookAt(this.currentArrow.transform.position);
}
새로운 화살이 할당되면, 그 위치를 잡고 따라가게 만들었다.
private void LateUpdate()
{
ArrowCamMove(currentArrow);
}
카메라는 LateUpdate에 할당
02. UI
오늘 하루 제일 많은 시간을 잡아먹었던 UI.....아무래도 처음 건드는 것이라 그랬던 것 같다.
메인 화면을 만들어준다.
제목, Start 버튼과 Stage 버튼 세 개를 만들었다.
Start 버튼을 누르면 선택할 수 있는 스테이지가 세 개 나오도록 Panel 아래 정렬해 두었다.
void Start()
{
panel.SetActive(false);
}
public void main()
{
panel.SetActive(true);
this.gameObject.SetActive(false);
}
간단하게 함수를 만들고 , 버튼에 할당해준다.
누르면 main()함수가 호출되게 해 놨다.
이제 각각의 버튼들에도 비슷한 방식으로 stage를 넘어가게 해 줄 것이다.
그 전에 새로운 것을 배웠다.
File - Build Settings에서 모든 Scene들을 Drag & Drop으로 등록해주고 이름을 확인해준다.
SceneMangement라는 namespace를 추가하면 SceneManger 함수를 쓸 수 있다.
쓸 수 있는 Scene관련 기능들이 많다. 하나하나 공부해야지..
public void Change ()
{
SceneManager.LoadScene("Stage2");
}
전과 같은 방식으로 버튼들에 할당해준다. (stage1,2,3 모두)
다음은 Exit 버튼이다. Stage 1,2,3에서 중단을 할 수 있는 방식을 만들었다.
알맞은 위치에 자리를 잡아 두고, LoadToMain이라는 함수(다른 스테이지에도 쓸)를 만들어 사용한다.
public void loadToMain()
{
SceneManager.LoadScene("Main");
}
다른 모든 스테이지에 넣어두면 된다.
알맞은 이미지도 찾아서 넣어준다.
버튼의 이미지로 넣어주고, 하얀색으로 글씨를 써 주었다.
혹시 배경색과 보색 이런 미술 개념들도 어느정도 알아두면 좋나.. ? 흠.. 시간 남을때 함 보긴 봐야지.
03. 배경음악과 버튼 사운드
배경음악
배경 음악은 새로운 스테이지를 들어갔다고 해서 멈추지 않았으면 했다.
메인 캠에 BGMManager라는 스크립트를 만들어준다.
using UnityEngine;
public class BGMManager : MonoBehaviour
{
private static BGMManager instance;
void Awake()
{
if (instance != null)
{
Destroy(gameObject);
return;
}
instance = this;
DontDestroyOnLoad(gameObject);
}
}
static 으로 선언된 변수 instance는 BGMManger 가 아무리 많이 생성되더라도 하나만 존재한다.
그래서 이 기능을 이용해 다른 BGMManger가 생성되더라도 제거하는 로직을 가능하게 한다.
instance가 없다면, 새로 생성한 object를 instance에 할당하고, 부술수 없는(씬이 전환되어도 유지되는)
오브젝트로 설정한다.
그리고 instance가 존재한다면, 생성한 오브젝트를 파괴한다.
그리고 , Loop와 Play On Awake를 켜 둔 채 게임을 실행하면 된다.
버튼 사운드
버튼 사운드 버튼 사운드도 마찬가지로 새로운 오브젝트에 버튼 사운드 소스를 달고,
DontDestroyOnLoad를 한 뒤 눌렀을 때에 재생되게 해 주었다.
다음은 예시 코드이다.
public class LoadToMain : MonoBehaviour
{
public GameObject AudioObject;
public AudioSource audio;
void Start()
{
audio =AudioObject.GetComponent<AudioSource>();
}
public void loadToMain()
{
audio.Play();
SceneManager.LoadScene("Main");
}
}
인스펙터에서 할당과 조작이 필수 !
완성된 모습은 이러하다.
2일만에 급작스럽게 제작한 제작물이라서 게임이라고 부르기도 어렵지만, 그래도 뭔가 뿌듯하긴 하다.
다른 분들은 스킬 시스템,,3D,,, 선택, 판매 등 다양한 기능을 더 넣으셨지만
일단 완성에 의의를 두었다.
더 구현해보고 싶은 기능들은 다음과 같다.
1. 폭발물 통 - 명중시 터지며 사방에 데미지를 줌
2. 드래그로 화면 전환 - 더 멀리 목표물이 있을 경우에 확인할 수 있게 드래그로 좌 우를 움직이고 싶다.
3. 미니맵 기능 - 카메라를 한 대 더 두어서 목표물의 시점을 고정해두고 싶다.
일단은 지금까지 했던 것 중에 미흡한 부분들을 조금 더 보완한다고 생각하고 UI와 사운드 관련 문제들을
더 많이 공부해보고, 남은 시간에 해야겠다.
04. 발생했던 버그, 의도와 달랐던 문제들
카메라 이동 문제
원래는 카메라 스크립트를 따로 두어 해결하려 했지만, 실패했다.
그래서 그냥 쏘는 과정 스크립트에 할당해 주었다. 나중가면 카메라 관리 스크립트를 따로 만드는지는
아직 모르겠다. 디자인패턴들을 배우다 보면 해결되겠지
바닥 충돌 문제
화살이 바닥에도 박히게 하려 했다. 그러나 충돌을 못하고, Ground에 Collider을 추가하니
화살이 시작하자마자 충돌해 이상한 방향으로 날아가는 문제가 있었다.
분명 모든 Ground에 쓰인 요소들에 Sprite type으로 Collider을 추가했고, 더해서 Composite Collider도 추가해 주었는데 왜.. ? 라고 생각하던 찰나, TileMapCollider2D를 활용하니 쉽게 해결되었다.
+ 방금 Composite Collider를 끄고 해 보았는데도 작동이 잘 된다. 그냥 모든 타일맵을 묶어서 처리해 주는 것 같다.
에셋에서 주어진 Ground에 한 번에 들어있으니 그런것 같기도... ?
Composite Collider 기능은 추가적으로 찾아볼만한 기능인 것 같다.
슬라임 애니메이션 작동 문제
슬라임 애니메이션이 자꾸 연속 재생되는 문제가 있었다. 분명 Loop를 꺼 두었는데 계속해서 재생되어서
뭐가 문제인지 한참 찾았다. Entry에서 계속 들어가는 문제였다.
항상 Debug를 잘 해야 한다. 이래서.
슬라임 공중 부양 문제
rigidbody2D.velocity = new Vector2(direction.x * moveSpeed, rigidbody2D.velocity.y);
다음과 같은 코드에서 y좌표를 0으로 두었더니 질량을 높이든 말든 공중부양하는 문제가 발생
왜 ? 현재 velocity를 계속해서 0으로 만드니까 ! 내려갈라다가 0이 되고 , 또 0이 되니까 슬라임 입장에서도
어쩔수 없었다. 새롭게 velocity를 할당해주니 문제 없이 진행되었다.
버튼 클릭음 안나오는 문제
Debug를 찍어보니 입력은 제대로 되고 있었다.
그래서 왜 ? 라고 생각해보니 씬이 넘어가면서 오브젝트가 파괴되어버리는 문제였다.
실행되고 파괴되어야 하는데, 실행과 파괴가 같은 프레임에서 진행되다보니 소리가 들리지 않았었다.
Don'tDestroyable을 버튼들에 넣어서 해결하였다.
그러나 이는 좋은 방법이 아니라고 생각한다. 파괴할 수 없는 오브젝트들이 쌓이다보면, 결국에는 렉을 유발할 것이기 때문이다. 지금은 스테이지가 3개라 상관이 없지만, 당장 바운스볼 같은 게임만 해도 수백개의 스테이지가 있다.
이를 해결하기 위해서 추가적으로 공부할 예정이다.
남은 시간과 내일은 유튜브를 보면서 내가 주먹구구식으로 구현했던 기능들을 효율적으로 바꿀 수 있는 방법에 대해 찾아보고, 금요일에는 질문을 통해서 앞으로 어떻게 공부하는 방식이 효율적인지 생각해봐야겠다.
예를 들어, 지금처럼 일단 시간을 투자해 보고, 그 다음에 다른 사람들은 어떻게 구현하나 알아보는 것보다
한 번 스윽 훑어보는 것만으로도 효율적인 방향성을 잡을 수 있다면 그것이 더 좋을수도 있으니까 말이다.
공부하고 싶은 것 : Sound관련 기능들이랑 버튼 관련 기능들 코루틴 관련 한 번더 (시간지연에 관해)
참조할 유튜브 :https://www.youtube.com/watch?v=ivzMnARal9g
https://www.youtube.com/watch?v=YPEkpwPrmPk&t=878s
https://www.youtube.com/watch?v=LooUj77MVSU&list=PLYQHfkihy4Az5OFjO2hbY3AOO2EKPkiza