2020年06月29日
[Unity]AI Plannerインストール〜
・Unity2020.1.0b13
Youtubeの内容まとめ
・edit->Project Setting->Pakege Manager->Enable Preview Packagesのチェックを入れる。
・Window->Packege Manager->AI Plannerをインストール。
AI
┣ Actions
┣ Plan
┣ Scripts
┗Trait
・Traitフォルダで右クリック->Create->AI->Trait->Trait Definition
4つ作成。
敵HPを設定。
敵の数を設定。
ドアのbool値設定。
AI -> Planner => Generate Assembles
・プレイヤー
Trait Componentをアタッチ -> select trait -> プレイヤー、Location,Moveableにチェック
プレイヤーにはNavmeshAgentも必要。
移動範囲の地面もBakeしておく。
・ゲート
select trait -> ゲート、Location
・Enemy
select trait -> Enemy、Location
・Game State
select trait -> GameSettings
・Actionフォルダで右クリック->Create->AI->Planner -> Action Definition
Preconditions(前提条件)
・プレイヤーと敵の位置が一致
Effects -> Objects Modified (変更)
・敵の数を−1する
Cost -> base value -> -0.1
Preconditions(前提条件)
・プレイヤーと敵の位置が不一致
Effects -> Objects Modified (変更)
・プレイヤーと敵の位置に移動させる
Cost -> Reward modifiers
プレイヤーがターゲットに近づけば値が減る。離れれば値が増える。
Preconditions(前提条件)
・プレイヤーとゲートの位置が一致
・敵の数が0
・ゲートが開かれていない(ゲートのbool値がfalse)
Effects -> Objects Modified (変更)
・ゲートのbool値をtrueにする
Cost -> base value -> 100
Planフォルダで右クリック -> Create -> AI -> Planner -> Plan Definition
プレイヤーのプランを作成。
プレイヤーができるアクションを登録。
AI -> Planner => Generate Assembles
ヒエラルキーで空のオブジェクト作成して、Decision Controllerをアタッチ。
Plan Definitionにドラッグ&ドロップ。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Playables;
using Unity.AI.Planner.DomainLanguage.TraitBased;
using Generated.AI.Planner.StateRepresentation;
public class YamatoAgent : MonoBehaviour
{
public IEnumerator Move(GameObject yamato, Location target)
{
Debug.Log("Move");
var agent = yamato.GetComponent();
agent.SetDestination(target.Position);
//パス計算完了まで待機
yield return new WaitUntil(() => agent.pathStatus == NavMeshPathStatus.PathComplete);
//目的地到着まで待機
yield return new WaitUntil(() => !float.IsInfinity(agent.remainingDistance) && (agent.remainingDistance < 1));
//Done
}
public IEnumerator Attack(GameObject yamato,GameObject enemy,ITraitBasedObjectData gameState)
{
Debug.Log("Attack");
GameObject.Destroy(enemy);
//anime
yield return new WaitForSeconds(1);
//ワールドクエリに反映させる
var settings = gameState.GetTraitData();
var enemyCount = GameObject.FindGameObjectsWithTag("Enemy").Length;
settings.SetValue(GameSettings.FieldEmenyCount, enemyCount);
}
public IEnumerator OpenGate(GameObject gate)
{
Debug.Log("Open");
//var timeline = gate.GetComponent();
//timeline.Play();
//タイムライン終了まで待機
//yield return new WaitUntil(() => timeline.state != PlayState.Playing);
yield return new WaitForSeconds(1);
}
}
・Avaliable actions from the plan -> methodでC#スクリプトで作成したメソッドを関連づける。
・AttackのNext State UpdateはUse World Stateに変更。
・Execution Settings -> Execute Modeを"Wait For Minimum Plan Size"に変更
・Minimum Plan Sizeを50に変更
(Act immediatelyだと一番近いところに移動したり予期せぬ動きをしてしまう。)
AI -> Planner => Generate Assembles
敵を三体倒してゲートに向かうことを確認。
Window -> AI -> Plan Visualizerでプランを確認できる。
Youtubeの内容まとめ
■AI Plannerインストール
・edit->Project Setting->Pakege Manager->Enable Preview Packagesのチェックを入れる。
・Window->Packege Manager->AI Plannerをインストール。
■Assets下にフォルダ作成
AI
┣ Actions
┣ Plan
┣ Scripts
┗Trait
■Trait作成
・Traitフォルダで右クリック->Create->AI->Trait->Trait Definition
4つ作成。
敵HPを設定。
敵の数を設定。
ドアのbool値設定。
■コードを生成
AI -> Planner => Generate Assembles
■ゲームオブジェクトにTrait Componentをアタッチ
・プレイヤー
Trait Componentをアタッチ -> select trait -> プレイヤー、Location,Moveableにチェック
プレイヤーにはNavmeshAgentも必要。
移動範囲の地面もBakeしておく。
・ゲート
select trait -> ゲート、Location
・Enemy
select trait -> Enemy、Location
・Game State
select trait -> GameSettings
■アクションを作成
・Actionフォルダで右クリック->Create->AI->Planner -> Action Definition
Preconditions(前提条件)
・プレイヤーと敵の位置が一致
Effects -> Objects Modified (変更)
・敵の数を−1する
Cost -> base value -> -0.1
Preconditions(前提条件)
・プレイヤーと敵の位置が不一致
Effects -> Objects Modified (変更)
・プレイヤーと敵の位置に移動させる
Cost -> Reward modifiers
プレイヤーがターゲットに近づけば値が減る。離れれば値が増える。
Preconditions(前提条件)
・プレイヤーとゲートの位置が一致
・敵の数が0
・ゲートが開かれていない(ゲートのbool値がfalse)
Effects -> Objects Modified (変更)
・ゲートのbool値をtrueにする
Cost -> base value -> 100
■プランを作成
Planフォルダで右クリック -> Create -> AI -> Planner -> Plan Definition
プレイヤーのプランを作成。
プレイヤーができるアクションを登録。
■コードを生成
AI -> Planner => Generate Assembles
■プレイヤーを動かすAgentを作成
ヒエラルキーで空のオブジェクト作成して、Decision Controllerをアタッチ。
Plan Definitionにドラッグ&ドロップ。
■C#スクリプトを作成
■AgentオブジェクトのAction CallbackにAgentオブジェクトをドラッグ&ドロップ
■C#スクリプトを書く
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Playables;
using Unity.AI.Planner.DomainLanguage.TraitBased;
using Generated.AI.Planner.StateRepresentation;
public class YamatoAgent : MonoBehaviour
{
public IEnumerator Move(GameObject yamato, Location target)
{
Debug.Log("Move");
var agent = yamato.GetComponent
agent.SetDestination(target.Position);
//パス計算完了まで待機
yield return new WaitUntil(() => agent.pathStatus == NavMeshPathStatus.PathComplete);
//目的地到着まで待機
yield return new WaitUntil(() => !float.IsInfinity(agent.remainingDistance) && (agent.remainingDistance < 1));
//Done
}
public IEnumerator Attack(GameObject yamato,GameObject enemy,ITraitBasedObjectData gameState)
{
Debug.Log("Attack");
GameObject.Destroy(enemy);
//anime
yield return new WaitForSeconds(1);
//ワールドクエリに反映させる
var settings = gameState.GetTraitData
var enemyCount = GameObject.FindGameObjectsWithTag("Enemy").Length;
settings.SetValue(GameSettings.FieldEmenyCount, enemyCount);
}
public IEnumerator OpenGate(GameObject gate)
{
Debug.Log("Open");
//var timeline = gate.GetComponent
//timeline.Play();
//タイムライン終了まで待機
//yield return new WaitUntil(() => timeline.state != PlayState.Playing);
yield return new WaitForSeconds(1);
}
}
■Agentオブジェクトにメソッドを関連づけ
・Avaliable actions from the plan -> methodでC#スクリプトで作成したメソッドを関連づける。
・AttackのNext State UpdateはUse World Stateに変更。
■Decision Controller -> Settingsの歯車をクリック
・Execution Settings -> Execute Modeを"Wait For Minimum Plan Size"に変更
・Minimum Plan Sizeを50に変更
(Act immediatelyだと一番近いところに移動したり予期せぬ動きをしてしまう。)
■コードを生成
AI -> Planner => Generate Assembles
■ゲームを実行して確認
敵を三体倒してゲートに向かうことを確認。
■プランを確認したい
Window -> AI -> Plan Visualizerでプランを確認できる。
【このカテゴリーの最新記事】
-
no image
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/9983016
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック