[유데미x스나이퍼팩토리] 10주 완성 프로젝트 캠프 - 유니티(Unity) 기초 학습 5주차
유데미 x 스나이퍼팩토리 10주 완성 프로젝트 캠프 - 유니티 기초 학습 5주차 내용이다.
미니 프로젝트
이번 주는 미니 팀 프로젝트를 진행했다.
우리팀이 정한 게임은 타일바니아를 업그레이드한 게임이다.
(이런 게임)
내가 맡은 역할은 보스방의 모든 것을 구현하는 것이다.
(이때 분담을 잘 해야 깃 충돌이 괜찮았을지도,,)
(내가 구현한 보스방)
우선 보스의 능력을 보면 hp 30을 가지고 있고 4초마다 적 3마리 소환 or 마법 발사가 있다.
여기서 마법, 적 소환, 플레이어 총알은 오브젝트 풀링을 이용해 구현을 했다.
//오브젝트 등록 정보 관리
[System.Serializable]
public class ObjectInfo
{
public string objectName;
public GameObject prefab;
public int size; //생성 개수
}
public class ObjectPool : MonoBehaviour
{
public static ObjectPool instance; //싱글톤
[SerializeField]
ObjectInfo[] objectInfos = null; //등록될 오브젝트(Obj Info)들의 목록 저장
[Header("오브젝트 풀의 위치")]
[SerializeField]
Transform tfPoolParent; //Hierarchy창에서 위치할 곳
public List<Queue<GameObject>> objectPoolList; //담아 둘 리스트
void Awake() //인스턴스가 유일한지
{
if (instance == null)
{
instance = this;
}
else
{
Destroy(this.gameObject);
}
}
//init
void Start()
{
objectPoolList = new List<Queue<GameObject>>();
ObjectPoolState();
}
//등록된 오브젝트 저장
void ObjectPoolState()
{
if (objectInfos != null)
{
for (int i = 0; i < objectInfos.Length; i++)
{
objectPoolList.Add(InsertQueue(objectInfos[i]));
}
}
}
//록된 오브젝트 목록의 수만큼 오브젝트를 생성 후 바로 위 소스의 objectPoolList로 넘김
Queue<GameObject> InsertQueue(ObjectInfo perfab_objectInfo)
{
Queue<GameObject> test_queue = new Queue<GameObject>();
for (int i = 0; i < perfab_objectInfo.size; i++)
{
GameObject objectClone = Instantiate(perfab_objectInfo.prefab) as GameObject;
objectClone.SetActive(false);
objectClone.transform.SetParent(tfPoolParent);
test_queue.Enqueue(objectClone);
}
return test_queue;
}
}
오브젝트 풀 스크립트를 구현하고
GameObject fireBall = ObjectPool.instance.objectPoolList[0].Dequeue(); //풀에서 꺼내기
ObjectPool.instance.objectPoolList[0].Enqueue(this.gameObject); //다시 풀에 넣기
이런식으로 오브젝트를 생성하고 다시 풀에 넣을 수 있다.
[참고 - 오브젝트 풀링] (https://geojun.tistory.com/66)
적 hp바는 slider를 이용해서 구현했으며 value값을 조절하며 hp바를 구현했다.
public void SetSliderValue(float value)
{
_slider.value = value / MAX_HP;
}
//이런식으로
그 다음은 강의에서 배운 내용들이다
룰 타일
타일을 이용해 맵을 만들 때 사용자가 룰을 정해놓으면 타일을 생성하면 원하는 타일로 맵을 만들 수 있는 기능이다. 타일 팔레트에 룰 타일을 만들어 놓고 이용하면 된다.
{: .align-center}
해당 방식으로 룰 타일을 정의를 해놓으면 원하는 모양의 맵을 만들기 아주 편해진다.
{: .align-center}
위 그림으로 보면 위, 오른쪽은 타일이 있으며 아래, 왼쪽 좌우 대각선 타일에는 아무것도 없다면 해당 이미지의 모양을 가진 타일을 생성한다.
타일 맵 콜라이더를 이용하여 관리하면 된다.
시네머신 카메라 팔로우
시네머신 패키지를 다운받고 시네머신 카메라를 하이어라키창에 생성하고 사용하면 된다.
카메라의 인스팩터에서 Follow 오브젝트 칸에 플레이어를 넣으면 카메라가 지속적으로 플레이어를 따라다닌다.
시네머신에는 데드존이 존재하는데 데드존의 영역만큼에서 플레이어가 얼마나 움직여도 따라가지 않지만 데드존을 넘어가는 순간 카메라가 따라간다. 따라서 데드존의 Width와 Height를 잘 조절해서 사용하자
시네머신 컨파이너
플레이어의 카메라를 정해진 위치 이상으로 넘어가지 않게 만드는 것이다.
폴리곤 콜라이더를 이용해 자기가 원하는 위치만큼 콜라이더를 구성하고 시네머신 컨파이너 컴포넌트를 추가하면 해당 콜라이더 크기만큼 노란색 박스가 생긴다. 그러면 카메라가 정해진 구역에서만 움직이는 모습을 알 수 있다.
상태 중심 카메라
플레이어가 움직임이 있는지 없는지에 따라 확대/축소를 할 수 있는 카메라이다.
하이어라키창에서 상태 기반 카메라를 2개 생성한다.
각각 Idle, Run으로 나눴다. 후에 인스팩터창에서 Animated Target에 플레이어를 넣고 State를 만들면 된다. Lens Ortho Size를 조절해 카메라에 시야를 조절한다.
또 Custom Blend를 제작해서 카메라 사이의 간격을 조절해서 서서히 움직이는 카메라를 만들 수 있다.
마지막으로 Layer를 많이 사용한 프로젝트였는데 IsTouchingLayers를 사용해 Layer마다 행동을 정의해서 사다리 타기, 점프 등을 구현했다.
이번 프로젝트로 많은 걸 배웠는데 그 중 중요한 기능들만 여기에 기록을 했다.
깃허브로 협업을 진행해서 상당히 어려움이 있었는데 결국 시간이 부족해서 프로젝트 merge 단계에서 에러가 많이 생겨서 최종 합치기에 실패했다.
여기서 배운점은 팀원들에게 역할을 잘 분배하고 같은 씬을 작업하지 않아야하며 에러가 생기지 않게 잘 해봐야겠다.
참고 - github 협업
끝
본 후기는 유데미-스나이퍼팩토리 10주 완성 프로젝트캠프 학습 일지 후기로 작성 되었습니다. #프로젝트캠프 #프로젝트캠프후기 #유데미 #udemy #스나이퍼팩토리 #웅진씽크빅 #인사이드아웃 #IT개발캠프 #개발자부트캠프 #unity #유니티 #게임개발 #메타버스