디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅇㅇ갤로그로 이동합니다. 2025.01.17 23:29:22
조회 262 추천 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/02/10 - -
공지 로그라이크 갤러리 이용 안내 [56] 운영자 16.04.08 86993 24
488648 ㅇㄹ) 에우레카 PCC 도트.gif [1] K컵스속옷수사대갤로그로 이동합니다. 09:10 35 1
488647 톰죽) 팅커 밸류가 그냥 넘사벽이라 이거놓치면 리셋해야지 가이우스(172.56) 09:02 16 0
488646 ㅌㅈ) 에스코트 발명가 죽으면 보통 어떻게 함? [4] 로갤러(116.121) 08:01 35 0
488645 ㄷㅈ) 짱룡 도트 왜케 귀여움 피-쓰갤로그로 이동합니다. 07:35 61 1
488644 ㅇㄹ) 아니 갑자기 동료?파티원?이 다른 마을npc들을 개깡패처럼 죽임 [1] 로갤러(58.143) 07:24 47 0
488643 ㅌㅈ)근데 ~~력은 딜올려주면서 ~~내성은 왜 딜 안낮춰줌? [8] ssh0818갤로그로 이동합니다. 06:36 66 0
488642 ㄷㅈ)오랜만에 하니까 판단 개쓰레기네 [2] ssh0818갤로그로 이동합니다. 06:09 45 0
488641 ㄷㅈ) 누비 미노전사 무덤에서 죽음.. [10] ㅇㅇ갤로그로 이동합니다. 05:30 70 1
488640 톰죽) 하이어 하이써마 번개맨재밌음 UR가루30개만주십시오갤로그로 이동합니다. 05:02 27 0
488639 로스트랜드는 얼마나 갓으로낼려고 이리늦는지 [3] V제너레이트갤로그로 이동합니다. 04:59 55 0
488637 ㄷㅈ)난 개미 아직도 운용 어떻게 해야하는지 모르겠던데 [5] ssh0818갤로그로 이동합니다. 04:34 56 0
488632 ㄷㅈ) 데몬스폰 매니폴드석좆 올룬 [1] 로갤러(211.200) 03:43 48 2
488618 ㅌㅈ) 인세인 ‘면상궁’ 딜탱 스켈 아처 클리어 [1] future갤로그로 이동합니다. 02:31 77 4
488617 ㅇㄹ)규사의 망치 이거 어따 씀? [2] ㅇㅇ갤로그로 이동합니다. 02:27 88 0
488611 ㄷㅈ) 체이 회피전사는 갑옷 방해수치 [6] ㅇㅇ(59.3) 01:29 80 0
488609 김유식 광고좀 없에라고 이놈의 로갤은 정갤이여서 [1] ssh0818갤로그로 이동합니다. 01:25 77 1
488607 ㅇㄹ)씨발 가방이랑 장비 왜 한번씩 사라짐? [4] 로갤러(123.109) 01:22 113 0
488604 엘린)에테르병중에 중력변화는 뭐야?? [4] 3분컷갤로그로 이동합니다. 01:10 93 0
488603 내일은 톰죽을 사서 조져볼거야 [2] ㅇㅇ갤로그로 이동합니다. 01:05 48 0
488600 엘린 업뎃 많이했음? 로갤러(113.131) 00:56 72 0
488595 ㅇㄹ) 이번 나이틀리 업데이트 진짜 못참겠네 [2] 로갤러(128.179) 00:34 139 1
488590 돌죽 마진보오에 에너지 오브 15룬 지구랏까지 문제 없지? [1] ㅁㄴㅇㄹ(211.226) 02.11 54 0
488589 ㅌㅈ) top10 킬러에 이건 머임? [2] ㅇㅇ(211.235) 02.11 77 0
488588 ㄷㅈ) 섭던, 볼트, 무덤 돌떄가 제일 재밌는듯 [2] ㅇㅇ갤로그로 이동합니다. 02.11 75 1
488587 ㄷㅈ) 애요ㅛㅛㅛㅛㅛㅛㅛㅛㅛㅛ용 용냥이가 울부짖었따 [3] ㅇㅇ갤로그로 이동합니다. 02.11 65 3
488586 ㅇㄹ)아 뭐야 동료 도축하면 끼고있던 장비 다 증발하네 [1] ㅇㅇ(223.39) 02.11 104 0
488585 ㅇㄹ) 카벙클 알 키우려는데 질문점 [5] 로갤러(218.233) 02.11 89 0
488584 ㄷㅈ) 용냥이 지구랏 돌수 있을까요? [3] ㅇㅇ갤로그로 이동합니다. 02.11 72 0
488581 ㅇㄹ)노출증 치녀신 팩션 성능 뭔데;; 기울어진천장갤로그로 이동합니다. 02.11 172 0
488579 ㄷㅈ) damnation 넘모 무섭다. . [7] 로갤러(175.193) 02.11 82 0
488578 ㅇㄹ)슈퍼푸드는 아니지만 [5] 기울어진천장갤로그로 이동합니다. 02.11 114 0
488577 ㅇㄹ) 승마, 기생, 온천, 소매치기 [4] 로갤러(58.29) 02.11 148 1
488576 ㅋㅌㅋㅂㅂ) 한글로 번역된 모드들 받는 곳 없음? [1] 로갤러(116.127) 02.11 42 0
488575 톰4 다크 크립트 비교적 쉽게 도는 방법 [1] LF.갤로그로 이동합니다. 02.11 52 1
488574 ㅇㄹ) 결혼목걸이 만드는법 알았다 다뒤졋다 ㅇㅇ(39.7) 02.11 72 0
488573 ㅇㄹ) 네피아에서 인벤토리 부족할때 소소팁 [5] ㅇㅇ갤로그로 이동합니다. 02.11 184 10
488572 ㅇㄹ 권장 사양 높음? [6] 헤으갤로그로 이동합니다. 02.11 170 0
488571 ㄷㅈ) 미노타만 하다가 가고일하니까 ㅈㄴ 힘드네 [3] 헤으갤로그로 이동합니다. 02.11 90 0
488570 ㅇㄹ)이거 알이랑 우유에는 + 못 붙이지? [3] ㅇㅇ(39.124) 02.11 95 0
488569 ㅇㄹ) 깃털 주문서 누가 잘 팔아?? [4] ㅇㅇ(39.112) 02.11 100 0
488568 ㅇㄹ) ㅅㅂ ㅋㅋ 발전기 비맞으면 쇼트나네 [3] 로갤러(211.49) 02.11 146 1
488567 ㅇㄹ) 냉장고는 인벤에 넣고 다닐 방법 없음? [5] ㅇㅇ(39.112) 02.11 96 0
488566 ㄷㅈ) 위대한 용냥이까지 10걸음! [1] ㅇㅇ갤로그로 이동합니다. 02.11 61 0
488565 엘린하고 하데스 둘다 해본사람? [5] ㅇㅇ(125.140) 02.11 95 0
488564 ㄷㅈ) 난 알더킹 이새끼가 제일 악질같음 [7] heki갤로그로 이동합니다. 02.11 117 1
488563 ㄷㅈ) will 3칸인데 왜 추방 당하냐 [4] ㅇㅇ갤로그로 이동합니다. 02.11 74 0
488562 돌죽 아무리 기괴 강한 몹이라도 대처할 수 있었던게 우리에게 있었었다 [3] ㅇㅇ(221.145) 02.11 115 0
488560 ㄷㅈ) 다 한 사람이라매? [7] 눈띄유갤로그로 이동합니다. 02.11 152 1
488559 ㅇㄹ) 악기연주퀘 사람 두배씩 더나오는 모드 같은건 없냐 [1] 로갤러(116.35) 02.11 59 0
뉴스 지진희, 입양된 줄 알았는데…뒤늦게 ‘친자 확인’ 디시트렌드 02.11
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2