디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅇㅇ갤로그로 이동합니다. 2025.01.17 23:29:22
조회 314 추천 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/28 - -
494720 좀 당연하다면 당연한 이야기긴 한데 [2] ㅇㅇ갤로그로 이동합니다. 04.23 171 1
494719 ㄷㅈ) 아쉔자리 스킬 부스트 설명 읽고 있는데 [4] ㅇㅇ갤로그로 이동합니다. 04.23 127 1
494718 무너 플럭스폼도 스프라이트 추가됐네 [1] 일십백갤로그로 이동합니다. 04.23 113 4
494717 ㅇㄹ) partytalk 모드 한글 덮어씌우면 되는데 [2] ㅇㅇ(211.210) 04.23 139 1
494716 메두사폼은 장비칸 적게먹는게 장점인듯 [4] 일십백갤로그로 이동합니다. 04.23 138 0
494715 ㅇㄹ) 루미너스 낚시대 복사했는데 [8] 로갤러(218.237) 04.23 175 0
494714 전반연 조트방 기습 점거 들어간다!! ㅇㅇ(175.223) 04.23 71 0
494712 로붕이 자꾸 울면 루고누 할아버지가 잡아간다 [1] ㅇㅇ(1.216) 04.23 98 0
494711 ㄷㅈ)이거 마전사 각인가? [1] 로갤러(211.36) 04.23 137 0
494709 ㄷㅈ) 당분간 콰즈랄이나 믿어볼까 [9] 마요바요갤로그로 이동합니다. 04.23 137 0
494707 ㅇㄹ) 거점 컨셉질이나 해야겠다 ㅇㅇ갤로그로 이동합니다. 04.23 117 0
494706 ㄷㅈ)단축키 질문 [1] R-갤로그로 이동합니다. 04.23 107 0
494704 ㄷㅈ 반지슬롯 두개 더주는 픽다트도 있네 [4] 트로그갤로그로 이동합니다. 04.23 162 0
494703 ㄷㅈ) 씨발 [15] 마요바요갤로그로 이동합니다. 04.23 203 1
494701 ㄷㅈ) 머포크 몽크 15룬 성공 [5] ㅇㅇ(59.9) 04.23 183 9
494700 ㄷㅈ) 아쉔 저주받는 방식이 어떤건지 정확히 이해가 안되네 [2] ㅇㅇ갤로그로 이동합니다. 04.23 118 0
494699 ㅇㄹ) 아이템 감정을 어떻게 받을 수 있을까요? [5] 로갤러(110.9) 04.23 127 0
494698 카타클리즘 밝은밤) 대형마트에서 렉걸린다고 했던거 해결함 [5] Mistress갤로그로 이동합니다. 04.23 163 5
494696 ㄷㅈ) 아니 컨큐를 바꾸면 어떠캐 [2] ㅇㅇ(211.48) 04.22 155 1
494695 ㄷㅈ) 광폭화 변이 돌겠네 진짜 [10] ㅇㅇ(59.9) 04.22 171 0
494694 ㄷㅈ) 트롤변이술사 서브던전 순서 추천, 팁 좀 줘잉 [8] 마요바요갤로그로 이동합니다. 04.22 135 0
494692 ㄷㅈ 올룬하고 뒤질뻔했네 [4] 트로그갤로그로 이동합니다. 04.22 140 0
494691 디스메노스 최종 권능하니 그거 생각나네 머방이갤로그로 이동합니다. 04.22 85 0
494690 ㅂㅂ) 모딩으로 기능구현 안된다고 찡찡댈라 했는데 [9] 점화자갤로그로 이동합니다. 04.22 157 1
494689 ㄷㅈ) 5룬 이후 어떻게 함? [10] ㅇㅇ(59.9) 04.22 171 0
494688 돌죽 뭔 잡마법들이 엄청 늘었네 [2] 자연선혼갤로그로 이동합니다. 04.22 188 1
494686 ㄷㅈ) 아 사고나서 생각났네 ㅋㅋ [4] 로갤러(183.97) 04.22 191 0
494685 ㅇㄹ) 이거 흔한 템임? [3] ㅇㅇ(123.111) 04.22 226 0
494684 ㅌㅈ) 톰죽 재밌네 [6] Tree_Leaf갤로그로 이동합니다. 04.22 186 1
494683 디스메노스 최종 권능은 어떻게 쓰는 거임 [2] ㅁㄴㅇㄹ(211.180) 04.22 124 1
494682 ㄷㅈ)만신전 이렇게도 뜨네 [3] ㅇㅇ(118.91) 04.22 172 2
494681 ㅇㄹ) 근접 딜 올리는게 대미지 배율 올리는거 말고 뭐가 없는거임? [8] 레후딥의수정창갤로그로 이동합니다. 04.22 172 0
494680 동방죽 스팀출시vs 로스트랜드 뭐가 더 빠름? ㅇㅇ갤로그로 이동합니다. 04.22 95 0
494679 ㅇㄹ) 이거 뭐하는 새끼냐 [15] 로갤러(123.111) 04.22 699 9
494678 ㅌㅈ) 겜 하다가 갑자기 키 설정 안보이는거 어떻게 해결함? [5] 로갤러(182.232) 04.22 96 0
494676 ㄷㅈ)근데 왜 선신들은 언데드 차별함? [5] 롬롬갤로그로 이동합니다. 04.22 197 1
494675 ㄷㅈ) 루고누 마전사 마렵다!!!! [1] 로갤러(211.235) 04.22 82 0
494674 ㄷㅈ)명품은 아녀도 나름 괜찮네 [1] 로갤러(116.127) 04.22 144 1
494673 ㄷㅈ)진 질문 [4] 로갤러(222.235) 04.22 116 0
494672 ㅇㄹ)저주받은템 효과뭐임? [4] ㅇㅇ갤로그로 이동합니다. 04.22 152 0
494671 갠적으로 시간 많이 남으면 돌죽 포크따고싶긴 함 [2] ㅇㅇ(222.112) 04.22 159 0
494670 ㅂㅂ)두꺼운 강철판 이거 드랍은 없었나?? [4] seeu갤로그로 이동합니다. 04.22 107 0
494669 ㄷㅈ)신이름들 뜨고 배신하면 징벌중이라고 뜨는창 단축키가 뭐임? [5] 로갤러(222.235) 04.22 144 0
494668 로스트랜드 <- 뭐 나온거잇음? [5] 도시드워프갤로그로 이동합니다. 04.22 153 0
494667 돌죽 연습생한테 들어서 아는건데 ㅇㅇ(119.192) 04.22 152 0
494665 ㅌㅈ)퓨리서지 프록 빌드면 25때 머 먼저 찍는게 나음? [3] ㅇㅇ(220.90) 04.22 97 0
494661 드라코 칭호작하다가 현타오네 [3] 로갤러(222.235) 04.22 143 0
494659 카타클 원래 불난곳에서 좀 떨어지면 화재 진행이 멈춤? [7] ㅇㅇ갤로그로 이동합니다. 04.22 154 0
494656 (초안, 기술 문서) 돌죽 한국어화 - 1 [38] ASCIIPhilia갤로그로 이동합니다. 04.22 732 32
494655 ㅇㄹ)연주가 연주 스킬 말고 연주장비마다 다른가봐... [6] 익스비갤로그로 이동합니다. 04.22 192 0
뉴스 “즐겁고 상큼한 작품 되길”…‘바이러스’ 배두나·김윤석의 ‘톡소’는 로맨스 [종합] 디시트렌드 10:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2