디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅇㅇ갤로그로 이동합니다. 2025.01.17 23:29:22
조회 318 추천 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/05/12 - -
493725 ㅇㄹ)이상하게 아무리 운반능력이 올라도 늘 과적뜨는가 했더니... [3] 로갤러(218.237) 04.03 209 1
493724 에리카는 왜 무너가 된거고 왜 코볼트들이랑 같이 다니는가 [4] xom(122.38) 04.03 153 2
493723 ㅇㄹ)종이로 보관품 무게 줄이는거 뭐까지 적용되는거임? [7] 로갤러(218.237) 04.03 138 0
493722 돌품)글레이브가 마전사 하래 ㅇㅇ(211.36) 04.03 95 1
493721 ㅋㅌㅋ특 머방이갤로그로 이동합니다. 04.03 94 0
493719 엘린)귀여워서 팬아트 그림 [9] chansko갤로그로 이동합니다. 04.03 1089 27
493718 ㅇㄹ)파르페팔이소년 [1] Ami(1.242) 04.03 188 0
493717 ㅇㄹ)스쿠츠 내려가기 존나 귀찮다 [2] Lasshole갤로그로 이동합니다. 04.03 172 0
493715 ㅇㄹ) 샵인챈트모드에서 타락+ 기적/신기 이렇게 조합해서 찾을순없는건가 ㅇㅇ갤로그로 이동합니다. 04.03 118 0
493713 ㄷㅈ) 산성 볼트도 엄청 세네 [2] 로갤러(175.193) 04.03 152 0
493712 톰죽) 투영쓰는 정신유아론자 포텐좀있는거같은데 [8] 가이우스(172.56) 04.03 176 0
493711 로스트랜드 vs PPB vs 실크송 ㅇㅇ(211.197) 04.03 98 0
493710 ㅋㅌㅋㅂㅂ) 안드로이드 버전 파일 어떻게 열음 [4] 로갤러(1.234) 04.02 112 0
493709 톰죽 마법안쓰면 못함? [5] null;갤로그로 이동합니다. 04.02 127 0
493708 0.32로 구울 해보려는데 [2] 로갤러(222.235) 04.02 99 0
493707 뭐야 로스트랜드보다 실크송이 빨랐는데 ssh0818갤로그로 이동합니다. 04.02 89 0
493705 ㄷㅈ) 네크로폴리스 너무 꼬운데 [4] 로갤러(218.147) 04.02 167 2
493704 밝밤 전기 헬기 얼추 만들었다 [3] 불건전유니갤로그로 이동합니다. 04.02 106 1
493703 다크갓 진짜 뒤짐? [1] 로갤러(221.166) 04.02 103 0
493702 엘린 날것망치 찾다가 포기함 시발 [4] Khelerd갤로그로 이동합니다. 04.02 199 0
493701 ㅇㄹ) 무녀 유전자에 저주장비 경험치 [3] ㅇㅇ갤로그로 이동합니다. 04.02 117 0
493700 ㄷㅈ] 쉐이프쉬프터 처음봄 ㄷㄷㄷㄷ [1] ㅇㅇ(182.220) 04.02 153 0
493699 갑자기 카타클 마려워져서 왔는데 [3] 예성회관갤로그로 이동합니다. 04.02 146 0
493698 ㄷㅈ) 디스 섀터 없으면 주로 뭘로밈? [3] ㅇㅇ(112.169) 04.02 114 0
493697 질문) ㅋㅌㅋㅂㅂ 사이드바 로그 늘리고 싶은데 방법 없나 로갤러(110.15) 04.02 82 0
493696 ㄷㅈ] 컨트롤 에프로 아이템 찾았는데 이거 뭐임 [6] ㅇㅇ(182.220) 04.02 138 0
493695 돌죽)망한 신전 테마 특수지형 생겼네 [1] 와그너스갤로그로 이동합니다. 04.02 133 0
493694 톰죽 글 많길래 뭐지했는데 로갤러(36.38) 04.02 158 1
493693 ㅋㅌㅋㅂㅂ이거 뭔 버?그냐 [7] 머방이갤로그로 이동합니다. 04.02 143 0
493691 ㅇㄹ) 금속장비는 어떻게 만들어? [7] ㅇㅇ(222.113) 04.02 158 1
493690 ㄷㅈ) 방금 주운 석좆 개쩖 ㄷㄷ;; [4] ㅇㅇ(115.136) 04.02 183 1
493689 ㄷㅈ) 중갑 마전사 진로 좀 봐줄래? [12] ㅇㅇ(211.36) 04.02 142 0
493688 ㄷㅈ) CCA 세부 번역 참고하실 분들 참고하새요! [5] 기여워하치와레갤로그로 이동합니다. 04.02 350 9
493687 근데 톰죽은 뭔 재미로 하는 거임? [14] ㅇㅇ갤로그로 이동합니다. 04.02 268 3
493686 ㄷㅍ) 아이스크림 먹는 드워프 [2] 로갤러(58.29) 04.02 184 0
493685 메이드카페 가서 있었던 일들인데 메이드가 나 좋아하는 신호임? 매구이료갤로그로 이동합니다. 04.02 96 0
493684 코글린으로 마제스티 끼면 어케되는지 암? [2] ㅇㅇ갤로그로 이동합니다. 04.02 126 1
493683 ㅇㄹ) 무녀 유전자 확정적으로 있는게 키누 하나임? [2] ㅇㅇ갤로그로 이동합니다. 04.02 126 0
493682 아시발 밝밤 병신짓함 불건전유니갤로그로 이동합니다. 04.02 115 0
493681 톰죽 유연전투 리버도 존나 세긴할거같은데 [1] ㅇㅇ갤로그로 이동합니다. 04.02 78 0
493680 ㄷㅈ) CCA 메인페이지만 번역해봄 [5] 로갤러(175.193) 04.02 278 6
493679 ㄷㅈ) 5스트릭 찍었슴 [11] heki갤로그로 이동합니다. 04.02 417 10
493678 ㄷㅈ)만우절 모자도 있네 [3] 일십백갤로그로 이동합니다. 04.02 160 2
493677 이런 대사가 되게 감성있지 않음? 매구이료갤로그로 이동합니다. 04.02 115 0
493676 ㄷㅈ) ???? [3] ㅇㅇ(211.114) 04.02 117 0
493675 질문) 파토스 어케 깨라는거임? [4] 로갤러(211.198) 04.02 110 0
493674 0.33에서 추가슬롯템이 많이추가됐네 [2] ㅇㅇ갤로그로 이동합니다. 04.02 111 0
493673 ㄷㅈ)뭐 고르지 [2] ㅇㅇ(211.36) 04.02 107 0
493672 어비스에 두번이나 던져지네 [3] xom(122.38) 04.02 100 1
493670 ㄷㅈ) 올룬클 ~ 가고일 forgewright [4] 로갤러(175.193) 04.02 147 3
뉴스 ‘日 이민설’ 돌던 이국주, 한국 왔다…‘9평 원룸’→‘5성 호텔’ 디시트렌드 05.13
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2