글 작성자: Doublsb

저번에 이어서, Property Drawer의 구현이다.

 

기획

 

구현

오늘은 결론부터 가져왔다. 일단은 원하는 기획대로 구현이 되었기 때문에 성공.

...코드는 최악이지만 말이다. 정리를 전혀 안 해놨다. 날코딩의 결과를 보고 싶은 사람들은 이쪽으로.

해당 커밋 보러가기

 

코드에서 영 좋지 않은 냄새가 좀 많이 난다.

때문에 일단 차근차근 무엇을 구현했는지 쓰고, 코드를 좀 정리해보는 시간을 갖도록 하겠다.

 


#1 버튼

 

PropertyDrawer에서 버튼을 구현하기 위해서 GUI.Button을 사용하였다.

보통 CustomEditor에서는 GUILayout.Button을 사용하는데, 이상하게 해당 구문을 쓰는 게 불가능했다.

 

이런 오류가 뜨는데, 찾아본 결과로는 Monobehavior를 상속하고 있는 클래스여야 GUILayout이 작동하는 듯 하다.

현재 Emotion 클래스는 Monobehavior를 상속받고 있지 않으므로, 그냥 GUI.Button으로 구현하였다.

 

관련 링크

 

버튼을 눌렀을 때의 동작을 지정해주려면, 조건문인 if (GUI.Button(Rect, string) { } 안에 작성하면 된다.

 

이 스크립트로 _emotion의 element마다 삭제 기능을 추가했다.


#2 배열의 특정 element 삭제하기

 

배열의 특정 element를 삭제하는 기능일 뿐인데, 내부가 좀 복잡하지 않은가? 두 가지 이유가 있다.

 

1) int j = i;

기존에는 DeleteArrayElementAtIndex( ) 안에 i를 넣었다. 왜냐면 i가 0부터 arraySize까지 반복되니까.

그런데? 버튼을 누르니 마지막 요소만 지워지는 것이 아닌가.

 

왜냐? 클로저니까 그렇지.

이미 고통받아봤으니, 얌전히 int j = i; 구문을 추가해줬다.

클로저 관련하여 작성했던 글 보러가기

 

2) if (_sprite.GetArrayElementAtIndex(j).objectReferenceValue != null)

해당 조건문과 하위 내용은 왜 추가했는가? 그 이유도 별 거 아니다.

 

자, 해당 구문을 주석 처리하고 돌렸을 때의 결과물을 보자. 처참하다.

DeleteArrayElementAtIndex는 해당 Element에 참조된 Object가 있는 경우 참조된 Object를 지운다.

그러니까 참조된 Object가 있는 경우에는 2번 지워야 한다.


#3 결과

으윽! 이게 뭐람! 너무나 더럽다. 무엇을 구현하고자 하는 것인지 한번에 절대 알아볼 수 없을 만큼 코드의 가독성이 좋지 않다. 고쳐 보자.

 

 

1) 구문 함수화

이 구문은 이렇게 길 필요가 전혀 없다. 함수 하나로 묶어서, 시작하는 Rect와 Array만 전달하면 된다.

 

아무튼, 이런 식으로 하나하나 함수화했다.

 

2) Rect 맞춤식 리턴 함수

 

 

 

이 정도로 만들긴 했는데, NewRect가 엄청나게 거슬린다. 저것만 없어져도 행복할 것이다.

Rect를 Return하는 함수를 따로 만들었다.

 

이 정도까지 줄였다. 이 정도면 문제는 없으리라고... 생각한다. 음.

아니, 마음에 들지 않아 한번 더 했다.

 

그래! 이거지! 하지만 12시가 지나버렸다. 하지만? 1일 1커밋에 위배된 건 아니다.

1시간 전에 날코딩한 커밋은 이미 올려뒀기 때문이다.

아무튼, 오늘은 여기까지다.

 

해당 커밋 보러가기

반응형