디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅇㅇ갤로그로 이동합니다. 2025.01.17 23:29:22
조회 89 추천 9 댓글 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를 이용해 코드를 작성해야 한다.


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

추천 비추천

9

고정닉 2

0

댓글 영역

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

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 연예인 말고 매니저 했어도 잘했을 것 같은 계획형 스타는? 운영자 25/01/13 - -
공지 로그라이크 갤러리 이용 안내 [56] 운영자 16.04.08 86228 24
484491 ㅇㄹ) 활, 쇠뇌 리로드 가속 질문 로갤러(222.102) 14:00 1 0
484490 ㅇㄹ) 동료 장비 감정 어캐함? [2] 로갤러(1.246) 13:45 19 0
484489 ㅇㄹ)강제 노동기 이거 따로 패널티 없지? [4] ㅇㅇ(223.39) 13:14 43 0
484488 ㅇㄹ)주민들 계속 오크들 들어오는거에 죽는데 어캄..? [6] 로갤러(1.238) 13:05 68 0
484487 엘린) 카르마는 적당히 음수해라 [5] 으으엨갤로그로 이동합니다. 12:52 70 0
484486 ㅇㄹ) 가키 어캐 파티원으로 영입함? [5] ㅇㅇ(180.71) 12:38 70 0
484485 ㅇㄹ) npc 죠난 죽여도 살아나지? [2] ㅇㅇ(180.71) 12:27 46 0
484484 ㅇㄹ) 빈데일 에테르내성 20도 붙음? [2] ㅇㅇ(211.114) 11:51 31 0
484483 ㄷㅈ)전사로 해안가 개쉽게 터는법 알아냄 [3] 불건전유니갤로그로 이동합니다. 11:31 84 0
484482 ㅇㄹ) 포툰벨 어캐감? [4] ㅇㅇ(180.71) 11:28 66 0
484481 ㅇㄹ) 몬스터 추가 모드때문에 다 먹통이었네 로갤러(175.122) 11:05 65 0
484480 난방담요나 그 어는거 막아주는 담요는어케씀? [1] 로갤러(59.19) 10:47 44 0
484479 ㄷㅈ) 돌붕이들 혹시 부족전쟁은 알고있음? [10] 로갤러(112.160) 10:23 93 0
484478 ㅇㄹ) 텐트회수 어케하나요? [1] 로갤러(61.39) 10:16 54 0
484477 실버벨알 미쳤네 [4] 로갤러(58.234) 10:03 107 0
484476 도움!? [1] 로갤러(180.231) 09:38 38 0
484475 ㅇㄹ)쥬아 여신님의 마법이 개쩐다며 [4] ㅇㅇ갤로그로 이동합니다. 08:30 106 0
484474 ㅇㄹ 이씨빨 매력 존나안올라잇!!!!!! [7] 로갤러(121.165) 06:42 130 0
484473 ㅇㄹ) 이건 먼포션이지??? [2] 로갤러(218.237) 05:33 137 0
484472 ㅇㄹ) 동료 스킬 더 늘릴 수 있음? [3] 로갤러(211.168) 05:08 83 0
484471 ㅇㄹ) 동료 버블,덩어리 괴물도 분열될 수 있음? [4] 로갤러(211.168) 04:59 95 0
484470 ㅇㄹ) 골든 눈쁘띠 렙업시키니까 금털에 판매가 업그레이드 되네.... [2] 로갤러(121.157) 04:34 110 0
484469 엘린 굴뚝 어케 설치함? [1] ㅇㅇ(175.199) 04:05 65 0
484468 맥북으로 엘린 하는 사람 참고 프리야갤로그로 이동합니다. 03:32 91 1
484467 ㄷㅈ) 구 한섭 살아있을때 존나게하긴했구나 [1] 독수갤로그로 이동합니다. 03:24 119 1
484466 ㅇㄹ)절규스킬 정말쓸모없네... [1] ㅇㅇ(58.123) 03:22 86 0
484465 ㅇㄹ)나만 이렇게 약한거같냐 [5] ㅇㅇ갤로그로 이동합니다. 03:19 155 0
484464 ㅇㄹ)아 코인 모으는것도 빡세네 ㄷㄷ ㅇㅇ(222.234) 02:15 69 0
484463 돌죽 도움 [5] 로갤러(211.241) 02:15 122 0
484462 ㄷㅈ) 약간 아쉬운 링 [1] 로갤러(175.193) 01:59 107 1
484461 ㅇㄹ) 이거 농사 자동위임 질문 [3] 망고치즈스틱갤로그로 이동합니다. 01:44 105 0
484460 ㅁ친 상자에 뭐 넣을때 [3] 로갤러(221.147) 01:37 96 0
484459 ㅇㄹ)실버벨 시체는 금속조각임? [7] 캐피노갤로그로 이동합니다. 01:29 117 0
484458 사도들 몬스터볼로 포획 마려운데 로갤러(121.165) 01:29 57 0
484457 도움 로갤러(211.241) 01:28 56 0
484456 엘린)물 생성 취미 목욕말곤 없어? [6] 로갤러(104.28) 01:26 132 0
484455 ㅇㄹ 아 상급모험자 실수로 두개샀다 [1] 코사크갤로그로 이동합니다. 01:21 100 0
484454 ㅇㄹ) 영지에서 만든 건물 통채로 옮기는건 못하나? [2] 로갤러(116.42) 01:14 74 0
484453 뉴빈데 제일 추천해주고싶은 로그라이크 추천좀 해주라 [6] 로갤러(61.253) 00:54 119 0
484452 ㅇㄹ) 명성따라 네피아 스케일링이면 세금관리는 [3] 로갤러(211.168) 00:54 79 0
484451 엘린이 스위치로 하면 딱 좋은 게임인데 [9] ㅇㅇ(211.180) 00:53 141 0
484450 ㅇㄹ) 특별한 효과가 있는 장비들을 모아보고 싶음 [2] 로갤러(175.117) 00:45 80 0
484449 오렌 3마넌 모았는데 머함? [3] 로갤러(121.165) 00:43 62 0
484448 ㅇㄹ) 마을 주민 레벨업 [3] 로갤러(121.157) 00:36 77 0
484447 ㅇㄹ)상급 모험가 라이센스 샀는데 [6] 로갤러(175.204) 00:32 86 0
484446 ㅇㄹ)상인길드 질문 [3] 로갤러(49.175) 00:09 65 0
484445 ㄷㅈ) DCSS에서 내 옛날 계정 정보는 살아있네 [1] 독수갤로그로 이동합니다. 00:09 67 1
484444 ㅇㄹ)서큐버스 피아니스트 4층 던전을 못넘기겠는데 [19] 프리야갤로그로 이동합니다. 01.17 155 0
ㅇㄹ) 명상 시에 자지 않는 모드를 만들어보자. 2 [3] ㅇㅇ갤로그로 이동합니다. 01.17 89 9
뉴스 박진영 데뷔 30주년 기념 콘서트 ‘Still JYP’, 성시경 게스트로 참여 디시트렌드 01.17
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2