役職実装方法 - yukieiji/ExtremeRoles GitHub Wiki

この情報は2022/07/08時点のdevelopブランチの情報です

前準備

  1. Visual Studio 2022のインストール
    • ここからインストールしてください
    • ワークロードで「.NETデスクトップ開発」、「Unityによるゲーム開発」辺りを選択していれば大丈夫なはずです
  2. Gitのインストール
    • ここからインストールしてください
  3. Extreme Rolesのフォークとクローン
    • GitHubのアカウントを作ってフォークしてください、その後そのリポジトリをクローンしてください
  4. クローンしたフォルダから「ExtremeRoles.sln」をVisual Strudioで開く
  5. 「develop」ブランチから役職作成用のブランチを作成して切り替える

以下任意

  • AmongUsを別フォルダにインストールして、開発用のAmongUsを用意する
    • ここから「BepInEx-Unity.IL2CPP-win-x86-6.0.0-be.667+6b500b3.zip」をダウンロードして、開発用のAmongUsフォルダの中に全て展開して下さい
  • システムの環境変数に開発用のAmongUsフォルダのパスを「変数」「AmongUs」に追加
    • これをすることでVisual Studio上でビルドするとビルドしたものが勝手にインストールされます
  • Pythonの環境も構築しておくと自分で翻訳を試すことも出来ます
能力ボタンの追加方法は「役職のインターフェースについて」を参照

ソロ役職追加方法

  1. ExtremeRoles/Roles/ExtremeRoleManager.cs内のExtremeRoleIdに追加したい役職のIDを追加
    • 上の区切り(Null, VanillaRoleを除く)からコンビネーション役職、クルー役職、インポスター役職、ニュートラル(第三陣営)役職となってるので追加したい陣営の区切りに新しい役職のIDを追加
    • 基本的に役職のIDは役職名を推奨
  2. ExtremeRoles/Roles/Soloの追加したい陣営のフォルダに新しいcsファイルを作る
    • フォルダの陣営は以下の通り
      • Crewmate => クルー役職
      • Impostor => インポスター役職
      • Neutral => ニュートラル(第三陣営)役職
    • 役職名のcsファイルだととても見やすいです
  3. 作成したファイルにExtremeRoles.Roles.API.SingleRoleBaseを継承したPublicクラスを作る
  4. 以下を参考に継承元のコンストラクターに必要な情報を記載(追加したクラスのコンストラクターの引数はなくて良いです)
    • 継承元の引数は上から以下の通り
      • id: ExtremeRoleId、役職のID
      • team: ExtremeRoleType、陣営
        • ExtremeRoleType.Crewmate => クルー陣営
        • ExtremeRoleType.Impostor => インポスター陣営
        • ExtremeRoleType.Neutral => ニュートラル陣営
      • roleName: string、役職名
      • Color roleColor、役職の色
        • インポスターの場合、Palette.ImpostorRedがインポスターの色になります
        • それ以外の場合はExtremeRoles.Module.ColorPaletteの中に役職の色を作ってそれを参照するとわかりやすいです
      • canKill: bool、キルボタンを持つか
      • hasTask: bool、タスクを持つか
        • インポスターがこの設定をtrueにしてもタスクをすることは出来ません
      • useVent: bool、ベントボタンを持つか
      • useSabotage: bool、サボタージュボタンを持つか
        • インポスターがこの設定をfalseにしてもサボタージュを封じることは出来ません
      • canCallMeeting: bool、デフォルトtrue、緊急会議ボタンを押せるか
      • canRepairSabotage: bool、デフォルトtrue、サボタージュ(停電、酸素、リアクター等)を治せるか
      • canUseAdmin: bool、デフォルトtrue、アドミンを使用できるか
      • canUseSecurity: bool、デフォルトtrue、セキュリティカメラとドアログを使用できるか
      • canUseVital: bool、デフォルトtrue、バイタルを使用できるか
  5. CreateSpecificOptionメソッドとRoleSpecificInitをオーバーライドする
  6. 役職のオプションIDを管理するEnumを役職内に定義する
    • int型のEnumで定義する(アクセスはなんでも可)
  7. CreateSpecificOptionメソッド内にオプションを作る処理を書く
    • 引数のparentOps(CustomOptionBase型)は役職のスポーン率のオプションです
      • オプションを作成するメソッドの引数のparentに基本的に代入して頂ければ大丈夫です
        • 引数parentはそのparentのオプションが有効時、追加したオプションが表示されるようになります
    • 各種オプションは以下のインラインメソッドを呼び出せば作成可能、基本的に6で作ったEnumを最初の引数に渡して必要な情報を渡せば作成できます
      • CreateFloatOption:浮動小数点で管理したいオプションを作成する
      • CreateIntOption:整数型で管理したいオプションを作成する
      • CreateIntDynamicOption:整数型でかつ、最大値が変化するようなオプションを作成する
        • このオプションで作ったオプションは後で、最大値を決定するオプション作成してそれをSetUpdateOptionメソッドで追加する
      • CreateBoolOption:オン、オフのオプションを作成する
      • CreateSelectionOption:自分で作ったオプションが表示されるようなオプションを作成する
        • 例:「死体を消す、死体を残す、死体を通報させない」等
    • オプションは役職クラスに持たせてもいいですが全てのオプションがO(1)でアクセスできる箇所に置いてあるので、あんまり意味がないと思います
      • 持たせるとそれだけメモリを使うのであんまり意味がないと思います
  8. RoleSpecificInitメソッド内に役職の初期化処理とオプションのロード処理を書く
    • 役職の初期化はほぼここで行います
      • リストや内部クラスの初期化はなるべくここで行いましょう
    • オプションに関して
      • ExtremeRoles.OptionHolder.AllOptionに全てのオプションが入ってるのでそこからアクセスします
      • GetRoleOptionIdメソッドに6で作成したEnum内で欲しいオプションを渡すとExtremeRoles.OptionHolder.AllOptionのインデクサーが取れるのでそれでアクセスするととても簡単です
        • 例:「ExtremeRoles.OptionHolder.AllOption[GetRoleOptionId(NewRoleOption.HogeHoge)]」
      • 作成したオプションの値はGetValue()を呼び出すことで取れます。各種戻り値の仕様は以下のとおりです
        • CreateFloatOption:float
        • CreateIntOption:int
        • CreateIntDynamicOption:int
        • CreateBoolOption:bool
        • CreateSelectionOption:int
          • 現在選択されているインデックス値が戻り値です
  9. ExtremeRoles.Roles.ExtremeRoleManager.NormalRole内にキーをintでキャストした役職ID、バリューを作成した役職のクラスのインスタンスを追加
    • 上の区切りクルー役職、インポスター役職、ニュートラル(第三陣営)役職となってるので追加したい陣営の区切りに新しいクラスをnewして追加
  10. 保存してビルド
  11. ビルドしたものをAmongUsにインストール
  12. ゲームを起動して、ゲーム内に新しい役職のオプションが追加され正常に動作するようになる

コンビネーション役職実装方法

  1. ExtremeRoles/Roles/ExtremeRoleManager.cs内のExtremeRoleIdに追加したい役職のIDを追加
    • 上の区切り(Null, VanillaRoleを除く)からコンビネーション役職、クルー役職、インポスター役職、ニュートラル(第三陣営)役職となってるので追加したいコンビネーション役職の区切りに追加する全て分の新しい役職のIDを追加
    • 基本的に役職のIDは役職名を推奨
  2. ExtremeRoles/Roles/Combinationに追加するコンビネーション役職の全てを記載するファイルを作る
  3. 作成したファイルにExtremeRoles.Roles.API.MultiAssignRoleBaseを継承したPublicクラスを作る
  4. 以下を参考に継承元のコンストラクターに必要な情報を記載(追加したクラスのコンストラクターの引数はなくて良いです)
    • 継承元の引数は上から以下の通り
      • id: ExtremeRoleId、役職のID
      • team: ExtremeRoleType、陣営
        • ExtremeRoleType.Crewmate => クルー陣営
        • ExtremeRoleType.Impostor => インポスター陣営
        • ExtremeRoleType.Neutral => ニュートラル陣営
      • roleName: string、役職名
      • Color roleColor、役職の色
        • インポスターの場合、Palette.ImpostorRedがインポスターの色になります
        • それ以外の場合はExtremeRoles.Module.ColorPaletteの中に役職の色を作ってそれを参照するとわかりやすいです
      • canKill: bool、キルボタンを持つか
      • hasTask: bool、タスクを持つか
        • インポスターがこの設定をtrueにしてもタスクをすることは出来ません
      • useVent: bool、ベントボタンを持つか
      • useSabotage: bool、サボタージュボタンを持つか
        • インポスターがこの設定をfalseにしてもサボタージュを封じることは出来ません
      • canCallMeeting: bool、デフォルトtrue、緊急会議ボタンを押せるか
      • canRepairSabotage: bool、デフォルトtrue、サボタージュ(停電、酸素、リアクター等)を治せるか
      • canUseAdmin: bool、デフォルトtrue、アドミンを使用できるか
      • canUseSecurity: bool、デフォルトtrue、セキュリティカメラとドアログを使用できるか
      • canUseVital: bool、デフォルトtrue、バイタルを使用できるか
  5. CreateSpecificOptionメソッドとRoleSpecificInitをオーバーライドする
  6. 役職のオプションIDを管理するEnumを役職内に定義する
    • int型のEnumで定義する(アクセスはなんでも可)
  7. CreateSpecificOptionメソッド内にオプションを作る処理を書く
    • 引数のparentOps(CustomOptionBase型)は役職のスポーン率のオプションです
      • オプションを作成するメソッドの引数のparentに基本的に代入して頂ければ大丈夫です
        • 引数parentはそのparentのオプションが有効時、追加したオプションが表示されるようになります
    • 各種オプションは以下のインラインメソッドを呼び出せば作成可能、基本的に6で作ったEnumを最初の引数に渡して必要な情報を渡せば作成できます
      • CreateFloatOption:浮動小数点で管理したいオプションを作成する
      • CreateIntOption:整数型で管理したいオプションを作成する
      • CreateIntDynamicOption:整数型でかつ、最大値が変化するようなオプションを作成する
        • このオプションで作ったオプションは後で、最大値を決定するオプション作成してそれをSetUpdateOptionメソッドで追加する
      • CreateBoolOption:オン、オフのオプションを作成する
      • CreateSelectionOption:自分で作ったオプションが表示されるようなオプションを作成する
        • 例:「死体を消す、死体を残す、死体を通報させない」等
    • オプションは役職クラスに持たせてもいいですが全てのオプションがO(1)でアクセスできる箇所に置いてあるので、あんまり意味がないと思います
      • 持たせるとそれだけメモリを使うのであんまり意味がないと思います
  8. RoleSpecificInitメソッド内に役職の初期化処理とオプションのロード処理を書く
    • 役職の初期化はほぼここで行います
      • リストや内部クラスの初期化はなるべくここで行いましょう
    • オプションに関して
      • ExtremeRoles.OptionHolder.AllOptionに全てのオプションが入ってるのでそこからアクセスします
      • GetRoleOptionIdメソッドに6で作成したEnum内で欲しいオプションを渡すとExtremeRoles.OptionHolder.AllOptionのインデクサーが取れるのでそれでアクセスするととても簡単です
        • 例:「ExtremeRoles.OptionHolder.AllOption[GetRoleOptionId(NewRoleOption.HogeHoge)]」
      • 作成したオプションの値はGetValue()を呼び出すことで取れます。各種戻り値の仕様は以下のとおりです
        • CreateFloatOption:float
        • CreateIntOption:int
        • CreateIntDynamicOption:int
        • CreateBoolOption:bool
        • CreateSelectionOption:int
          • 現在選択されているインデックス値が戻り値です
  9. 3~8を必要な役職分繰り返す
  10. 作成したファイルにConstCombinationRoleManagerBaseかFlexibleCombinationRoleManagerBaseを継承したクラスを作る
  • ConstCombinationRoleManagerBase
    • 1組あたりの役職数と役職が固定のコンビネーション役職用
    • 継承元の引数は上から以下の通り
      • roleName:string、役職名
      • optionColor:Color、オプションの色
      • setPlayerNum:int、1セット辺りのプレイヤー数
      • maxSetNum:役職のセット数の上限
    • コンストラクター呼び出し後、Roles(List型)にコンビネーションとなる役職を追加する
  • FlexibleCombinationRoleManagerBase
    • 1組あたりの役職数が非固定やインポスタークルー両陣営対応用
    • この役職は役職数が非固定のため、一つの役職を複数人に割り当ててコンビネーション役職としている
    • 継承元の引数は上から以下の通り
      • role: MultiAssignRoleBase、複数人に割り当てる役職
      • minimumRoleNum:int、デフォルト値2、この役職が割り当てられる最少人数、1の場合はroleの陣営の単体役職となる
      • canAssignImposter: bool、デフォルト値true、この役職がインポスターにも割り当てられるか
        • minimumRoleNumが1、canAssignImposterがtrueの時、roleの陣営及びインポスター陣営両陣営対応の役職となる
  1. ExtremeRoles.Roles.CombinationRoleTypeにコンビネーション役職全体を管理するようのIDを作成
  2. ExtremeRoles.Roles.ExtremeRoleManager.CombRole内にキーをbyteでキャストした11で作成した役職ID、バリューを作成した役職のクラスのインスタンスを追加
  3. 保存してビルド
  4. ビルドしたものをAmongUsにインストール
  5. ゲームを起動して、ゲーム内に新しい役職のオプションが追加され正常に動作するようになる

第三陣営の勝利条件追加方法

特殊勝利条件

  1. 勝利条件を満たした時、役職のIsWinをtrueにする処理を書く(全体的な処理が入らない場所でIsWinがtrueになる場合は全体を更新するように)
  2. ExtremeRoles.Roles.ExtremeRoleManager.RoleGameOverReasonに勝利Idを追加する
  3. ExtremeRoles/Patches/ShipStatusPatch.cs内のisNeutralSpecialWin内の「switch (role.Id)」の所にその役職が特殊勝利を満たしたケースを追加
    • endReasonに2で追加した勝利条件を代入するだけ
  4. ExtremeRoles/Patches/AmongUsClientPatch.csのPostfixメソッド内の「switch ((RoleGameOverReason)gameData.EndReason)」の所に1で追加された勝利条件のケースを追加
    • 基本的にreplaceWinnerToSpecificNeutralRolePlayerメソッドにnoWinnerとその勝利時に勝利する役職のIdセットを渡せば大丈夫
  5. ExtremeRoles/Patches/EndGameManagerPatch.csのsetWinBonusTextメソッド内「switch ((RoleGameOverReason)gameData.EndReason)」の所に1で追加された勝利条件のケースを追加
    • 基本的にbonusTextに役職名、textRenderer.colorとmanager.BackgroundBar.material.SetColorに役職の色を追加で大丈夫
  6. 保存してビルド
  7. ビルドしたものをAmongUsにインストール
  8. ゲームを起動して、特殊勝利条件を満たした時、正常に動作するようになる

生存勝利条件

  1. ExtremeRoles.Roles.ExtremeRoleManager.NeutralSeparateTeamに役職のIDかわかりやすいIdを追加する
  2. ExtremeRoles.Roles.ExtremeRoleManager.RoleGameOverReasonに勝利Idを追加する
  3. ExtremeRoles/Module/GameDataContainer.cs内のCreateStatisticsメソッド内の「switch (role.Id)」の所にその役職が生きているケースを追加
    • 基本的にaddNeutralTeamメソッドを「ref neutralTeam, gameControlId, (1で追加したEnum)」で呼び出せば大丈夫
  4. ExtremeRoles/Patches/ShipStatusPatch.cs内のisNeutralAliveWinメソッド内の「switch (team)」の所に1で追加したEnumのケースを追加
    • 基本的に生存者がどんな感じになってるかをチェックして大丈夫だったら、setWinGameContorlId(id)とendReasonに2で追加した勝利条件を代入、それ以外ならfalseを返す
  5. ExtremeRoles/Patches/AmongUsClientPatch.csのPostfixメソッド内の「switch ((RoleGameOverReason)gameData.EndReason)」の所に1で追加された勝利条件のケースを追加
    • 基本的にreplaceWinnerToSpecificNeutralRolePlayerメソッドにnoWinnerとその勝利時に勝利する役職のIdセットを渡せば大丈夫
  6. ExtremeRoles/Patches/EndGameManagerPatch.csのsetWinBonusTextメソッド内「switch ((RoleGameOverReason)gameData.EndReason)」の所に1で追加された勝利条件のケースを追加
    • 基本的にbonusTextに役職名、textRenderer.colorとmanager.BackgroundBar.material.SetColorに役職の色を追加で大丈夫
  7. 保存してビルド
  8. ビルドしたものをAmongUsにインストール
  9. ゲームを起動して、生存勝利条件を満たした時、正常に動作するようになる

役職の複雑な特殊勝利条件追加方法(ヤンデレやラバーズなどの特殊勝利みたいなもの)

  1. ExtremeRoles.Roles.ExtremeRoleManager.SpecialWinCheckRoleに役職のIdを追加する
  2. ExtremeRoles.Roles.ExtremeRoleManager.RoleGameOverReasonに勝利Idを追加する
  3. ExtremeRoles/SpecialWinChcker内に新しいファイルを作る
  4. 新しいクラスをIWinCheckerを継承して作成
  5. RoleGameOverReason Reasonに2で追加した勝利Idを指定する
  6. 必要なコードを書く(複雑なことを出来るようにしたため説明できない・・・・)
  7. ExtremeRoles/Module/GameDataContainer.cs内のaddSpecialWinCheckRoleメソッド内の「switch (roleId)」の所にその役職のケースを追加
    • 基本的にaddDataで3で作ったクラスをnewしてaddData.AddAliveRoleを呼び出せば大丈夫
  8. ExtremeRoles/Patches/AmongUsClientPatch.csのPostfixメソッド内の「switch ((RoleGameOverReason)gameData.EndReason)」の所に1で追加された勝利条件のケースを追加
    • 基本的にreplaceWinnerToSpecificNeutralRolePlayerメソッドにnoWinnerとその勝利時に勝利する役職のIdセットを渡せば大丈夫
  9. ExtremeRoles/Patches/EndGameManagerPatch.csのsetWinBonusTextメソッド内「switch ((RoleGameOverReason)gameData.EndReason)」の所に1で追加された勝利条件のケースを追加
    • 基本的にbonusTextに役職名、textRenderer.colorとmanager.BackgroundBar.material.SetColorに役職の色を追加で大丈夫
  10. 保存してビルド
  11. ビルドしたものをAmongUsにインストール
  12. ゲームを起動して、特殊勝利条件を満たした時、正常に動作するようになる