오늘 배운 내용
- 개인과제 GatherClone 완성
개인과제 GatherClone 완성
이번 주 개인 과제를 마무리 지었다. 코드를 작성할 때 저번 피드백 받은 부분들을 최대한 반영하려고 노력했다.
과제는 대부분 UI들로 상호 작용을 하는 느낌의 과제였다고 생각한다.
그래서 UI들을 각각 프리펩으로 만들어 준후 UI 프리펩의 이름과 1 대 1로 스크립트를 만들어 주었다.
UI 스크립트 들은 전부 상위 클래스인 UI 클래스를 상속받았고, UI 클래스에는 gameObject의 SetActive를 바꿔줄
OnUI(), OffUI() 메서드를 virtual로 선언해 주었고,
대부분의 클래스는 OnUI(), OffUI()메서드를 그냥 사용하고 특별한 기능을 요구하는 경우에만
override해서 사용했다. UI클래스들에서.gameObject.SetActive()를 해줘도 됬지만
모든 UI 클래스가 항상 호출해야되는 부분이라고 생각해서 상위 클래스에 메서드로 묶어두어
메서드로 바로 접근할 수 있도록 했다.
그리고 UIManager에서 UI들을 List로 관리하면서 불러왔을때 override한 메서드를 바로 사용할 수 없어서
당황했지만 생각해보니 어차피 호출해야하는 UI가 이미 정해져있으니 해당 타입으로 캐스팅하면
다시 각 UI들에서 override한 메서드를 쓸 수 있다는걸 한번 더 상기하게 되었다.
그 와중에 느낀점은 만약 어떤 객체를 저장하지 않고 바로 그 객체의 메서드를 호출할 때라도
한번 객체 변수에 저장하고 사용하면 코드를 볼때 좀 더 직관적이고 위 상황같이 실수 할 일도 줄어들겠다는 생각을 했다.
마지막 기능 구현은 플레이어와 npc의 상호작용이였는데 플레이어와 npc가 일정 거리에 있으면
플레이어가 npc에게 상호 작용을 하는 부분이였는데 여기서 문제가 생겨서 고민을 많이 한 것 같다.
처음 보고 플레이어에 범위를 감지할 게임 오브젝트를 생성하고 투명으로만든후 Collider를 isTrigger상태로 줬다.
그런데 이렇게 되니 플레이어 하위에 collider가 2개가 되서 서로 충돌을 감지하는 상황이 되버렸다.
그리고 이 당시에는 Player와 Npc 클래스 두개로 기능을 구현하려고 했었는데 Npc가 Player를 상속하거나 Player가 Npc를
상속하려고 하니 뭔가 이상하다는 생각이 들었다.
결국에는 고민 끝에 상위 클래스 Unit을 만들고 Player와 Npc는 Unit을 상속 받았다.
그리고 NPC의 프리펩도 따로 만들어 주고 (원래는 프리펩도 공용으로 사용했었다) Player가 아닌 NPC의 프리펩에
범위를 감지할 게임 오브젝트를 생성해주었다.
그리고 나서 Player에서는 OnTriggerEnter() 로 트리거를 감지하기만했다!
그러니 Player가 Npc 근처에 가면 대화창이 출력되는 부분을 쉽게 구현할 수 있었고,
또 OnTrigger(), OnCollision() 계열의 함수들에 Enter, Exit, Stay등의 바리에이션이 있다는 것도 알 수 있었다.