리펙토링

턴제제작 2019. 4. 20. 06:41

 

 

 그림자 퀄리티를 너무 높게 해 놓는 바람에 버벅거리는 문제가 있었다. 그림자가 그래픽의 퀄리티에서 차지하는 비중이 클 뿐만 아니라 최적화 측면에서도 상당히 큰 영향력을 발휘하는 듯싶다. 

 아 그리고 당분간은 진도를 빼는게 아니라 코드 리팩터링을 하면서 틈틈이 애니메이션 공부를 할 예정이다. 

 최근에 함수형 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
아이고이아

,