디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅇㅇ갤로그로 이동합니다. 2025.01.17 23:29:22
조회 303 추천 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/04/07 - -
492196 노래검이 유통기한 얼마까지 되더라? [5] ㅇㅇ(211.36) 03.12 171 0
492195 너무 아깝군... [2] xom(122.38) 03.12 119 1
492194 ㄷㅈ)진짜 왜이러니 [9] 모야니갤로그로 이동합니다. 03.12 185 2
492192 로붕이들아 돌죽 직업 조합 좀 추천해다오 [7] ㅇㅇ(210.223) 03.12 115 0
492191 돌죽 옛날 버전 추천 좀 [10] 민달팽2갤로그로 이동합니다. 03.12 162 0
492190 ㅇㄹ) 뉴비 질문 드려요 [6] 로갤러(211.205) 03.12 186 0
492189 oof한테 사일이나 디스코드 먹히나요? [2] 로갤러(168.131) 03.12 69 0
492188 엘린 지금 할만 함? [1] 로갤러(121.136) 03.12 182 0
492187 ㄷㅈ) 법사 재밌네 [7] 로갤러(116.43) 03.12 148 1
492186 돌죽 생각하면 좀 신기하네 [6] ㅁㄴㅇㄹ(211.180) 03.12 162 0
492185 아셴질문 [7] 로갤러(118.220) 03.12 101 0
492184 ㅌㅈ 아노리실 월광방패 주웠는데 [2] 공하싫갤로그로 이동합니다. 03.12 92 0
492183 썬팔은 계수조정좀하고 썬클락/프로비던스 즉발버프로 바꿔야함 [5] 가이우스(172.56) 03.12 95 0
492182 요즘 돌죽에는 손이 안가는 이유가 뭘까 [13] ㅇㅇ갤로그로 이동합니다. 03.12 242 2
492176 ㄷㅈ)법사는 뭘로 시작하면 좋을까 [5] ㅇㅇ(58.29) 03.12 111 0
492159 썬팔 걍 지팡이 프록전사로 키우면 쉽고 편하지않나 [5] ㅇㅇ갤로그로 이동합니다. 03.12 99 0
492138 ㅋㅌㅋ) dda 기술역량들 중에 무기관련 같은건 뭐가 좋은거임? [4] 로갤러(1.228) 03.12 111 0
492131 ㄷㅈ)모바일 질문 [1] ㅇㅇ갤로그로 이동합니다. 03.12 119 0
492128 ㅌㅈ) 선팔라딘 첫보스에서 반사룬 뜨니까 나름 재밌네 [1] 로갤러(49.142) 03.12 101 0
492126 ㄷㅈ) -cast 효과가 *silence로 대체 ㄷㄷ [19] heki갤로그로 이동합니다. 03.11 812 11
492123 ㅌㅈ) 스펠프록 옵션 랜다트로도 나오는구나 [2] 공하싫갤로그로 이동합니다. 03.11 84 0
492120 ㅇㄹ) 가끔 택배에 상인 튀어나올때 있는데 [2] 로갤러(1.243) 03.11 180 0
492114 ㅌㅈ) 사기캐 연속으로 하다 갑자기 똥캐하니 역체감 심하네 [8] 로갤러(49.142) 03.11 156 0
492110 ㅇㄹ) 추가납세 했는데 금괴 안들어옴.. [2] 로갤러(58.122) 03.11 182 0
492108 돌죽)놀림코드(신형) [5] 와그너스갤로그로 이동합니다. 03.11 210 6
492106 둠드 3프로디지 시즌에 하면 재밌음 LF.갤로그로 이동합니다. 03.11 71 0
492105 ㄷㅈ) 그리운 느낌이 나는 레후 로갤러(58.77) 03.11 107 2
492100 ㅇㄹ)DV <- 살육때매 사실상 없는 능력치긴함 Lasshole갤로그로 이동합니다. 03.11 251 0
492097 ㅇㄹ) DV수치 의미 크게 없음? [2] ㅇㅇ(116.39) 03.11 235 0
492096 ㅌㅈ) 둠드 세긴한데 진짜 불편하긴해 [1] ㅇㅇ갤로그로 이동합니다. 03.11 102 0
492095 ㄷㅈ) 님들 유독 자주 보는 픽다트 있음? [5] 모야니갤로그로 이동합니다. 03.11 152 0
492094 카타클 밝밤 많이 바뀜? [3] ㅇㅇ(180.71) 03.11 186 0
492093 ㅌㅈ)점액<<얘 에이얄진노트리 20렙에 열어야함? [5] ㅇㅇ(211.234) 03.11 111 0
492092 ㄷㅈ)1층 획줌 뭐 고를까 [11] ㅇㅇ(211.36) 03.11 160 0
492091 ㄷㅈ) 폴터가이스트 냉법인데 좆됨 [3] ㅇㅇ(118.235) 03.11 139 2
492090 ㅇㄹ)겨울이라고 알림오는거 어떻게 끔? [3] 로갤러(1.243) 03.11 143 0
492089 돌죽)이레데폴터 6룬클 [6] 와그너스갤로그로 이동합니다. 03.11 145 3
492088 ㅇㄹ) 이제 막 명성 6천 뚫었는데 [5] 로갤러(175.118) 03.11 228 0
492087 돌죽 마법 ㅈㄴ 안나오네 [2] xom(122.38) 03.11 112 0
492086 ㄷㅈ) 창이 계륵이네 [1] 로갤러(39.116) 03.11 115 0
492085 ㅌㅈ)둠드단에 합류하라 [2] 로갤러(175.211) 03.11 93 2
492084 돌죽)오늘은 불스아이 버프됐네. [2] 와그너스갤로그로 이동합니다. 03.11 132 1
492083 내 몸에는 위대한 노르드의 피가 흐른다 [1] 야만용자(223.39) 03.11 103 0
492082 근데 무한목숨 옵션 있는건 한번은 쓰고서 다깨보는것도 좋음 ssh0818갤로그로 이동합니다. 03.11 81 0
492081 ㅌㅈ) 인세인이 더 재밌긴한데 [9] 공하싫갤로그로 이동합니다. 03.11 169 0
492080 엘린인가 지금 살만함? [5] ㅇㅇ(223.39) 03.11 303 0
492079 ㅇㄹ) 쓰레기 자꾸 쳐버리는거 어떻게 못함? [4] 로갤러(1.243) 03.11 251 0
492078 ㅌㅈ) 파괴된 던전 머임..? [8] ㅇㅇ갤로그로 이동합니다. 03.11 211 0
492077 로그라이크 추천해달라는 글 삭제했노 [8] ㅇㅇ(125.140) 03.11 334 1
492076 던전 크롤 머하는겜이야 [14] ㅇㅇ갤로그로 이동합니다. 03.11 250 0
뉴스 제니, 또 ‘역대급 노출’ 화보 공개했다…LA 이후 한달만 디시트렌드 04.08
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2