디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

ㅇㄹ) 명상 시에 자지 않는 모드를 만들어보자. 2

ㅇㅇ갤로그로 이동합니다. 2025.01.17 23:29:22
조회 298 추천 14 댓글 5


https://gall.dcinside.com/board/view/?id=rlike&no=484437&page=1

 



나는 전편에서 ButtonAbility.Use();를 살펴보기로 했다. 


이번 화에서는 이 소스 코드 분석이 어떻게 이루어지는 지를 다룬다.



+4. 소스 코드 분석.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d71948d7cc2e8a39353006171d749


지난 화에서 설치했던 dotpeek을 켜서 엘린의 소스 코드를 가져오자.


설치된 곳을 모르겠다면 스팀에서 엘린을 오른쪽 클릭한 후에


속성 - 설치된 파일 - 찾아보기 순으로 클릭하면 엘린의 경로를 확인할 수 있다.


우리가 찾아야할 파일은 "Elin\Elin_Data\Managed\Elin.dll" 이다.


로딩이 되었으면 <root namespace>로 들어간다.


그리고 곧바로 ButtonAbility 클래스의 Use(); 메소드를 찾아보자.


viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d7194db2cc3ecf0c106046171d749


이렇게 되어 있다.


TryUse(); 는 같은 클래스에 오버로드된 TryUse(); 를 부르고 있다.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d7194df7f9febac925a526171d749



여기서 인상 깊은 사실은 TryUse(); 를 사용하면서 인자로 AI_Meditate 객체를 전달해주고 있다는 사실이다.


그런데 소스 코드의 타입은 Act네? 이 말인즉 AI_Meditate 객체는 Act를 상속하고 있다는 뜻이다.


생각이 난 김에 AI_Meditate 객체를 살펴보자.




viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d7194dd2bc2bef5c2560f6171d749


AI_PassTime이라는 객체를 상속하고 있다. 



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d7194db27cdbca19306506171d749


그래서 AI_PassTime을 살펴보면 Run(); 메소드 안에 재미있는 코드를 발견할 수 있다.


캐릭터의 상태를 체크한 후에 Sleep(); 이라는 메소드를 사용해주고 있다.


딱 봐도 재우는 코드잖아?


정말 재우는 코드가 맞는지. 엘린에서 확인해보자.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d719489279eb0a0c0560e6171d749



Unity Explorer의 Hook기능을 사용하면 게임 상에서 메소드가 실행되었을 때 로그를 출력할 수 있다.


ButtonAbility에 할당되어 있는 AI_Meditate 인스턴스에 들어가서 AI_PassTime에게 상속받은 Run(); 메소드를 Hook해주자.


그리고 졸린 상황을 만들자.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d7194da7acaeda1c101016171d749



여기서 편리한 디버깅을 위한 팁.


본인이 맨땅 박치기를 하면서 알게 된 것인데, 엘린의 많은 오브젝트는 EClass라는 클래스를 상속한다.


그리고 EClass는 pc 등의 게임 오브젝트에 접근할 수 있는 정적 메소드를 제공한다.


그러므로 우리는 Unity Explorer에서 EClass를 찾기만 하면 pc 인스턴스에 접근할 수 있다.


각설하고 일단 캐릭을 재워야하니 EClass에서 pc 프로퍼티에 접근한다.


그리고 그 안에는 현재 캐릭터의 졸림도를 표현하는 sleepiness라는 속성이 있다.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d71948d29cebcf19504056171d749


+오브젝트를 타고 들어가서, StatsSleepiness의 속성 값을 수정한 뒤 Apply를 누른다.


이렇게 우리는 캐릭터를 언제든지 잠만보로 만들 수 있게 되었다.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d71948d2899eda29053546171d749



그리고 메소드의 동작을 확인하기 위해서 Hook을 설정한다.


그리고 이 다음 명상을 해보면...



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d71948978ccb0a79455546171d749


+

AI_PassTime에서 Run(); 메소드가 호출되는 것을 알 수 있다.


그렇다면 AI_PassTime안에 존재하는 수면 관련 메소드들은 어떨까?



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d7194df27ccbda19254056171d749


잘 나온다.


우리는 이로서 명상 버튼을 누르면 AI_PassTime의 Run(); 메소드가 실행되고,


그 안에 있는 Chara.CanSleep(); 메소드와 Chara.Sleep(); 메소드가 수면할 때 호출된다는 것을 확인하였다.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d71948f7f9ebaf69303576171d749


그리고 여기서 알아두면 좋은 사실이, Hook 기능은 Harmony를 사용해서 패치하기  때문에 


나중에 익숙해지면 즉석에서 메소드를 수정해서 실행시켜볼 수도 있을 것이다.


아무튼 우리는 졸린 상태에서 명상 버튼을 누르면 이렇게 CanSleep(); 과 Sleep(); 이 순차적으로 실행된다는 것을 알게 되었다.


viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d7194df2fcbeaad9554526171d749

viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d7194dc2bc3baac9400506171d749




그리고 로그에서도 정보를 얻었다. CanSleep(); 이 실행될 당시에


Chara 인스턴스의 상태가 ToString(); 으로 표시되고 있는데, 로그는 당시 Chara의 ai 필드의 객체명이 AI_Meditate였음을 보여준다. (* 자세한 구현은 디컴파일러로 찾아볼 수 있다.)


우리는 이렇게 명상시 왜 수면에 빠지게 되는지 알게 되었다.


5. 운이 없는 경우.


물론 이것은 재수좋게 Sleep(); 메소드를 발견한 경우에 사용할 수 있는 방법이다.


일반적인 경우에는 그대로 디컴파일러를 사용해서 코드를 추적해나가야할 것이다.


이 경우, 결론부터 말하자면 Act의 서브 클래스인 AI_Meditate가 Chara의 ai에 할당되고, 


AI_Meditate가 상속하고 있는 Tick(); Run(); 등의 메소드가 실행되며 CanSleep();이 있는 곳까지 도달한다.


한편 나는 이 예제에서 디컴파일러로 dotpeek을 사용했다. 그러나 간혹 Unity Explorer에 정의된 클래스나 메소드가 안 보일 수 있다. 


그 경우, dotpeek 상단 메뉴의 Tools를 클릭한 뒤, Options - Decomplier - Show Complier-generated Code 를 하면 그 클래스나 메소드를 확인할 수 있다.


Unity Explorer가 매우 강력하기 떄문에, 언제라도 코드 분석이 막히면 Object Explorer나 Hook을 적극적으로 사용하여 목적을 달성하자.



6. 패치 계획.


이제 우리는 여기서 계획을 세울 수 있다.


CanSleep(); 이 호출되어야만 Sleep(); 메소드가 실행된다는 것을 우리는 안다.


그런데 CanSleep(); 이 실행될 당시에 Chara의 ai 필드에 AI_Medidate가 들어와있네?


그러면 Chara의 ai에 AI_Meditate가 들어와있는 상태에서 CanSleep();이 호출된다면, false를 반환하게 만들면 되지 않을까?


리는 이 동작을 구현하기 위해, 이제부터 Harmony를 이용해 코드를 작성해야 한다.


하지만 내용이 길어졌고, 더 글을 쓰기에는 목이 아파서 다음에 계속한다...

추천 비추천

14

고정닉 3

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 어떤 상황이 와도 가족 안 굶길 것 같은 생활력 강해 보이는 스타는? 운영자 25/03/24 - -
AD 트릭컬 1.5th Anniv 신규 교주님 절찬 모집 중 운영자 25/03/20 - -
488736 ㅇㄹ)귀환스킬때매 마법무한 모드 깔았다 [4] 로갤러(116.35) 02.13 217 1
488734 ㄷㅈ) 콰즈랄은 리워크 안해주나... [5] 로갤러(59.26) 02.13 155 2
488733 ㄷㅈ) 감그니션만으로 지구랏 돌수있음? [4] ㅇㅇ(59.3) 02.13 151 0
488732 ㅇㄹ) 역도 아니긴 한데 이정도면 됐다 올해 소원끝 Aleph0갤로그로 이동합니다. 02.13 224 1
488731 돌죽,스압) AtFi 우지안 올룬클 했다! [9] ㅇㅇ갤로그로 이동합니다. 02.13 453 9
488730 ㄷㅈ) 흔치 않은 기회니 루고누 배교 실험 해봤삼 [5] heki갤로그로 이동합니다. 02.13 259 6
488729 ㄷㅈ) 진짜 '만신'전 테마 [9] heki갤로그로 이동합니다. 02.13 767 16
488728 ㅇㄹ) 마침내 29 떴따 [10] Aleph0갤로그로 이동합니다. 02.13 203 1
488727 ㅇㄹ) 오늘은 강아지 구출했다 [4] 로갤러(39.116) 02.13 159 1
488726 ㅋㅌㅋㅂㅂ)혹시 모드 하나만 찾아줄래..? [3] 로갤러(1.248) 02.13 229 0
488725 ㅇㄹ) 보물지도 찾아서나오는 상자 퀄리티는 뭘 따라가는지 정확히 모르겠네 로갤러(128.179) 02.13 116 0
488724 ㅇㄹ) 카벙클 말고 뭐 타지 [17] 로갤러(58.235) 02.13 279 0
488723 ㄷㅈ) 올그랩 지팡이 특수지형 [5] 로갤러(175.207) 02.13 165 2
488722 엘린)성장기간이 하루인 작물 신기하네ㅋㅋ [3] 3분컷갤로그로 이동합니다. 02.13 251 0
488721 ㅇㄹ) 케틀 복제 얼마나 걸림? [3] ㅇㅇ(39.112) 02.12 169 0
488720 ㅇㄹ) 91시간 했는데 제대로 아는 게 하나도 없다 [6] ㅇㅇ(112.157) 02.12 184 0
488719 엘린)텐트안에서는 위임농업안되는거 맞지? [3] 3분컷갤로그로 이동합니다. 02.12 150 0
488718 ㅇㄹ)고독한 영혼 효과 쓰면서 동료 여럿 데리고 다닐수있는 방법 [3] Lasshole갤로그로 이동합니다. 02.12 220 0
488716 ㅇㄹ) 맨첨에 주는 소녀 왜 대화할때마다 호감도가 떡락하는거임 [3] ㅇㅇ갤로그로 이동합니다. 02.12 185 0
488715 ㅇㄹ) 자꾸 적당충할까 고민되네 [10] Aleph0갤로그로 이동합니다. 02.12 176 0
488713 ㅇㄹ) 도메인이란게 정확히 머임 [4] ㅇㅇ(116.35) 02.12 146 0
488711 ㅇㄹ)제작할때 재료 품질 영향 안받는 템 뭐뭐있냐 [1] Lasshole갤로그로 이동합니다. 02.12 166 0
488710 ㅇㄹ) 관광 마을만드는 요령이 [4] ㅇㅇ(116.35) 02.12 209 0
488709 ㅇㄹ) 마을이쁜건 오르비나 인듯 [2] ㅇㅇ(116.35) 02.12 151 0
488708 ㄷㅈ) 루-래곤펀치 올룬 [3] ㅇㅇ갤로그로 이동합니다. 02.12 188 2
488706 ㅇㄹ) 에헤카틀 믿으니까 무기주네 [16] Tree_Leaf갤로그로 이동합니다. 02.12 269 1
488705 ㅇㄹ) 농부는 그냥 농사&원예 고정이라 많이 쓰이는 거지? [2] ㅇㅇ갤로그로 이동합니다. 02.12 183 0
488704 ㅇㄹ) 날것망치 잘나오는게 저렙네피아임? [6] 로갤러(218.233) 02.12 167 0
488699 ㅇㄹ) 오 미친 [1] 로갤러(218.233) 02.12 192 4
488697 ㅇㄹ) 들판은 농업용 베뭐시기는 관광용이겠지? [6] 로갤러(116.35) 02.12 160 0
488696 ㅇㄹ) 뉴비 알깐동료랑 일반동료 질문있음 [9] ㅇㅇ(39.124) 02.12 203 0
488692 ㄷㅈ) 미친 형제 [4] 피-쓰갤로그로 이동합니다. 02.12 190 2
488691 ㄷㅈ)인생 [2] 로갤러(175.120) 02.12 113 4
488688 ㅇㄹ)지금 족버그있네 [4] 정신병원갤로그로 이동합니다. 02.12 178 1
488685 ㄷㅈ) 로망의 포미시드 체이 활 + 방패 올룬~ [3] 로갤러(175.193) 02.12 169 6
488684 ㄷㅈ 태엽벌 질문 [5] 로갤러(121.125) 02.12 128 0
488682 ㅇㄹ) 들판부터 베르니스까지 싹 다 농장 삼아도 되나? [2] ㅇㅇ(112.157) 02.12 187 0
488681 ㅇㄹ)카지노 농구 매크로와 슬롯 매크로의 장단점 [12] Lasshole갤로그로 이동합니다. 02.12 297 0
488679 ㅇㄹ) 사도 2명 밖에 못데리고 다니는구나 ㅅㅂ [1] 로갤러(211.49) 02.12 226 0
488678 ㅇㄹ) 작은배 아주 개지랄났네 [4] 로갤러(116.35) 02.12 242 1
488677 ㄷㅈ) 방해도 정리해놓은 갤럼이 만든 사이트 있지 않았나 [2] 로갤러(210.57) 02.12 122 0
488676 ㄷㅈ)RC 질문 [5] 로그같은갤로그로 이동합니다. 02.12 96 0
488674 ㅇㄹ) 2/11~ 12일 패치 내역 [3] ㅇㅇ(119.201) 02.12 510 10
488673 돌죽 고정아티 왕의 침대 내줄때 됐다. [3] ㅇㅇ(118.235) 02.12 129 0
488672 엘린)나조야 고맙다... [1] 3분컷갤로그로 이동합니다. 02.12 159 1
488671 ㅇㄹ) 농구 결과 [1] ㅇㅇ(119.201) 02.12 132 0
488670 ㅇㄹ) 아니 동료 광견병걸린것같은데?;; 걍 시비존나걸고다님 [2] 로갤러(58.143) 02.12 150 0
488669 ㅇㄹ)나도 카지노 농구 메크로씀 [6] ㅇㅇ(119.201) 02.12 188 1
488668 ㅇㄹ) 하다 보니 어째선지 지뢰견이 날 따라다니는데 [8] ㅇㅇ(112.157) 02.12 152 0
488667 ㅌㅈ)파괴된던전 막 하면 안되는거 120시간만에 깨달음 [3] 로갤러(112.155) 02.12 149 0
뉴스 영화 ‘소방관’ 팀, 바이포엠과 산불 피해 구호성금 1억 기부 [공식] 디시트렌드 03.26
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2