骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 991|回复: 4

[求助] OnMissionScreenTick没有运行(已解决)

[复制链接]

1

主题

25

回帖

8

积分

平民

Rank: 1

UID
3010220
第纳尔
143
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2018-6-28
鲜花(0) 鸡蛋(0)
发表于 2024-4-16 08:25:43 | 显示全部楼层 |阅读模式
本帖最后由 Only灬上校 于 2024-4-21 08:03 编辑

我跟着b站制作工匠啤酒mod的教程,想实现战场上按一个快捷键消耗一个物品回血的功能。下面是删减版代码

  1. using TaleWorlds.InputSystem;
  2. using TaleWorlds.Library;
  3. using TaleWorlds.Localization;
  4. using TaleWorlds.MountAndBlade;
  5. using TaleWorlds.MountAndBlade.View.MissionViews;
  6. using TaleWorlds.MountAndBlade.View.Screens;


  7. namespace HpPotion
  8. {
  9.     public class SubModule : MBSubModuleBase
  10.     {
  11.         public override void OnMissionBehaviorInitialize(Mission mission)
  12.         {
  13.             base.OnMissionBehaviorInitialize(mission);
  14.             mission.AddMissionBehavior(new HpPotionMissionView());
  15.         }
  16.     }

  17.     public class HpPotionMissionView : MissionView
  18.     {
  19.         public override void OnMissionScreenTick(float dt)
  20.         {
  21.             base.OnMissionScreenTick(dt);
  22.             InformationManager.DisplayMessage(new InformationMessage("mission screen tick"));
  23.         }
  24.     }
  25. }
复制代码
在游戏测试中,即便我为base.OnMissionScreenTick(dt)增加了断点,也没有命中过。已经测试过可以确保的是模组正常加载,OnMissionScreenInitialize正常输出,但OnBehaviorInitialize没有输出,OnRemoveBehavior正常输出。似乎是HpPotionMissionView没有正确初始化导致的,但我不知道问题出在哪,不知道有没有大佬可以解答我的困惑。

28

主题

221

回帖

180

积分

见习骑士

Rank: 3

UID
2758789
第纳尔
2118
精华
0
互助
19
荣誉
1
贡献
0
魅力
171
注册时间
2016-7-18
鲜花(18) 鸡蛋(0)
发表于 2024-4-18 22:02:28 | 显示全部楼层
感觉还是像模组没有加载上,SubModule.xml那边写的对不对需要看一下,然后调试的时候命令行参数有没有把mod加上也要看一下
试了一下你的几行代码,直接丢进我这边mod里是能命中的

1

主题

25

回帖

8

积分

平民

Rank: 1

UID
3010220
第纳尔
143
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2018-6-28
鲜花(0) 鸡蛋(0)
 楼主| 发表于 2024-4-20 12:27:57 | 显示全部楼层
似乎是版本问题,我调到1.2.8版本代码就可以运行了,但1.2.9版本不能。也不知道是不是烤肉社更新版本的时候改了什么东西。
本模组包括Harmony都是正常加载的,在1.2.9版本debug的结果是:
在某个mission(比如酒馆)中,我的HpPotionMissionView正常加载,落在mission.MissionBehaviors里,但与其它的MissionBehavior相比我的HpPotionMissionView的MissionScreen属性是Null,因此也没法执行任何与MissionScreen有关的代码。例如,读取MissionScreen抑或是Input都会报错未找到对象之类的。

28

主题

221

回帖

180

积分

见习骑士

Rank: 3

UID
2758789
第纳尔
2118
精华
0
互助
19
荣誉
1
贡献
0
魅力
171
注册时间
2016-7-18
鲜花(18) 鸡蛋(0)
发表于 2024-4-20 18:08:35 | 显示全部楼层
Only灬上校 发表于 2024-4-20 12:27
似乎是版本问题,我调到1.2.8版本代码就可以运行了,但1.2.9版本不能。也不知道是不是烤肉社更新版本的时候 ...


是有这个原因,129版MissionView那边需要加个标签才能正常用,比如游戏源码的这个类
        [OverrideView(typeof(MissionAgentStatusUIHandler))]要加类似的这个标签,别直接用这个,会把原来的ui'覆盖掉
        public class MissionGauntletAgentStatus : MissionGauntletBattleUIBase

(点击展开 / 收起)

1

主题

25

回帖

8

积分

平民

Rank: 1

UID
3010220
第纳尔
143
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2018-6-28
鲜花(0) 鸡蛋(0)
 楼主| 发表于 2024-4-21 08:01:52 | 显示全部楼层
路过的罗格 发表于 2024-4-20 18:08
是有这个原因,129版MissionView那边需要加个标签才能正常用,比如游戏源码的这个类
        [OverrideView(typ ...

大佬厉害!我从源码里追溯AddMissionBehavior,发现它应该要在MissionScreen.AddMissionView()里调用才合理,但本身OnMissionBehaviorInitialize没有传入MissionScreen参数,所以我花了老大劲从其它已有的MissionView里扣出了MissionScreen然后调用AddMissionView。这么写bug很多。没想到可以直接从ScreenSystem.TopScreen找到MissionScreen,学到了!
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2024-5-4 02:49 , Processed in 0.119855 second(s), 19 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表