ふと思ってAIなど作成出来ないか色々と試している。
AIを構成するパーツは2つで「判断」「実行」さえしっかりしてればソコソコの物は作れると踏んでる。もう少し細かいパラメータはソース丸っと改造すればいいや。
今試しているもののベースは[Unity]作成したScriptableObjectを呼び出すによる挙動の差替え。やってる事はタスクシステムみたいな物で下のコードを継承したAI挙動をタスクシステム宜しくぶん回す事。
using UnityEngine;
using System.Collections;namespace ScriptableObjectAI
{
public abstract class AI : ScriptableObject
{
protected AIController self;
public void Registor (AIController obj){ self = obj; }
public virtual void Init (){}
public virtual bool Update (){ return true; }
}
}
using UnityEngine;
using System.Collections;namespace ScriptableObjectAI
{
public class AIMove : AI
{public Vector3 direction;
public float time;
private float finishTime;public override void Init ()
{
finishTime = time + Time.timeSinceLevelLoad;
}public override bool Update ()
{
if (Time.timeSinceLevelLoad > finishTime) {
return true;
} else {
self._transform.position += direction * Time.deltaTime * self.speed;
return false;
}
}
}
}
これでScriptableObjectを生成すると、下のようなパラメータ外出しの物が出来上がる。MonoBehaviourを継承したコンポーネントを大量に作って収集してやるのも考えたが、2つの理由があって却下。
1. 挙動に名前がつけにくい
2. パターン化されている挙動はコピー&ペーストが面倒
実際に動かす側はこんな感じ。aisにAIを継承したアクションを登録して、nextsでその時の挙動を設定する。
using UnityEngine;
using System.Collections;namespace ScriptableObjectAI
{
public class AIManager : MonoBehaviour
{
public AI[] ais;
public int[] nexts;
public int current = 0;void Start ()
{
var aicontroller = GetComponent();
foreach (var ai in ais) {
ai.Registor (aicontroller);
}
ais [current].Init ();
}void Update ()
{
if (ais [ nexts[current] ].Update ()) {
current = (++current < nexts.Length) ? current : 0;
ais [ nexts[current] ].Init ();
}
}
}
}
次はAIの状況により挙動がスイッチするような形にしようと思う。
どうすればよいかなー。
最近色々と研究している内に時間切れとなりブログが更新出来なくなっていたので、初心に帰り出来た所まででどんどん書いていこうと思う。読みにくくなるけど勘弁な。
admin.blog.fc2.comが反応無くて画像が投稿出来ない・・・一体何が