노래에 맞게 노트 생성(JSON을 통해 실시간으로 직접 노트를 찍거나 단순히 BPM에 맞게 노트 생성)
노트 타격 판정
타격에 따른 애니메이션
콤보 및 점수
<선택 구현 계획>
사용자 모드(사용자가 원하는 노래 추가 및 노트 생성)
일정 콤보가 되면 피버 타임 구현
음량 조절
전체적으로 8Bit 컨셉으로 노래 또한 8Bit로 몇 가지 만들 생각이다. 에셋은 각자 원하는 것을 하나씩 가져와서 상의 후 결정하기로 했다.
주말에 이론강의 + 수준별 강의를 정주행하고 하고 개인 과제 때 오브젝트 풀에 대해 정확히 이해하지 못하고 사용한 것 같아서 좀 더 공부해야겠다. 개인과제에서 전체적인 설계가 많이 무너졌기 때문에 초기에 설계를 확실히 짜고, 특히 이전 강의에 나왔던 애니메이션과 FSM의 스크립트 구조를 공부해볼 생각이다.
나름 여러 번 팀과제를 했지만 3D는 처음이라 무엇이 문제인지 모르겠지만 어쨌든 해결(?)한 문제들과 재밌는 버그가 많았던 것 같다.
트러블 슈팅
Scriptable Object 연결끊김
프로젝트를 병합하는 과정에서 자원과 구조물 등의 Scriptable Object 연결이 끊겼다. 다시 연결해도 Missing이 뜨길래 Scriptable Object를 상속받은 스크립트 파일의 위치를 옮겼다가 다시 원래대로 옮기니까 해결되었다. meta 파일 때문인 것 같은데 정확한 원인은 모르겠다.
외부 객체의 컴포넌트 참조
프로젝트 작업에서 프리팹으로 오브젝트들을 관리했는데 마찬가지로 병합하는 과정에서 연결이 끊겨서 코드로 연결시켰다.
낚시대로 자원 채집
Raycast를 충돌체로 설정해서 모든 충돌체와 상호작용하는 문제였는데 웃겨서 넣었다.
하고 싶은 것들이 많았지만 마감은 맞춰야하니 타협하며 적정선에서 마무리한 것 같다. 마지막 날은 버그 찾는데 시간을 보냈는데 배울 점도 많았고 재밌었다.
제작버튼을 누르면 제작창이 닫히고 미리보기 프리팹이 보이면서 플레이어를 따라가고, 좌클릭하면 프리팹이 사라지고 실제 구조물이 설치된다.
여러 개를 제작할 수 있도록 배열로 구조물들을 저장한다.
[System.Serializable]
public class Craft
{
public string craftName;
public GameObject buildCraft; // 실제 설치되는 구조물
public GameObject previewCraft; // 설치 미리보기
}
public class CraftBuild : MonoBehaviour
{
private bool isPreviewActivated = false;
[SerializeField] private Craft[] craftCampfire;
private GameObject varPreviewCraft; // 미리보기 변수
private GameObject varBuildCraft; // 실제 설치되는 구조물 변수
[SerializeField] private Transform playerPosition;
private RaycastHit hitInfor;
[SerializeField] private LayerMask layerMask;
[SerializeField] private float range;
[SerializeField] private GameObject craftingWindow;
private void Update()
{
if (Input.GetButtonDown("Fire1"))
{
Build();
}
}
private void Build()
{
if (isPreviewActivated)
{
Debug.Log("Create");
Instantiate(varBuildCraft, varPreviewCraft.transform.position, Quaternion.identity);
Destroy(varPreviewCraft);
isPreviewActivated = false;
craftingWindow.SetActive(false);
varPreviewCraft = null;
varBuildCraft = null;
}
}
public void CreateBtnClick(int craftNum)
{
varPreviewCraft = Instantiate(craftCampfire[craftNum].previewCraft, playerPosition.position + playerPosition.forward, Quaternion.identity);
varPreviewCraft.transform.parent = playerPosition;
varBuildCraft = craftCampfire[craftNum].buildCraft;
isPreviewActivated = true;
craftingWindow.SetActive(false);
PlayerController.instance.ToggleCursor(false);
}
}
다른 구조물도 추가할 예정인데 코드가 효율적이진 않은 것 같다. 실전과 이론을 함께 병행하며좀 더 고민해보면 좋을 것 같은데 시간에 대한 아쉬움이 많고 이해력도 좋지 못해서 생각이 오래 걸려서 아쉽다. 구현하고 싶은 건 정말 많은데 어떤 식으로 방향을 잡아야할지 막막하다. 금방 뚝딱 만들 수 있는 경지까진 바라지 않아도 어떻게 구현할지 감을 잡을 수 있으면 좋겠다.