그림자 퀄리티를 너무 높게 해 놓는 바람에 버벅거리는 문제가 있었다. 그림자가 그래픽의 퀄리티에서 차지하는 비중이 클 뿐만 아니라 최적화 측면에서도 상당히 큰 영향력을 발휘하는 듯싶다.
아 그리고 당분간은 진도를 빼는게 아니라 코드 리팩터링을 하면서 틈틈이 애니메이션 공부를 할 예정이다.
최근에 함수형 C#을 공부를 해서 유니티 이벤트 시스템으로 만들어 놓은걸 Func나 Action를 활용한 이벤트 시스템으로 만들어야겠다. 또 제너릭을 써서 더 상위 개념으로 만들 수 있는 건 더 상위로 묶어 낼 생각이다. Linq로 더 적극적으로 활용하고 말이다. 책에는 더 많은 내용이 있긴 했는데 기존 명령형이나 객체 지향으로 코딩하는 거 위에 이런 편의 기능이랄까 고급 기능을 언저서 사용하는 식으로 진행을 해야 할 듯싶다. 완전히 함수형 프로그래밍을 하기보단 말이다. 가령 Func나 Action이 기존에 void 등 기존에 명령형 함수 만들기를 대체를 할 수가 있지만 함수 내에 함수를 만든다든지 상황에 따라 함수를 수정할 필요가 있다든지 함수를 마치 변수처럼 쓴다는지 한 줄짜리 임시 함수를 만든다든지 이런 특수한 기능이 필요한 경우에 한해서 추가적인 기능을 쓸 생각이다. 쓰고 보니 기존의 명령형 보다 먼가 많이 확장된 거 같은 느낌이 들기도 한다.
public UnityEvent activeOn;
public UnityEvent activeOff;
public event Action playerOn;
public event Action playerOff;
일단은 유니티에서 제공하는 유니티 이벤트 시스템을 C# 고유의 event Action 시스템으로 바꿀 생각이다. 이게 캐릭터를 생성할때마다 드래그엔 드롭을 해야 해서 그냥 코딩으로 자동화를 하는 게 더 편한 듯싶다. 물론 유니티 이벤트 시스템이 더 직관적이기 때문에 갠 적으로 이쪽이 더 맘에 들긴 하다. 이벤트 기반 프로그래밍라는 개념도 함수형 프로그래밍을 공부하면서 안게 아니라 이 유니티 이벤트 시스템을 써보면서 알게 된 거니 말이다.
Action playerUIOn = () => playerUI.gameObject.SetActive (true);
playerOn += playerUIOn;
Action roundOn = () => round.SetActive (true);
playerOn += roundOn;
Action tailOn = () => tail.SetActive (true);
playerOn += tailOn;
Action playerUIOff = () => playerUI.gameObject.SetActive (false);
playerOff += playerUIOff;
Action roundOff = () => round.SetActive (false);
playerOff += roundOff;
Action tailOff = () => tail.SetActive (false);
playerOff += tailOff;
나중에 게임 진행중에 캐릭터를 생성하고 그러면 일일이 이벤트를 등록을 시켜줄 수 없기 때문에 조금은 번거롭지만 코딩으로 만들어 놓는 게 좋을 듯싶다.
그냥 이걸 void로 만드는 게 더 편할듯 싶다. 굳이 이걸 상황에 따라 += 했다가 -= 했다가 할게 아니기 때문이다.
그 다음에 제너릭을 해야 하는데 이걸 다른 함수형 언어에선 제너릭이라고 부르는 듯싶다. 이것도 event와 마찬가지로 상황에 따라 타입을 정할 수 있는 시스템이다. 플레이어와 에너미의 경우에는 겹치는 게 많기 때문에 제너릭을 유용하게 쓸 수 있을 듯싶다.
그러고 보면 Array보다 List의 장점이 상황에 따라 크기를 줄일 수 있고 늘릴 수 있고 제너릭의 성질이 있어서 타입도 상황에 따라 지정을 할 수 있다는 것이 아닌가 싶다. 이러고 보면 함수형 프로그래밍의 특징이 상황에 따라 유동적으로 쓴다는 거인 듯싶다. 동적으로 할당하는 건 아니고 고정적인 건데 유동적으로 사용할 수 있다는 게 특징인 듯싶다.
public static void ShuffleList <T> (List <T> list)
{
int random1;
int random2;
T tmp;
for (int index = 0; index < list.Count; ++index)
{
random1 = UnityEngine.Random.Range (0, list.Count);
random2 = UnityEngine.Random.Range (0, list.Count);
tmp = list [random1];
list [random1] = list [random2];
list [random2] = tmp;
}
}
내가 만든 건 아니고 퍼온 건데 제너릭의 경우에는 이럴 때 쓰면 유용할 듯싶다. 이걸 나중에 특정 아이템만 들어갈수 있도록 제한하는것도 필요할듯 싶다. where을 쓰면 되는것 같은데 자세한건 나중에 알아봐야 할듯 싶다.
그래픽 품질은 세부 설정을 따로 만드는 게 아니라 그냥 카메라에 포스트 프로세싱을 켜거나 끄면 될 듯싶다. 상 그리고 하 두개만 옵션으로 만들면 될듯 싶다. 아마 라이트도 하일때는 끄면 될듯 싶다.
'턴제제작' 카테고리의 다른 글
사이버 펑크 게임 [영상] (0) | 2019.06.15 |
---|---|
AI 공격 [영상] (0) | 2019.04.22 |
적 근접전투 (0) | 2019.04.11 |
대화 시스템 (2) | 2019.04.05 |
다음에 할일 (7) | 2019.03.16 |
WRITTEN BY