mirror of
https://github.com/All-Of-Us-Mods/MiraAPI.git
synced 2026-10-19 15:51:48 +00:00
1 file changed
+44
-249
+44
-249
@@ -1,48 +1,52 @@
|
||||
[](https://discord.gg/AEfHJGwggC)
|
||||
|
||||
[English](README.md) | [简体中文]
|
||||
[English](../README.md) | [简体中文]
|
||||
|
||||
> 本模组不隶属于 Among Us 或 Innersloth LLC,其包含的内容也未得到 Innersloth LLC 的认可或以其他方式赞助。
|
||||
此处包含的部分材料是Innersloth LLC的财产。
|
||||
© Innersloth LLC.
|
||||
> 此模组与 Among Us 或 Innersloth LLC 无关,其中包含的内容未得到 Innersloth LLC 的认可或赞助。本文所含部分材料为 Innersloth LLC 的财产。© Innersloth LLC。
|
||||
|
||||
> 此文档的简体中文翻译来自[@TAIKongguo](https://github.com/TAIKgroup)
|
||||
> 由[太空果](https://github.com/TAIKgroup)开启了Pr并提交了初版翻译,由[林梅](https://github.com/HayashiUme)维护并提供wiki翻译。
|
||||
|
||||
# Mira API
|
||||
|
||||
一个全面并且简单的AmongUs开发辅助API和程序集,包括:
|
||||
- 职业
|
||||
一个全面、易上手的 Among Us 模组 API 及实用工具库,内含:
|
||||
|
||||
- 角色
|
||||
- 选项
|
||||
- 附加职业(副职业)
|
||||
- 附加职业
|
||||
- 按钮
|
||||
- 自定义颜色
|
||||
- 事件
|
||||
- 投票
|
||||
- 资源
|
||||
- 兼容性
|
||||
- ~~游戏模式~~ (即将完成)
|
||||
- 快捷键
|
||||
- 本地设置
|
||||
- 自定义游戏结束条件
|
||||
- 强兼容性
|
||||
- ~~游戏模式~~(敬请期待)
|
||||
|
||||
Mira API 力求全面而易于上手,同时尽可能复用原版游戏元素。
|
||||
它是一个更简洁、覆盖常见用例的模组 API,减少了对游戏源码的修改。
|
||||
|
||||
Mira API力求全面而简单,同时尽可能使用游戏基本元素。
|
||||
是一个为了让模组开发更简单的API,涵盖了多个方面。
|
||||
**加入 [Discord](https://discord.gg/FYYqJU2bvp) 获取支持并了解最新版本**
|
||||
|
||||
**加入我们的 [Discord](https://discord.gg/FYYqJU2bvp) 获取支持并了解最新版本**
|
||||
# 使用方法
|
||||
|
||||
# 用法
|
||||
要开始使用 Mira API,你需要:
|
||||
|
||||
在使用 Mira API 之前,您需要知道:
|
||||
1. 通过 [DLL](https://github.com/All-Of-Us-Mods/MiraAPI/releases),项目引用或 [NuGet包](https://www.nuget.org/packages/AllOfUs.MiraAPI)添加对Mira API的引用。
|
||||
2. 在plugin class上添加一个BepInRubstance,如下所示: `[BepInDependency(MiraApiPlugin.Id)]`
|
||||
3. 在plugin class中实现IMiraPlugin接口。
|
||||
1. 通过 [DLL](https://github.com/All-Of-Us-Mods/MiraAPI/releases)、项目引用或 [NuGet 包](https://www.nuget.org/packages/AllOfUs.MiraAPI) 添加对 Mira API 的引用。
|
||||
2. 在你的插件类上添加 BepInDependency,如下所示:`[BepInDependency(MiraApiPlugin.Id)]`
|
||||
3. 在你的插件类上实现 `IMiraPlugin` 接口。
|
||||
|
||||
Mira API 也依赖 [Reactor](https://github.com/NuclearPowered/Reactor) 进行工作!
|
||||
不要忘记引用 它和 `BepInDependency`!
|
||||
Mira API 还依赖 [Reactor](https://github.com/NuclearPowered/Reactor) 才能正常运行!
|
||||
记得将其作为引用和 `BepInDependency` 包含进来!
|
||||
|
||||
有关完整实例,请参考 [这个文件](https://github.com/All-Of-Us-Mods/MiraAPI/blob/master/MiraAPI.Example/ExamplePlugin.cs).
|
||||
完整示例请参见 [此文件](https://github.com/All-Of-Us-Mods/MiraAPI/blob/master/MiraAPI.Example/ExamplePlugin.cs)。
|
||||
|
||||
## 推荐的项目结构
|
||||
|
||||
使用 Mira API 时,强烈建议遵循以下项目结构,以保持代码整洁有序。
|
||||
你也可以查看本仓库中的示例模组以获得一些指导。
|
||||
|
||||
## 推荐项目结构
|
||||
强烈建议在使用Mira API时遵循此项目结构,以保持代码的整洁和有序。
|
||||
您还可以查看此存储库中的示例Mod以获取一些指导。
|
||||
```
|
||||
MyMiraMod/
|
||||
├── Buttons/
|
||||
@@ -67,230 +71,21 @@ MyMiraMod/
|
||||
└── MyModAssets.cs
|
||||
```
|
||||
|
||||
## 职业
|
||||
在Mira API中,创建自定义职业只需要需要做这两件事:
|
||||
1. 创建一个 AmongUs 原版的职业类 (如 `CrewmateRole`, `ImpostorRole`, 等等。)
|
||||
2. 通过 Mira API 实现 `ICustomRole`。
|
||||
# 文档
|
||||
|
||||
**免责声明: 请确保您的插件类具有以下属性 `[ReactorModFlags(ModFlags.RequireOnAllClients)]` 否则您将无法正常创建一个职业。**
|
||||
Mira API 每个功能的完整文档可在 **[wiki](https://github.com/All-Of-Us-Mods/MiraAPI/wiki)** 上找到:
|
||||
|
||||
注意: 对于步骤 1, 如果您想创建一个中立职业,您可以选择,
|
||||
`CrewmateRole` 或 `ImpostorRole`;
|
||||
|
||||
如果您可以从头独立完成一个职业,您也可以选择使用 `RoleBehaviour` 。
|
||||
|
||||
Mira API 帮助您处理其他的一切事务,
|
||||
包括在设置菜单中添加正确的选项,在游戏开始时正确分配每个职业。
|
||||
您可以尽情发挥您的才艺,肆意创造您心目中的职业.
|
||||
|
||||
|
||||
有关完整实例,请参考 [这个文件](https://github.com/All-Of-Us-Mods/MiraAPI/blob/teams/MiraAPI.Example/Roles/CustomRole.cs)。
|
||||
(原文档链接搜索不到网页,此处进行了修改)
|
||||
|
||||
## 附加职业(副职业)
|
||||
Mira API 中的附加职业(副职业)与其他模组并不完全相同。
|
||||
例如,在 Town Of Us 中,附加职业(副职业)是基于主职业的额外能力。
|
||||
但是,在Mira API 中,附加职业(副职业)是非常灵活的,
|
||||
它们是玩家额外的能力或可互动的其他东西。
|
||||
|
||||
Mira API 提供了3个类来处理附加职业(副职业):
|
||||
- `BaseModifier`: 每个附加职业(副职业)的基础。您必须手动在玩家中添加和删除此修改器!
|
||||
- `TimedModifier`: 有事件限制的附加职业(副职业)。此附加职业(副职业)必须手动添加,但会在到达时间限制后自动删除。
|
||||
- `GameModifier`: 这类似典型的 Town Of Us 的附加职业(副职业),在游戏开始时自动添加,在游戏结束后删除。
|
||||
|
||||
附加职业(副职业)为自定义模组提供了各种可覆写的函数和属性。
|
||||
它们还可以用来“标记”玩家
|
||||
您可以通过 `PlayerControl` 对象上的扩展方法 `HasModifier` 来检查玩家是否拥有附加职业(副职业)/
|
||||
|
||||
若想在游戏开始时使用附加职业(副职业),请选择上文中的一个类,并创建一个继承自它的类。
|
||||
实现您想要的效果,然后将 `[RegisterModifier]` 属性添加到这个类中。
|
||||
|
||||
有关普通附加职业(副职业)的实例,请参考 [这个文件](https://github.com/All-Of-Us-Mods/MiraAPI/blob/master/MiraAPI.Example/Modifiers/GameModifierExample.cs).
|
||||
|
||||
有关限时附加职业(副职业)的实例,请参考 [这个文件](https://github.com/All-Of-Us-Mods/MiraAPI/blob/master/MiraAPI.Example/Modifiers/ModifierTimerExample.cs).
|
||||
|
||||
(此文档链接搜索不到网页)
|
||||
|
||||
## Options
|
||||
在 Mira API 中,选项也十分简单。
|
||||
Mira API 在后台处理所有繁重的工作,
|
||||
您只需要遵循几个简单的步骤就可以创建自定义选项。
|
||||
选项分为组和选项,每个选项都必须属于一个组。
|
||||
|
||||
要创建组,您需要一个继承自 `AbstractOptionGroup` (抽象类)的类。
|
||||
组包含一些供开发人员控制的属性,
|
||||
包含 `GroupName`, `GroupColor`, `GroupVisible`, and `OptionableType`.
|
||||
属性的完整列表可以在 `AbstractOptionGroup`类中找到。
|
||||
只需要 `GroupName`就可以创建一个组。
|
||||
|
||||
这是一个组的代码实例:
|
||||
```csharp
|
||||
public class MyOptionsGroup : AbstractOptionGroup
|
||||
{
|
||||
public override string GroupName => "My Options"; // this is required
|
||||
|
||||
[ModdedNumberOption("My Number Option", min: 0, max: 10)]
|
||||
public float MyNumberOption { get; set; } = 5f;
|
||||
}
|
||||
```
|
||||
|
||||
您可以使用 `OptionGroupSingleton` 类访问任何组,如下所示:
|
||||
```csharp
|
||||
// MyOptionsGroup是一个继承自AbstractOptionGroup的类
|
||||
var myGroup = OptionGroupSingleton<MyOptionsGroup>.Instance; // gets the instance of the group
|
||||
Logger<MyPlugin>.Info(myGroup.MyNumberOption); // prints the value of the option to the console
|
||||
```
|
||||
|
||||
一旦你有了一个组,有两种方法可以制作选项:
|
||||
- 使用 Option Attribute with a property.
|
||||
- 创建一个 ModdedOption property.
|
||||
|
||||
### Option Attributes
|
||||
|
||||
这是使用Option Attribute with a property的示例:
|
||||
```csharp
|
||||
// 第一个参数始终是选项的名称。其余的取决于选项的类型。
|
||||
[ModdedNumberOption("Sussy level", min: 0, max: 10)]
|
||||
public float SussyLevel { get; set; } = 4f; // You can set a default value here.
|
||||
```
|
||||
|
||||
这是使用available Option Attributes的例示:
|
||||
```csharp
|
||||
ModdedEnumOption(string name, Type enumType, string[]? values = null, Type? roleType = null)
|
||||
|
||||
ModdedNumberOption(
|
||||
string name,
|
||||
float min,
|
||||
float max,
|
||||
float increment=1
|
||||
NumberSuffixes suffixType = NumberSuffixes.None,
|
||||
bool zeroInfinity = false,
|
||||
Type? roleType = null)
|
||||
|
||||
ModdedToggleOption(string name, Type? roleType = null)
|
||||
```
|
||||
|
||||
### ModdedOption Properties
|
||||
|
||||
这是使用ModdedOption的示例:
|
||||
```csharp
|
||||
public ModdedToggleOption YeezusAbility { get; } = new ModdedToggleOption("Yeezus Ability", false);
|
||||
```
|
||||
|
||||
目前,您可以创建三种类型的ModdedOptions:
|
||||
- `ModdedEnumOption`
|
||||
- `ModdedNumberOption`
|
||||
- `ModdedToggleOption`
|
||||
|
||||
有关完整实例,请参考[这个文件](https://github.com/All-Of-Us-Mods/MiraAPI/blob/master/MiraAPI.Example/Options/ExampleOptions.cs).
|
||||
|
||||
### 职业选项
|
||||
|
||||
您还可以为选项或组指定为一个职业的选项。
|
||||
|
||||
要为整个组设置职业,请按如下代码设置该组的 `OptionableType` 属性:
|
||||
```csharp
|
||||
public class MyOptionsGroup : AbstractOptionGroup
|
||||
{
|
||||
public override string GroupName => "My Options";
|
||||
public override Type? OptionableType => typeof(MyRole); // this is the role that will have these options
|
||||
|
||||
[ModdedNumberOption("Ability Uses", min: 0, max: 10)]
|
||||
public float AbilityUses { get; set; } = 5f;
|
||||
}
|
||||
```
|
||||
|
||||
您还可以指定 `OptionableType` 为附加职业(副职业)的选项。
|
||||
这将把该组与指定附加职业(副职业)相关联,
|
||||
并将其显示在附加职业(副职业)选项菜单中。
|
||||
|
||||
有关完整实例,请参考[这个文件](https://github.com/All-Of-Us-Mods/MiraAPI/blob/master/MiraAPI.Example/Options/Roles/CustomRoleSettings.cs)。
|
||||
|
||||
(原文档链接搜索不到网页,此处进行了修改)
|
||||
|
||||
## 自定义击杀
|
||||
Mira API 提供了自定义的击杀方式。
|
||||
我们允许开发者添加更多的击杀类别,并有助于绕过服务器检查。
|
||||
您可以使用 `PlayerControl.RpcCustomMurder` 或 `PlayerControl.CustomMurder`
|
||||
进行自定义击杀,例如:
|
||||
|
||||
```cs
|
||||
PlayerControl.LocalPlayer.RpcCustomMurder(Target, createDeadBody: false, teleportMurderer: false, playKillSound: false, resetKillTimer: false, showKillAnim: false);
|
||||
```
|
||||
这将杀死一名玩家,而不会造成尸体,也不会让击杀者瞬移。
|
||||
|
||||
## 按钮
|
||||
|
||||
Mira API 提供了一个简单的界面,用于向游戏添加功能按钮。
|
||||
|
||||
您只需要添加一个继承自 `CustomActionButton` 的类,并实现属性和方法。
|
||||
|
||||
Mira API 处理将按钮添加到游戏中所需的所有其他任务和逻辑。
|
||||
|
||||
如果你需要从另一个类访问 `CustomActionButton` 你可以使用,
|
||||
`CustomButtonSingleton` ,如下所示:
|
||||
|
||||
```csharp
|
||||
var myButton = CustomButtonSingleton<MyCoolButton>.Instance;
|
||||
```
|
||||
|
||||
按钮十分简单,但提供了巨大的灵活性。
|
||||
您可以使用多种方法来自定义按钮。
|
||||
有关按钮的方法和完整列表,请参考 [这个文件](https://github.com/All-Of-Us-Mods/MiraAPI/blob/master/MiraAPI/Hud/CustomActionButton.cs)
|
||||
|
||||
[这里](https://github.com/All-Of-Us-Mods/MiraAPI/blob/teams/MiraAPI.Example/Buttons/ExampleButton.cs)
|
||||
是一个按钮的实例代码。
|
||||
|
||||
(原文档链接搜索不到网页,此处进行了修改)
|
||||
|
||||
## 自定义颜色
|
||||
|
||||
Mira API提供了简单的自定义颜色,允许您将自定义玩家颜色添加到游戏中。
|
||||
|
||||
创建自定义颜色并不困难,但Mira API对创建您的颜色有一些要求。
|
||||
|
||||
1. 创建***STATIC***类来容纳所有 `CustomColor` 对象.
|
||||
2. 在这个类中,为要添加的每种颜色创建 `CustomColor` 属性。
|
||||
3. 将 `[RegisterCustomColors]`属性 添加到这个类中。
|
||||
|
||||
以下是一个自定义颜色的示例:
|
||||
```csharp
|
||||
[RegisterCustomColors]
|
||||
public static class MyCustomColors
|
||||
{
|
||||
public static CustomColor Cerulean { get; } = new CustomColor("Cerulean", new Color(0.0f, 0.48f, 0.65f));
|
||||
|
||||
public static CustomColor Rose { get; } = new CustomColor("Rose", new Color(0.98f, 0.26f, 0.62f));
|
||||
|
||||
public static CustomColor Gold { get; } = new CustomColor("Gold", new Color(1.0f, 0.84f, 0.0f));
|
||||
}
|
||||
```
|
||||
|
||||
## 资源
|
||||
|
||||
Mira API 提供了一个简单且可扩展的资源系统。
|
||||
该系统的核心是 `LoadableAsset<T>` 类。
|
||||
这是一个通用的抽象类,它提供了一种加载资源的模式。
|
||||
|
||||
Mira API 附带了一些资源加载器:
|
||||
1. `LoadableBundleAsset<T>`: 这适用于从 AssetBundles 加载资源。
|
||||
2. `LoadableAddressableAsset<T>`: 这适用于从 Addressables 加载资源。
|
||||
3. `LoadableResourceAsset`: 这适用于从模组加载嵌入式资源。
|
||||
4. `LoadableAudioResourceAsset`: 这适用于从模组加载嵌入式音频资源。
|
||||
|
||||
下面的代码展示了如何使用资源加载器:
|
||||
```csharp
|
||||
// Load a sprite from an AssetBundle
|
||||
AssetBundle bundle = AssetBundleManager.Load("MyBundle"); // AssetBundleManager is a utility provided by Reactor
|
||||
LoadableAsset<Sprite> mySpriteAsset = new LoadableBundleAsset<Sprite>("MySprite", bundle);
|
||||
Sprite sprite = mySpriteAsset.LoadAsset();
|
||||
|
||||
// 加载嵌入式资源
|
||||
// 确保将映像的“构建操作”设置为“嵌入式资源”!
|
||||
LoadableAsset<Sprite> buttonAsset = new LoadableResourceAsset("ExampleMod.Resources.MyButton.png");
|
||||
Sprite button = buttonSpriteAsset.LoadAsset();
|
||||
```
|
||||
|
||||
您可以查看[例示文件](https://github.com/All-Of-Us-Mods/MiraAPI/blob/master/MiraAPI.Example/ExampleAssets.cs).
|
||||
|
||||
您可以通过继承 `LoadableAsset<T>` 类并实现 `LoadAsset`方法来创建自己的资产加载器。
|
||||
- [入门 / IMiraPlugin](https://github.com/All-Of-Us-Mods/MiraAPI/wiki/Home)
|
||||
- [自定义角色](https://github.com/All-Of-Us-Mods/MiraAPI/wiki/Custom-Roles)
|
||||
- [选项](https://github.com/All-Of-Us-Mods/MiraAPI/wiki/Options)
|
||||
- [附加职业](https://github.com/All-Of-Us-Mods/MiraAPI/wiki/Modifiers)
|
||||
- [自定义按钮](https://github.com/All-Of-Us-Mods/MiraAPI/wiki/Custom-Buttons)
|
||||
- [自定义颜色](https://github.com/All-Of-Us-Mods/MiraAPI/wiki/Colors)
|
||||
- [事件](https://github.com/All-Of-Us-Mods/MiraAPI/wiki/Events)
|
||||
- [会议与投票](https://github.com/All-Of-Us-Mods/MiraAPI/wiki/Meetings-and-Voting)
|
||||
- [资源](https://github.com/All-Of-Us-Mods/MiraAPI/wiki/Assets)
|
||||
- [快捷键](https://github.com/All-Of-Us-Mods/MiraAPI/wiki/Keybinds)
|
||||
- [本地设置](https://github.com/All-Of-Us-Mods/MiraAPI/wiki/Local-Settings)
|
||||
- [游戏模式](https://github.com/All-Of-Us-Mods/MiraAPI/wiki/Game-Modes)
|
||||
- [自定义游戏结束](https://github.com/All-Of-Us-Mods/MiraAPI/wiki/Game-Over)
|
||||
- [实用工具](https://github.com/All-Of-Us-Mods/MiraAPI/wiki/Utilities)
|
||||
Reference in new issue
Block a user