Outer Wilds

Outer Wilds

30 ratings
【邪道】强制让鮟鱇鱼以及DLC中的鹿角人静止不动/灭绝
By ✨Karen✨
警告:使用此方法会严重破坏游戏体验
此方法只是为了让那些无法完成最后剧情/已经被鮟鱇鱼劝退 的玩家也能体验到最后的结局(毕竟云结局还是没有自己玩快乐)
   
Award
Favorite
Favorited
Unfavorite
警告
  • 再次强调使用此方法会严重破坏游戏体验
  • 再次强调本指南只是为了让那些无法完成最后剧情/已经被鮟鱇鱼,鹿哥劝退 的玩家也能体验到最后的结局
  • 修改游戏代码自然有一定风险,虽然从代码上并没看到有检测,也没有带VAC封禁,但笔者无法保证100%的安全性,希望悉知
前言
写在最前面
通过“验证游戏完整性”便可恢复修改之前的样子
本来是打算写鮟鱇鱼听到声响便反向游动,但因为这个玩法依旧有概率会碰到玩家而造成死亡,所以干脆写最保险的:强制让鮟鱇鱼静止不动
DLC部分则是跟上面鮟鱇鱼的思路相同,从成就名我得知鹿哥叫Ghost,再来找相应的类改就好了
成就部分则是调用了官方的方法,模仿正常的获取成就的途径
这里使用的工具是最常用的反编译软件之一:dnSpy
思路
玩过Unity的都知道,基本游戏使用的C#脚本都被编译到了Assembly-CSharp.dll,因为本游戏没有进行其他加密,只有个unity自带的Momo,所以我们可以直接使用dnSpy进行反编译,找到下图的文件夹下的Assembly-CSharp.dll文件,使用dnSpy进行打开,打开后左侧列表如图二


可以看到,每个类名的作用就是标题,这分类写的,tql
我们找到AnglerfishController这个类,直译就是鮟鱇鱼控制器,我们主要要修改的就是这个类中的代码,这里先讲讲为什么这么改,怎么改在下一节
我们在这个类里能看到如图一个叫AnglerState的枚举类型,从名字就知道是控制安康鱼的状态,其中有5种状态,分别是Lurking(潜伏),Investigating(调查),Chasing(追捕),Consuming(消化),Stunned(发呆)

再根据官方的介绍,鮟鱇鱼是瞎子,但声音很灵敏,此时可以猜想到是不是给人物和飞船绑了个音源,然后通过音源传播的范围等等来判断玩家位置和是否切换状态
果然我们能够在这个类里找到一个方法叫OnClosestAudibleNoise,这就是我们要修改的。
但这还没完!!
unity里有一个方法叫FixedUpdate,一般默认情况是0.02秒执行一次,我们从代码里看到里面放了2个方法,一个叫UpdateState(更新状态)一个叫UpdateMovement(更新位置)

我们所要做的当然是修改UpdateState里的代码
看起来思路这么长,其实要改动的代码就4行
操作
  • 用dnSpy打开Assembly-CSharp.dll,并找到AnglerfishController这个类,不知道在哪的可以看看上一节《思路》里的图
  • 找到OnClosestAudibleNoise这个方法中的this.ChangeState开头的这一行(原本的347行),右键“编辑类”,如图操作,

    更改“编辑类”窗口的352行和362行划横线的地方,改成“Stunned”(这里就是改鮟鱇鱼听到声音切换状态)如图:

    改完后找到193和196行,依旧是划横线地方改成“Stunned”(这里就是改fixedUpdate里的实时更新的状态)
    找不到的可以先找到UpdateState这个类,往下找到case AnglerfishController.AnglerState.Stunned:再下面找到两行this.ChangeState开头的,如图位置

    然后点击编译
  • 此时如果跳如下图所示的错误

    双击错误定位过去,应该是[DebuggerBrowsable(DebuggerBrowsableState.Never)]这样的代码,删掉就好了,一共有4个来着
  • 最后 文件-全部保存-确定 就好了
更新1:让鮟鱇鱼灭绝
因为留言有老哥说即使静止不动都有可能撞上去,那么就根本上解决问题,那就是直接让鮟鱇鱼灭绝
我们依旧找到AnglerfishController这个类,找到应该是第60行,也就是Start方法
#Start方法只在脚本实例被启用时才会执行
在其中直接添加 base.gameObject.SetActive(false); 即可,也就是把游戏对象关闭,因为保险我把下面那个设置状态也删了(多此一举罢了)最终效果图如下:

如果有报错就把那一行删掉便可了
更新1(改):手动让鮟鱇鱼灭绝
如果开始就杀会不会感觉毫无乐趣?不如在将要被吃掉的时候按下按键再让其消失
我写的是按下M键,因为最好不要和默认按键冲突
依旧和更新1里所要写的那样,只不过我们需要做的就是额外设置个按键,当监听到我们按下那个按键就把鮟鱇鱼这个gameobject设置为关闭
注意:我们要改的地方是在FixedUpdate这个方法里(此方法每隔固定时间里面的代码就会运行一次,默认是0.02s,顺带一提,start方法只会运行一次,所以我们不改在那)还有这个更新1(改)所做的和更新1有所冲突,所以得先还原代码再改动
代码如下:
if (global::Input.GetKeyDown(KeyCode.M)) { base.gameObject.SetActive(false); }
最终样子如图:

PS1:写的是全部消失,也就是按下去瞬间让所有鮟鱇鱼消失,如果你想写单个的,这里提供一个思路,就是判断鮟鱇鱼的状态是否为Chasing,在这个里面写按键消失
PS2:很可惜,是直接凭空消失,没有特效,没有爆炸,因为只是代码开源不是工程开源,无法只使用代码来做特效
更新2:让dlc的鹿角人消失
(就算让鹿哥消失了,但依旧因为太黑各种迷路)
找到类名为GhostBrain中的Start方法,直接在里面添加下面代码就好了,如图
base.gameObject.SetActive(false);

已得到验证,修改上述代码不会影响dlc和原本结局的鹿人
更新3:获得成就
这一章节面对的人群是:
  • 手残完成不了高难成就,但又想全收集,但又怕使用SAM这种第三方软件导致某些问题
  • 没有买dlc但又想拿全成就(未验证,理论可行)不过这里还是要强烈推荐DLC

依旧同上面一样,dnspy反编译,找到Achievements类,里面有个叫Type的枚举变量,这些值对应的就是成就名,如图,这里的作用就是你要达成什么成就,你就得先知道你要达成那个成就在代码里对应的名字

达成成就的代码是(下面用的是 “你们永远无法活捉我!” 举例)
Achievements.Earn(Achievements.Type.TAKEMEALIVE);
我们只需要修改 Achievements.Type.成就名 ,就行了
把这一行代码,随便放到一个好达成的地方就好了,这里可以考虑放到60s之内死亡的那个成就达成条件下
在DeathManager这个类中,KillPlayer方法下(没动过的话是115行)
右键编辑方法,如图极速60s 下面两行就是加的

要什么就加什么,然后进游戏,去把极速60s再达成一次,你加的成就就会跳了(直接开局火堆送死)
后话
如有不适,我会将此指南删除,纯粹只是因为看着室友玩的可太艰难了,甚至要把手柄给砸了,相信有不少玩家因为鮟鱇鱼才没有体验到最后的结局,所以有写此指南的想法
如有什么问题请在留言版提出,我看到会及时回复
最后联动本人关于此游戏的另两篇指南
https://steamcommunity.com/sharedfiles/filedetails/?id=2146683126
https://steamcommunity.com/sharedfiles/filedetails/?id=2622475579
< >
16 Comments
✨Karen✨  [author] Mar 24 @ 5:31am 
感谢测试
糯米吃布丁 Mar 22 @ 10:28pm 
更新2:让dlc的鹿角人消失
测试了一下,让赛博鹿人消失不会影响DLC最后的鹿人和结局新增的鹿人
glgzs1 Dec 16, 2021 @ 7:59pm 
我头几次升空就闯进了黑棘星,一套乱拳打来,根本没看见鮟鱇鱼就找到了费尔德斯巴,我还纳闷为啥光有个骨架,在费尔营地第一次见识了太阳爆炸,我还纳闷为啥这里有个巨大的鱼骨架。后来抱着核心再进去看见鮟鱇冲我奔来直接吓呆了
X-bow Oct 24, 2021 @ 7:01am 
其实可以贴墙走,鱼嘴大咬不到,直面恐惧!!!!冲
✨Karen✨  [author] Oct 8, 2021 @ 7:16pm 
后现代毕加索 Oct 8, 2021 @ 9:02am 
可以查到DLC警报锁的密码吗?这样是不是就能不死亡解开棺材了
蛋神 Sep 22, 2021 @ 9:59pm 
当初一遍过,就是自信
洛里斯杨远 Aug 24, 2021 @ 2:01am 
改禁止不动其实可以直接在384行加一句话
newState = AnglerfishController.AnglerState.Stunned;
就不需要该那么多地方了,直接改ChangeState一次搞定:ALdrinkemoji:
谢谢你,看完你给我发的指南让我明白了有比进入黑棘星更困难的事情了,我现在已经重新燃起希望了,这篇指南让我坚信自己能够走完最后的路:dip:
TanlySun Jun 14, 2021 @ 11:16am 
说没有操作空间的,你就没想过也许通过的办法恰恰是不进行任何操作?