1. 오늘의 알고리즘 코드카타 - 숫자 문자열과 영단어
답안 :
//String.Replace 메서드를 알게 되었다...
//단순 노가다 가즈아
using System;
public class Solution {
public int solution(string s) {
int answer = 0;
s = s.Replace("zero", "0");
s = s.Replace("one", "1");
s = s.Replace("two", "2");
s = s.Replace("three", "3");
s = s.Replace("four", "4");
s = s.Replace("five", "5");
s = s.Replace("six", "6");
s = s.Replace("seven", "7");
s = s.Replace("eight", "8");
s = s.Replace("nine", "9");
answer = int.Parse(s);
return answer;
}
}
2. 오늘의 공부
오늘은 발표를 위한 마무리 준비, 리드미 작성, 발표 리허설 등을 하며 오전을 보냈다.
리드미 작성 부분을 쓰며 정리한 구현된 공격 로직의 흐름은 나중에도 참고해보려고 남겨두겠다.
-> 공격 인풋 발생(어택 컨트롤러)
-> 매니저에 저장된 무기 사용 명령(어택 매니저)
-> 무기 인터페이스의 공격 명령 발생(IWeapon - Attack)
-> 현재 저장된 무기의 공격 명령 발생(AttackManager.currentWeapon.Attack)
-> 각 무기 내부의 탄환 생성 로직 작동(플레이어의 발사체 증가 수, 관통 증가 수 등이 각자 상이하게 적용)
-> 오브젝트 풀링을 담당하는 매니저에서 탄환 생성(PoolManager)
-> 생성된 탄환이 개별 로직대로 작동(ex= 일반적인 직선 이동, 생성된 위치에 시간차 공격, 적을 추적)
-> 지정된 타겟과 충돌을 감지하면 대상의 HealthSystem을 불러와 대미지 적용
+ 이벤트 트리거로 충돌 애니메이션 작동과 삭제 처리
+ 관통이 가능하다면 처음 충돌한 대상의 HealthSystem을 저장하고 이후 충돌한 대상의 것과 비교하여 투사체 이동중 중복 충돌 방지
오후에는 각 팀들의 발표와 피드백을 보았다. 다른 팀들도 놀라운 퀄리티로 만들어온 팀도, 자기들의 고충을 이겨내는 팀도 있었다.
우리 팀의 퀄리티도 어디 내놓아도 전혀 부족할 것이 없는 것 같아 뿌듯했다.
이후에는 팀 내에서 자체적으로 팀장의 이번 과제에서 이용한 동적 생성에 관한 멘토링 시간이 있었다.
이런 구조는 처음 보는지라 어려우면서도 익히기만 한다면 무지 유용한 기술이었다.
개인 과제를 할 때도 가능하다면 이번 과제의 동적 생성과 UI는 응용해 보고 싶다.
저녁에는 스탠더드 반 특강을 진행하고 하루가 끝났다.
특강의 주제는 설계 패턴. 그런데 신기하게도 이번 팀플을 진행하며 배운 내용들과 쳤다.
- 프로젝트의 커스텀 Enum 데이터 타입들을 모아놓을 클래스 파일을 생성해서 정의
- ex ) namespace EnumTypes 안에 enum AttackTypes, enum CardRanks ...
- 같은 맥락으로 커스텀 Struct 데이터 타입들을 모아놓을 클래스 파일 생성
- static class를 이용한 유틸리티 타입을 모아놓을 클래스 파일로 인스턴스 이용
- 글로벌 변수들을 모아놓을 클래스들 정리
- 생성될 객체들을 관리할 관리자 클래스 정의
- ex) 가장 꼭대기에 GameManager 클래스가 하위 관리자로 CharacterManager, UIManager, CameraController, MapManager, EffectManager를 갖는 형태로 설계. 이러면 게임매니저만 역참조 하면 다른 모든 것에 접근 가능해진다.
- 씬 전환에 걸쳐서도 게임 오브젝트들을 갖을 객체를 정의하여 데이터들을 관리
- 에디터 타임에 수정되며 게임 타임 중에는 변하지 않을 데이터들을 SO로 정의하여 관리
- 데이터 덩어리 객체를 정의하여 데이터 접근
- ScriptableObject나 GameObject와 같은 객체를 참조하고자 하는 경우 모두 [SerializeField]로 사용하기 부담된다는 점도 있다. 그러므로 무지성으로 사용하고싶은 모든 데이터들을 담아둘 덩어리 객체를 정의하여, 자주 사용되던 테스팅으로 사용되던 필요하다면 박아넣고 사용할 수 있는 공간을 확보한다.
- 리소스를 종류별로 묶어둔 데이터 덩어리 정의
- BaseMonoBehaviour 객체를 통해 MonoBehaviour를 래핑한다.
- 유니티에서는 gameObject에 스크립팅을 위해 MonoBehaviour 객체를 이용한다. 하지만 MonoBehaviour는 부족한 점이 많다. 그래서 몇가지 기능들을 확장해서 사용할 필요가 있다.
- MonoBehaviour의 리플렉션 이벤트들은(Awake, Start, Update, OnDestroy ..) 굉장히 느리다. 그러므로 자체적인 이벤트 호출루틴을 구축할 필요가 있다.
- OnDestroy 시에는 반드시 모든 레퍼런스를 놓아주기
- 유니티에는 가비지 컬렉터가 있으니 메모리는 알아서 관리해줄 것이다.. 라는 착각은 버리자.
갈수록 유용하지만 어려운 개념들이 늘어난다. 점점 따라가기 벅찬 느낌이 있지만, 이런 게 취미 수준의 코딩과 점차 전문적인 기술로 나아가는 길이라고 생각이 든다.
'TIL' 카테고리의 다른 글
[TIL]2024-2-20 / 40일차 - 심화 주차 2일차 (0) | 2024.02.20 |
---|---|
[TIL]2024-2-19 / 39일차 - 심화 주차 시작 (0) | 2024.02.19 |
[TIL]2024-2-15 / 37일차 - 팀 과제 4일차 (1) | 2024.02.16 |
[TIL]2024-2-14 / 36일차 - 팀 과제 3일차 (0) | 2024.02.14 |
[TIL]2024-2-13 / 35일차 - 팀 과제 2일차 (1) | 2024.02.13 |