디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅇㅇ갤로그로 이동합니다. 2025.01.17 21:18:04
조회 659 추천 10 댓글 7

++0. 발단.


++본인은 게임을 하면서 명상이 너무 마음에 안 들었음.


개고생해서 에헤카틀의 다키마쿠라를 얻었는데, 내 새끼가 자꾸 노숙을 해버렸기 때문임.


텐트를 경량화해서 들고 다니는 로갤러들도, 명상 돌리다가 갑자기 기절해버린 경험이 있을 것이라고 생각함.


이 시스템이 존나 악질인게, 명상을 하는 도중에 "졸음" 상태가 되어버리면 손쓸 방도가 없이 캐릭이 잠들어버림.


그리고 거지 같은 컨디션으로 일어난 걸 보고 허탈함을 느끼기를 수십번, 본인은 그냥 모딩을 해서 시스템을 직접 뜯어고치자는 발상을 하게 됨.


이 글은 본인이 해당 기능을 구현하기 위해 어떤 시행 착오를 거쳤는지, 어떻게 구현했는지를 정리한다.


프로그래밍 내용이 대부분이라 간단하게 C# 강의라도 보는 것을 추천함. 본인도 잘 모르지만 그냥 깡으로 했음.


크게 도움은 안 될 것 같지만, 엘린 모딩하는 사람도 너무 없고 이 미약한 경험이 도움이 되기를 바람.


참고로 개발 도중에 BetterSleep이라는 모드가 있단 걸 알게되어, 이 모드를 많이 참고 했음.


나도 역량이 모자란지라 지적 및 피드백 대환영임. 



+1. 개발 환경 설정.


Windows11에서 개발한다고 전제한다. MacOS에서는 그냥 포기하고 가상 머신을 돌리는 것을 추천한다. 본인은 일단 도저히 할 수가 없었음.


원활하게 모딩을 하기 위해서는 꽤 많은 준비물이 필요하다.


-0. Elin 게임 파일.

-1. 코드 편집을 위해서 Visual Studio 혹은 Rider를 사용한다.+

-2. 빌드를 위해서 최신 버전의 .net SDK가 필요하다.

-3. 엘린의 원본 소스를 확인하기 위해서 디컴파일러 dnSpy나 dotpeek이 필요하다.

-4. 엘린 내부의 유니티 요소들을 확인하고 추적하기 위해 Unity Explorer가 필요하다.


이 글에서는 내가 Visual Studio를 사용했으므로 Visual Studio를 기준으로 작성함. 


-Visual Studio


https://visualstudio.microsoft.com/ko/downloads/


먼저 Visual Studio 같은 경우에는 마이크로소프트 들어가서 다운 받으면 된다.


viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a6605b72f4fc6dd9963112733c7b8cb15a9f12f78c067b


그리고 인스톨러를 실행하면 이런 화면이 뜰 텐데, 위와 같이 체크한다.


Unity 개발툴을 빼먹을 수도 있을텐데 괜찮다. 나중에 깔면 됨 ㅇㅇ...


- .net SDK


https://dotnet.microsoft.com/ko-kr/download/visual-studio-sdks

 



.net SDK도 마이크로소프트꺼다.


그냥 시원하게 최신 버전 깔아주자. 하위호환 잘 된다.


-디컴파일러


https://www.jetbrains.com/ko-kr/decompiler/


디컴파일러는 dotpeek을 사용한다. 


dnSpy를 사용해도 무방하지만, 얘는 멋대로 원본 코드를 수정하는 일이 좀 있어서 보기 불편할 때가 있었음.


-Unity Explorer


https://github.com/sinai-dev/UnityExplorer/releases/tag/4.9.0


여기서 unityexplorer.bepinex6.mono.zip 을 받아주자.


엘린이 사용하고 있는 BepInEx의 버전이 6.0.0.0이므로 6버전을 받는다.


이 녀석을 이용해서 게임 내부의 요소 값들을 확인하고 수정할 수 있다.


다운받은 파일을 Elin 게임 폴더 내부의 BepInEx/plugins 경로에 복붙한다.


viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a6605b72f4fc6dd99631122269718ee308cd42f78c067b


이렇게 말이다. 




여기까지 했다면 이제 개발 준비는 완료가 되었다. 그 이전에 모드가 어떻게 돌아가는지에 대해서 조금 살펴보자.



2. 모딩 개요.

+


https://gall.dcinside.com/mgallery/board/view/?id=dyson_sphere_program&no=4481

 


+한 갤러가 모드의 작동 원리에 대해서 정리한 글이다.


모딩의 핵심은 BepInEx와 Harmony이다.


BepInEx는 Elin에 붙어서 우리가 만든 코드를 실행해주는 녀석이다.


Harmony는 게임 코드를 직접적으로 수정하는데 사용하는 라이브러리이다. BepInEx에서 자체적으로 HarmonyX라고 개조해서 사용하고 있다. 그래도 큰 차이는 없다.


요약하자면


0. 게임 코드를 뜯어서 구조를 파악한다.

1. C# 에서 Harmony 라이브러리를 이용해서 코드를 작성한 뒤 빌드한다. (dll이 나옴.)

2. 그걸 BepInEx가 실행시킨다.


라는 원리이다.


2.1. Harmony


모딩을 위해서 필수적인 녀석이다. Harmony를 사용할 때, Patch한다는 표현을 사용한다.


이 때 Patch의 유형은 크게 Prefix, Postfix, Transpiler로 나뉜다.


Prefix는 메소드 실행시 앞부분을 가로채고, Postfix는 뒷부분을 가로채서 제 입맛대로 바꿔줄 수 있다.


Transpiler는 C# 코드가 실행 전에 IL 코드란 녀석으로 바뀌는데, IL 코드를 수정하는 식으로 작동한다. 얘는 코드의 대부분을 수정하는 것이 가능하다.


이렇게 보면 엥 Transpiler가 짱이 아닌가요? 싶지만, 빡고수가 아니면 안 쓰는 게 정신 건강에 이롭다. 그 이유는 나중에 직접 몸으로 느껴보자.


아무튼 우리는 메소드를 앞 뒤로 패치할 수 있음을 알게 되었다.


이걸 어케 쓸 수 있을지 이제부터 알아보자.



3. 게임 요소 찾기.


viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a6605b72f4fc6dd9963112226e7adbe05dcc10f78c067b



엘린을 키고, Unity Explorer가 잘 작동하는지 확인해보자. 위와 같이 뭔가가 뜬다면 성공이다.


우리의 목표는 이것이다.


"명상 시 수면을 발생시키는 코드를 찾고 수정하기."


드가자~



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a6605b72f4fc6dd99631122c3c748eb1599b49f78c067b


+일단 Unity Explorer를 키고, Inspector를 들어간다.


그러면 위와 같이 드롭다운이 있는데, UI를 클릭한 뒤, 명상 아이콘을 클릭해보자.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a6605b72f4fc6dd9963112706e2584b008c147f78c067b


viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a6605b72f4fc6dd9963112276e758ce453cf47f78c067b


+

위와 같은 모습을 볼 수 있을 것이다. 클릭한 부분이 이렇게 많은 유니티 요소들이 존재한다.


우리가 원하는 건 오른클릭을 했을 때에 실행되는 명상 기능이다. 이 중에서 어떤 것이 명상 기능을 실행시키는 것과 관련이 있을까?


일단 Viewport를 클릭해보자.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07cb065b7afdf169d9f4d7dba83929b96e22f7e518d8db1913


그러면 위와 같은 창이 뜬다. 


보아하니 위쪽은 현재 게임 오브젝트 Viewport의 위치 속성 같다. 그리고 ActiveSelf 같은 버튼이 있다.


Children은 이 오브젝트가 지닌 하위 오브젝트들 처럼 보인다. 토글 버튼을 눌러보면 화면 상에서 뭔가가 나타나거나, 사라지는 것을 발견할 수 있다.


이걸 이용해서 명상 버튼의 오브젝트를 찾아보자.


ActiveSelf를 체크 해제한다.


viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a6605b72f4fc6dd99631122c6c70dce65ece14f78c067b

+

그랬더니 내 어빌리티가 전부 사라졌다.


그렇다. Viewport는 어빌리티 창의 안쪽에서 아이콘들을 담고 있는 오브젝트인 것이다.


Unity는 게임 오브젝트들이 계층적으로 관계를 맺고 있다. 그렇다면 Viewport 안에 명상 버튼을 의미하는 오브젝트가 존재한다는 뜻이다.


그 다음 Children에 있는 토글 버튼 들을 체크 해제하면서 어떤 녀석이 사라지는지 한 번 확인해보자.


눌렀을 때에 명상 버튼이 사라진다면, 그 오브젝트의 하위에 명상 버튼이 있다는 뜻이니, 천천히 용의자를 좁혀보자.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a6605b72f4fc6dd9963112256c77d8b408c945f78c067b


+

그런 식으로 용의자를 좁히다 보면, 위와 같은 오브젝트를 발견할 수 있다.


하위요소가 더 없어서 이젠 더 타고 들어갈 수가 없다. 거기에 ButtonAbility라는 컴포넌트를 지니고 있다.


유니티 공식 문서는 "컴포넌트(Components) 는 게임에서 오브젝트와 동작에 관한 기본 구성 요소라 할 수 있습니다."라고 설명한다.


그 오브젝트의 기능이 컴포넌트에 담겨있다는 뜻이다. 그렇다면 ButtonAbility라는 컴포넌트가 어케 돼있는지 확인해보자.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5570fefd6bde491288ee97f7b3dbec4e6a74d53fc69a


+굉장히 많은 값들을 포함하고 있는 것을 알 수 있다.


하지만 버튼은 일반적으로 OnClick 이벤트를 포함하는 게 국룰이다.


그러면 그 이벤트를 찾으면 되겠지?



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07cb065174fffb68dfe6f72c365a665508c2d921363185ef5868



찾았다. Action이라는 객체가 할당되어있다. 저 객체는 무엇일까 살펴보기 위해서 Inspect를 눌러본다.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d7194d52b98baadc503056171d749


뭔가 많다. Delegate로 인해서 코드가 실행되는 것 같은데, 이 이상은 파고 들기가 어렵다.



viewimage.php?id=3fb1d92de0&no=24b0d769e1d32ca73de887fa11d02831fda25116b354fdde343a07ad07c50effd9014c1f9d9d7b07a66a5770fcf86cdca28d7194d52c9bbea0c5060f6171d749


다시 ButtonAbility로 돌아와서 재미있는 메소드를 발견했다.


ButtonAbility.Use(); 메소드를 Evaluate 해보면 명상이 시작된다!


이렇게 우리는 명상이 실행되는 메소드인 ButtonAbility.Use();를 찾아냈다.


그렇다면 이제 코드를 볼 시간이다.



(* 코드 관련해서는 말이 너무 길어지기 때문에 다음 편에서...)

추천 비추천

10

고정닉 2

1

댓글 영역

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

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 타고난 드립력으로 사석에서 만나도 웃길 것 같은 스타는? 운영자 25/02/10 - -
공지 로그라이크 갤러리 이용 안내 [56] 운영자 16.04.08 87054 24
488872 ㅇㄹ) 종자저장고 만드는중 [1] ㅇㅇ(125.137) 04:37 26 1
488867 ㅇㄹ) 겜 천천히 해도 되는거지 [4] 로갤러(211.210) 04:10 41 1
488864 ㅇㄹ) 버섯맥주 종류가 너무 많은데 각각다 가격표 붙여야하나 [1] 로갤러(116.35) 03:58 25 0
488858 ㅇㄹ) 작물 성장 상태에 따라 비옥도가 달라지는거 같은데 맞음? [1] 로갤러(116.35) 03:12 33 0
488852 ㅋㅌㅋ)손 두개 만들어주면 안되나 [2] Lasshole갤로그로 이동합니다. 02:18 42 0
488851 ㅇㄹ)몬스터 소환 몇마리나 해야 다시는 안나옴? [3] 로갤러(116.35) 02:17 54 0
488850 ㅇㄹ 이거 좌상단에 뜨는 토지 특성 중에 [2] 로갤러(223.38) 02:05 46 0
488848 ㅇㄹ) 사람들 근력음식 먹는건 왜 그런거임? [6] ㅇㅇ(118.36) 02:00 87 0
488841 ㅇㄹ) 아피랑 크림 드럽게 안썩네 [7] ㅇㅇ(59.9) 01:08 75 0
488840 돌죽) 좀이 계단플하니까 계단을 옮기네 [2] ㅇㅇ갤로그로 이동합니다. 00:50 67 1
488839 ㅇㄹ) 메릴리스퀘 알고간거 아니면 골드 골랐을듯 [14] ㅇㅇ(39.124) 00:42 95 0
488838 ㅇㄹ) 가격표 붙여서 파는 사람들은 금괴 수급 어떻게함? [8] 로갤러(116.35) 00:38 68 0
488837 ㅇㄹ)신앙 보상 수동기도했는데 왜 안들어옴? [7] 로갤러(123.109) 00:11 73 0
488836 ㅇㄹ) 이거 주거지 땅 낚시할 수 있게 물 채울 수 있나 [9] Tree_Leaf갤로그로 이동합니다. 00:09 67 0
488835 ㅇㄹ) 골든벨 찾았다 [4] ㅇㅇ(125.137) 02.13 104 0
488834 ㅇㄹ) 아니 이거 바다도 진입되는 타일이었네 [3] 로갤러(218.233) 02.13 79 0
488833 ㅇㄹ)다크매터 주괴 바위로 못바꿈? [3] 로갤러(1.243) 02.13 77 0
488832 ㅇㄹ)재생성 안되는 맵이 있나? [1] 로갤러(220.65) 02.13 71 0
488831 ㅇㄹ) 메릴리스 동료만든후에 저택 털면 뭐라고 안하네 ㅋㅋㅋ [5] 로갤러(116.35) 02.13 110 0
488830 ㄷㅈ) hoarfrost 이거 선조 통과함? 로갤러(210.57) 02.13 29 1
488828 ㄷㅈ) 지식의 고서들, 아티팩트 책상점 [2] 모래시계 나침반(211.119) 02.13 61 1
488826 ㅇㄹ)이게 완전식품이지ㅋㅋㅋㅋ [4] ㅇㅇ(121.173) 02.13 140 1
488824 ㅇㄹ) 총기 개조는 어디서얻어? [9] 나쵸갤로그로 이동합니다. 02.13 95 0
488823 베르니스 맹약의 돌 레벨 언제까지 올려야함? [1] 캐피노갤로그로 이동합니다. 02.13 44 0
488821 ㄷㅈ) 코글린 쌍지팡이맨 기즈모 뭐 고를까? [10] heki갤로그로 이동합니다. 02.13 83 1
488817 ㅇㄹ) 관광 거점은 만들 가치가 있음? [7] ㅇㅇ(112.157) 02.13 126 0
488813 딮에리 시프무나 폴라볼텍스 안정화 했는데 다음 스킬 머찍음? [3] 로갤러(119.77) 02.13 75 1
488812 ㅇㄹ) 이거 지어놓은 집 옮기는 방법은 없음? [2] ㅇㅇ(39.124) 02.13 99 0
488811 ㅇㄹ) 내 홈에 들어온 동물들 75로 동료 만든다음 가축으로 못 만들어? [2] 로갤러(221.155) 02.13 97 0
488809 ㅇㄹ) 오 장식대에 룬 생김 ㅋㅋㅋㅋ [1] 로갤러(116.35) 02.13 145 1
488808 ㅇㄹ) 자꾸 뭔가가없어지는데 불탄거야 누가 썌벼간거야? [4] 로갤러(116.35) 02.13 91 0
488807 ㄷㅈ 돌죽 lua 모아주던 사이트 업데이트했네 [3] 불블볼갤로그로 이동합니다. 02.13 98 3
488806 ㅇㄹ 가쓰오부시 만드는 법이 생선 맷돌에 갈아넣는 거 맞지? [4] 로갤러(211.60) 02.13 91 0
488803 ㅇㄹ) 이스카 첨 봤는데 도트 좀 귀여운듯 [3] ㅇㅇ(118.36) 02.13 172 1
488802 ㅇㄹ) 메달박스 사서 쓰는사람 있음? [8] ㅇㅇ(39.124) 02.13 127 0
488800 ㅇㄹ)근접 사실 직업 전사보다 농부가 더 센거 아닐까 [3] Lasshole갤로그로 이동합니다. 02.13 162 1
488799 ㅌㅈ) 안일사 ㄹㅇ 진짜 못난 내 스스로가 밉다 [3] ㅇㅇ(223.39) 02.13 82 1
488798 ㅇㄹ) 아니 십ㅋㅋ [15] 로갤러(223.38) 02.13 177 0
488797 신작 2.5d 액션로그라이크 해본 사람? [14] 카샤(121.137) 02.13 261 4
488796 ㅇㄹ)아레나 마스터는 뭐임? [5] 로갤러(220.65) 02.13 137 0
488795 ㅇㄹ)성장하기 꽤 어렵네.. [3] 나쵸갤로그로 이동합니다. 02.13 120 0
488794 ㅇㄹ)목장 어케만듬? [3] 로갤러(175.115) 02.13 101 0
488793 ㅇㄹ) 그.. 국왕 죽여도 상관없지?? [19] Tree_Leaf갤로그로 이동합니다. 02.13 211 0
488792 ㅇㄹ) 결정류가 전부 고순도 붙는거보니 인챈트 복사방지용인가보다 [1] 로갤러(218.233) 02.13 87 0
488791 140시간 캐릭터 버리고 새거 키워야겟다 ㅇㅇ갤로그로 이동합니다. 02.13 83 0
488790 ㄷㅈ) 트롤 석상이 하고싶다 [4] ㅇㅇ(39.7) 02.13 65 0
488789 ㅇㄹ) 광산탐험하고 케틀 연금술 복사 얻었는데 정확히 뭘 복사할수있는거야 [3] 로갤러(116.35) 02.13 76 0
488788 엘린) 안정판 23.92 2/13일 목요일 업뎃 [11] 베르테르갤로그로 이동합니다. 02.13 382 9
488787 안정판 업뎃 캬ㅋㅋ [2] 베르테르갤로그로 이동합니다. 02.13 123 0
뉴스 구준엽, 故서희원 떠나보내고 쇠약해진 모습… “근육 거의 사라져” [왓IS] 디시트렌드 02.13
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2