为“Game With Your Friends”制作新赌场游戏的框架模组。
注意:钓鱼游戏模组: https://github.com/Syd4r/FishingGame 是使用此框架构建游戏的绝佳参考。
要制作兼容的模组,你需要按如下方式设置文件结构:
如你所见,一款游戏要正常运行,主要需要三样东西:
在接下来的章节中,我将逐一介绍如何正确设置这些内容。
要构建一个兼容的Unity资源包,你必须先搭建一个合适的Unity场景。我强烈建议对steamapps\common\Gamble With Your Friends中的Gamble With Your Friends_data文件夹使用AssetRipper。然后,在AssetRipper中,将提取出的文件导出为一个Unity项目。在Unity Hub中,确保下载Unity版本6000.3.6f1,并用这个版本打开该Unity项目。这样你就能获得游戏所有的材质、网格和预制体。主要问题是所有脚本都会断开连接,所以你应该删除文件夹中的所有C#脚本。然后找到一个游戏中已经存在的预制体,比如Crash CasinoGame。你可以编辑这个预制体,并以它为基础来构建你想要的内容。确保移除所有使用脚本的悬空组件,因为这些会报错。另外,确保添加TextMeshPro包,这样你才能为任何文本添加TextMeshPro组件。要获取游戏的字体,请查找Assets/Font/Dangrek-Regular.ttf,并用它来构建Dangrek-Regular SDF.asset,你应该将其放在Assets/Resources/fonts & materials/中,然后在TextMeshPro中选择Dangrek-Regular即可。
如果你查看一个现有赌场游戏的预制件,它看起来会像这样:
如果你在Unity场景中设置好这些内容并配置好资源打包,打包完成后只需将打包文件重命名为你的游戏名称,然后拖入游戏文件夹即可。
下载 Visual Studio,并使用“类库(.Net Framework)”创建一个新项目。
创建一个新的 C# 脚本。在这个文件中,你只需要添加一个继承自 gamebase 的新公共类。例如:
public class ExampleGameName : GameBase {}
我强烈推荐使用dnSpy查看基础赌场游戏的类,或者查看 https://github.com/Syd4r/FishingGame 去了解如何做事。
以下是你应该了解的一些有用事项:
void Start() {} 这将在对象实例化时运行。
public override bool Weaved() { return true; } 我们正在半手动地织入代码,因此不需要织入器对这个文件做任何处理。
protected override void StartGame() 你的播放按钮在被点击时会运行此函数。
void Update() {} 这将每帧运行
你必须在你的C#脚本中的某个地方包含下面这段代码,将你的名称和你的模组名称替换为正确的值。
命名空间 YourModNameeMod { [BepInPlugin("com.YourName.YourModName", "YourModName", "1.0.0")] [BepInDependency("com.moregames.base", BepInDependency.DependencyFlags.HardDependency)] 公共类 YourModNamePlugin : BaseUnityPlugin { 私有方法 Awake() { Logger.LogInfo("YourModName 程序集已由 BepInEx 加载!正在等待基础加载器……"); } } }
网络设置非常重要!!!
如果你想让游戏中出现视觉上的效果,它必须通过网络同步,因此仅靠函数更新客户端的视觉效果是不够的,以下是正确设置网络的方法:
public void BroadcastTestMethod(string text) {
如果(!NetworkServer.active)返回;字符串 方法签名 = “System.Void TestMod.TestGameName::UserRpcTestMethod(System.String)”;整数 rpc哈希 = 方法签名.GetStableHashCode();NetworkWriterPooled 写入器 = NetworkWriterPool.Get();写入器.WriteString(文本);this.SendRPCInternal(方法签名, rpc哈希, 写入器, 0, 真);NetworkWriterPool.Return(写入器);
}
public void UserRpcTestMethod(string networkText) {
如果 (!NetworkClient.active) 返回; --执行视觉表现--
}
如果你的函数是在按下按钮时运行的,就必须这样设置:
服务器
public void 测试按钮点击(玩家交互 交互 = null) {
如果不是服务器激活状态,直接返回; -- 做点什么 --
}
当你想支付时,只需使用 this.Payout 函数:
this.Payout((double)multiplier, ChangeType.GameResult, null, -1L);
这个C#脚本将处理你游戏的所有逻辑,如果你有任何问题,只需在Discord上给我发消息:syd4r
游戏清单是整个配置过程中最简单的一部分。以下是一个游戏清单示例:
{ "name": "测试游戏名称", //这应与你的文件夹名称和所有文件名匹配 "baseMinBet": 20, //一楼键盘的最低下注额 "baseMaxBet": 360, //一楼键盘的最高下注额(由于某些原因会有10-20的偏差) "directions": [ //定义多台机器如何在集群中生成 "North", "South", ], "floorWeights": { //每层被选中的权重,这些值可使机器与其他机器以相同概率生成 "1": 0.167, "2": 0.111, "3": 0.091, "4": 0.063 }, "buttons": [ //定义在Unity中点击具有此名称的按钮时调用哪个函数 { "objectName": "PlayButton", //开始按钮必须调用TryStartGame "functionName": "TryStartGame" }, { "objectName": "TestButton", //其他按钮可以调用任何函数 "functionName": "TestFunction" }, ], "fields": [ //如果你希望在C#脚本中访问资源包中的内容,请在此处添加 { "fieldName": "testField", //C#脚本中的字段名称 "source": "child", //几乎总是child "targetName": "Test_Object" //Unity对象名称 }, { "fieldName": "testPrefabs", "source": "child", "targetNames": [ //你也可以创建Unity对象的数组 "test_1", "test_2", "test_3", "test_4", "test_5", "test_6", "test_7", "test_8", "test_9", "test_10", "test_11", "test_12" ] } ] }
请确保像这样设置gamemanifest.json,并将其包含在游戏文件夹中。
如果你按照这些步骤操作,应该就能做出你自己的自定义游戏了。如果遇到任何问题,欢迎随时联系我。我强烈推荐去看看我是如何制作我的自定义游戏的: https://github.com/Syd4r/FishingGame

BepInEx整合包
BepInEx2026-05-03 03:50:12

禁用计时器
CostMillion2026-09-11 15:40:28
禁用计时器是《和朋友赌博》的一个模组,它会移除每日赌场活动中的计时器。正常情况下,你每天只能在赌场里玩5分钟,之后就会被强制传送出去。这个模组会禁用计时器,

r2modman
ebkr2026-05-13 16:19:12
一个简单易用的模组管理器,适用于许多使用Thunderstore的游戏

赌场菜单 - 模组菜单
Yebbs692026-05-08 12:57:43
一个用于《Gamble With Your Friends》的BepInEx模组菜单,具备金钱/票券注入、配额完成、触发胜利、速度修改、游戏速度控制、天数计时器操控等功能

共享升级(仅限主机)
SELCreative2026-05-05 23:24:12
厌倦了看着有升级的朋友赌博吗?将升级书分享给整个房间,并根据玩家数量动态调整配额难度。只需房主安装即可!

俄罗斯轮盘赌 和你的朋友对赌
DimaLooper2026-07-28 20:23:10
纹理俄化

GWYF 预测器
0verFallen2026-06-29 23:17:12
预测GWYF中确定性游戏的结果。献给那些格外倒霉的人。

不停站
SaltedByte2026-05-02 17:42:24
跳过回合间的等待时间:自动跳过数据统计,加快倒计时,不再播放失败过场动画,并增加投票认输按钮。