디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅇㅇ갤로그로 이동합니다. 2025.01.17 23:29:22
조회 109 추천 10 댓글 3


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를 이용해 코드를 작성해야 한다.


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

추천 비추천

10

고정닉 3

0

댓글 영역

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

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 연예인 말고 매니저 했어도 잘했을 것 같은 계획형 스타는? 운영자 25/01/13 - -
484464 ㅇㄹ)아 코인 모으는것도 빡세네 ㄷㄷ ㅇㅇ(222.234) 01.18 81 0
484463 돌죽 도움 [5] 로갤러(211.241) 01.18 127 0
484462 ㄷㅈ) 약간 아쉬운 링 [1] 로갤러(175.193) 01.18 120 1
484461 ㅇㄹ) 이거 농사 자동위임 질문 [3] 망고치즈스틱갤로그로 이동합니다. 01.18 137 0
484460 ㅁ친 상자에 뭐 넣을때 [3] 로갤러(221.147) 01.18 112 0
484459 ㅇㄹ)실버벨 시체는 금속조각임? [7] 캐피노갤로그로 이동합니다. 01.18 140 0
484458 사도들 몬스터볼로 포획 마려운데 로갤러(121.165) 01.18 62 0
484457 도움 로갤러(211.241) 01.18 59 0
484456 엘린)물 생성 취미 목욕말곤 없어? [6] 로갤러(104.28) 01.18 168 0
484455 ㅇㄹ 아 상급모험자 실수로 두개샀다 [1] 코사크갤로그로 이동합니다. 01.18 121 0
484454 ㅇㄹ) 영지에서 만든 건물 통채로 옮기는건 못하나? [2] 로갤러(116.42) 01.18 88 0
484453 뉴빈데 제일 추천해주고싶은 로그라이크 추천좀 해주라 [6] 로갤러(61.253) 01.18 138 0
484452 ㅇㄹ) 명성따라 네피아 스케일링이면 세금관리는 [3] 로갤러(211.168) 01.18 94 0
484451 엘린이 스위치로 하면 딱 좋은 게임인데 [9] ㅇㅇ(211.180) 01.18 169 0
484450 ㅇㄹ) 특별한 효과가 있는 장비들을 모아보고 싶음 [2] 로갤러(175.117) 01.18 94 0
484449 오렌 3마넌 모았는데 머함? [3] 로갤러(121.165) 01.18 74 0
484448 ㅇㄹ) 마을 주민 레벨업 [3] 로갤러(121.157) 01.18 95 0
484447 ㅇㄹ)상급 모험가 라이센스 샀는데 [6] 로갤러(175.204) 01.18 96 0
484446 ㅇㄹ)상인길드 질문 [3] 로갤러(49.175) 01.18 81 0
484445 ㄷㅈ) DCSS에서 내 옛날 계정 정보는 살아있네 [1] 독수갤로그로 이동합니다. 01.18 74 1
484444 ㅇㄹ)서큐버스 피아니스트 4층 던전을 못넘기겠는데 [19] 프리야갤로그로 이동합니다. 01.17 175 0
ㅇㄹ) 명상 시에 자지 않는 모드를 만들어보자. 2 [3] ㅇㅇ갤로그로 이동합니다. 01.17 109 10
484442 ㅇㄹ) 메탈의 기억 뭐임? 이거 달면 동료 실버벨 2 만들 수 있는 거냐 [5] 로갤러(121.157) 01.17 140 0
484441 ㅇㄹ) 뭐 어쩌라는거임 이건ㅋㅋ [4] 로갤러(175.117) 01.17 159 1
484440 NPC들 술 어케 먹이지 [3] 시베리아다람쥐갤로그로 이동합니다. 01.17 122 0
484439 ㅇㄹ)보석 만드는 법도 있음?? [4] 로갤러(211.60) 01.17 113 0
484438 ㅇㄹ) 펫 안싸우게 하는법 없음? [9] 로갤러(211.105) 01.17 118 0
484437 ㅇㄹ) 명상 시에 자지 않는 모드를 만들어보자. 1 [6] ㅇㅇ갤로그로 이동합니다. 01.17 306 10
484436 ㅇㄹ) 이거 다행인거 맞음? ㅋㅋㅋ [2] ㅇㅇ갤로그로 이동합니다. 01.17 208 1
484435 ㅇㄹ)열심히 농사중인데 ㅇㅇ(222.234) 01.17 59 0
484434 ㅇㄹ) 농사 첨 지어볼라는데 돈벌려면 머심어야되나요 [3] 로갤러(1.246) 01.17 117 0
484433 ㅇㄹ) 마을사람들이 자꾸 돌던지고 수근거리는데 [9] ㅇㅇ(112.163) 01.17 211 0
484432 ㅇㄹ) 적외선 포션 효과 뭐임? [4] 로갤러(1.246) 01.17 115 0
484431 ㅇㄹ)뭐여 엘린 창작마당 왜이래 [2] ㅇㅇ(222.234) 01.17 201 0
484430 ㅇㄹ 웬만하면 모드 안깔고 걍 하려 했는데 로갤러(121.165) 01.17 120 0
484429 ㅇㄹ) 금괴로 사야되는 템(계획서, 레시피) 중에 중요한 거 있음? [7] 로갤러(1.246) 01.17 153 0
484427 맨날 녹픽던만 하다가 엘린하니까 넘모 재밌다 죤슨갤로그로 이동합니다. 01.17 79 0
484426 ㄷㅈ 룩 오류 뭐노 [1] 로갤러(223.39) 01.17 98 1
484425 ㅇㄹ) 모니터는 어디서 구함? [7] ㅇㅇ(180.71) 01.17 126 0
484424 ㅇㄹ)오늘자 나이틀리도 10시쯤에 뜰까 ㅇㅇ(211.114) 01.17 64 0
484423 ㅇㄹ)코르곤 어캐 죽이냐 [6] ㅁㅇㅋ갤로그로 이동합니다. 01.17 149 0
484422 ㅇㄹ) 동료가 가끔 옷벗는 버그 있는거 같은데 [6] 로갤러(59.6) 01.17 136 0
484421 ㅇㄹ)지금 신성속성 공격하는 몬스터 있음? [6] ㅇㅇ(59.28) 01.17 121 0
484420 ㅇㄹ)다크매터망치 콘솔로 소환된다던데 장비다바르면 뭔효과지 [5] Lasshole갤로그로 이동합니다. 01.17 128 0
484419 ㅇㄹ) 주민들 음식 못꺼내먹게 못함? [2] 로갤러(1.234) 01.17 145 0
484418 ㅇㄹ) 낚시 자동으로 계속하는거랑 잡은거 자동습득 있지않았나? [3] 로갤러(210.181) 01.17 89 0
484417 파토스 NPC그냥 보자마자 쳐 죽여도 되나 [4] 로갤러(211.250) 01.17 89 0
484416 ㅇㄹ)레일건에는 명중보정 아예 안붙음? ㅇㅇ(223.39) 01.17 41 0
484415 ㅇㄹ)영혼의 천 망치는 스피드링에 박는게 제일 나을려나? [2] 로갤러(114.199) 01.17 107 0
484414 연주 100렙 찍는거면 [7] 로갤러(112.219) 01.17 109 0
뉴스 “팬들 실망하든지 말든지”… JK김동욱, 정치적 발언 여전 디시트렌드 01.17
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2