Closed12

Emerald AI メモ

trefuntrefun

AI 初期設定

初期設定

  1. Setup Manaer window を開く
  2. AI Object に AI を設定したいブジェクトを選択して Setup AI 押下

初期設定後

Animations タブ

  1. 各種アニメーション(歩行、戦闘など)全て設定
  2. 設定終了後に Animations から一番下の方の Generate Animator Controller
  3. (extra) 同じ設定を使いまわす場合には Export Animation Profile

AI's Settings タブ

(攻撃有りの AI のみ)

  1. -> Damage Settings -> Melee Attackes で攻撃設定

Detection $ Tags タブ

  1. Detection Options タブで Head Transform で頭のオブジェクト選択(Auto Find Head Transform で自動選択可能な場合も)
  2. Tag & Faction Options タブで AI Faction Relations から Faction 同士の関係設定(デフォルトだとお互い無視)
trefuntrefun

攻撃アニメーション

攻撃操作に設定したアニメーションには EmeraldAttackEventFunction に設定したイベントが必要

trefuntrefun

HP バー表示

  1. UI Settings タブに移動
  2. Name Text SettinsAuto Create Health Barsyes
  • Name Position の y 座標ををそれぞれ調整(今回の場合 2.3, 2.0)
trefuntrefun

AI NAME 変更

エメラルド AI の表示名の動的変更

void AddFighter(GameObject obj, Vector3 vec, Quaternion qua, string name)
{
    GameObject fighter = Instantiate(obj, vec, qua) as GameObject;
    fighter.GetComponent<EmeraldAIEventsManager>().UpdateUINameText(name);
}

trefuntrefun

AddFactionRelation での設定が反映されない

下記のような形で Faction を設定したものの ATEAM と BTEAM が敵対行動をとらない

EmeraldAIEventsManager.ChangeFaction("ATEAM");
EmeraldAIEventsManager.AddFactionRelation("ATEAM", "Friendly");
EmeraldAIEventsManager.AddFactionRelation("BTEAM", "Enemy");
trefuntrefun

AddFactionRelation での設定が反映されない 2

EmeraldAIEventsManager.csSetFactionLevelAddFactionRelation で実際の Detection に使われる配列の値を更新するように書き替えたら反映されるようになった

オープンソースでないので全文記載できないが下記のような感じでFactionRelationsListの更新と同様に更新するように変更した。

EmeraldComponent.FactionRelationsList[i].RelationTypeRef = 0;
EmeraldComponent.FactionRelations[i] = 0;

AddFactionRelation は下記を更新が必要だった

  // to update AI behabior
  EmeraldComponent.AIFactionsList.Add(FactionData.FactionNameList.IndexOf(Faction));
  EmeraldComponent.FactionRelations.Add(FactionEnumLevel);
  SetFactionLevel(Faction, FactionLevel);
trefuntrefun

AddFactionRelation での設定が反映されない 3

新しくシーンに AI を追加する際に、AI の名前と HP バーの色、Faction の関係を追加する関数は下記のような形になった

void AddFighter(GameObject obj, Vector3 vec, Quaternion qua, string name, Color teamColor, bool isA)
{
    GameObject fighter = Instantiate(obj, vec, qua) as GameObject;
    // to update Object name
    fighter.name = name;

    EmeraldAIEventsManager fighterEventManager = fighter.GetComponent<EmeraldAIEventsManager>();
    // to update AI name
    fighterEventManager.UpdateUINameText(name);
    // to update UI name color
    fighterEventManager.UpdateUINameColor(teamColor);

    // to update Faction relation
    if (isA)
    {
        fighterEventManager.ChangeFaction("ATEAM");
        fighterEventManager.AddFactionRelation("ATEAM", "Friendly");
        fighterEventManager.AddFactionRelation("BTEAM", "Enemy");
    }
    else
    {
        fighterEventManager.ChangeFaction("BTEAM");
        fighterEventManager.AddFactionRelation("ATEAM", "Enemy");
        fighterEventManager.AddFactionRelation("BTEAM", "Friendly");
    }

}
trefuntrefun

範囲攻撃

Ranged な攻撃の Ability の Effect には GameObject を指定するが、着弾時に Disable される。
そのため指定する GameObjectOnDisable で関数をアタッチすれば着弾時に実行される範囲攻撃が実装できる

一例

    // 着弾時に実行
    void OnDisable()
    {
        // 発射されたオブジェクトの着弾位置
        Vector3 vec = transform.position;
        // 範囲内の collider 取得
        Collider[] hitColliders = Physics.OverlapSphere(vec, range);

        foreach (var hitCollider in hitColliders)
        {
            // 範囲内の AI(この場合 "Respawn" tag 付き)すべてにダメージ
            if (hitCollider.tag == "Respawn")
            {
                GameObject targetAI = hitCollider.gameObject;
                if (targetAI.GetComponent<EmeraldAI.EmeraldAISystem>() != null)
                {
                    targetAI.GetComponent<EmeraldAI.EmeraldAISystem>().Damage(damage, EmeraldAI.EmeraldAISystem.TargetType.AI);
                }
            }
        }
    }
このスクラップは2022/05/08にクローズされました