Closed12
Emerald AI メモ
- 公式ドキュメント
https://github.com/Black-Horizon-Studios/Emerald-AI/wiki - 解説動画リスト
https://www.youtube.com/watch?v=pL5Z-f8COcY&list=PLlyiPBj7FznY7q4bdDQgGYgUByYpeCe07 - Discord
https://discord.com/invite/XpWYzjp - forum
https://forum.unity.com/threads/sale-70-off-emerald-ai-3-0-new-huge-update-the-ultimate-universal-aaa-quality-ai-solution.336521/
AI 初期設定
初期設定
- Setup Manaer window を開く
-
AI Object
に AI を設定したいブジェクトを選択してSetup AI
押下
初期設定後
Animations
タブ
- 各種アニメーション(歩行、戦闘など)全て設定
- 設定終了後に
Animations
から一番下の方のGenerate Animator Controller
- (extra) 同じ設定を使いまわす場合には
Export Animation Profile
AI's Settings
タブ
(攻撃有りの AI のみ)
- ->
Damage Settings
->Melee Attackes
で攻撃設定
Detection $ Tags
タブ
-
Detection Options
タブでHead Transform
で頭のオブジェクト選択(Auto Find Head Transform
で自動選択可能な場合も) -
Tag & Faction Options
タブでAI Faction Relations
から Faction 同士の関係設定(デフォルトだとお互い無視)
攻撃アニメーション
攻撃操作に設定したアニメーションには EmeraldAttackEvent
を Function
に設定したイベントが必要
HP バー表示
-
UI Settings
タブに移動 -
Name Text Settins
とAuto Create Health Bars
をyes
に
-
Name Position
の y 座標ををそれぞれ調整(今回の場合 2.3, 2.0)
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);
}
AddFactionRelation での設定が反映されない
下記のような形で Faction を設定したものの ATEAM と BTEAM が敵対行動をとらない
EmeraldAIEventsManager.ChangeFaction("ATEAM");
EmeraldAIEventsManager.AddFactionRelation("ATEAM", "Friendly");
EmeraldAIEventsManager.AddFactionRelation("BTEAM", "Enemy");
AddFactionRelation での設定が反映されない 2
EmeraldAIEventsManager.cs
の SetFactionLevel
と AddFactionRelation
で実際の 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);
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");
}
}
AddFactionRelation での設定が反映されない 4
反映されるようになった
範囲攻撃
Ranged な攻撃の Ability の Effect には GameObject
を指定するが、着弾時に Disable される。
そのため指定する GameObject
に OnDisable
で関数をアタッチすれば着弾時に実行される範囲攻撃が実装できる
一例
// 着弾時に実行
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);
}
}
}
}
新しく追加された Sound Detector System
見てみるとどうも対象の velocity (移動距離の差分)で検知しており、音ではなかった。
このスクラップは2022/05/08にクローズされました