<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">以下内容参照《unity3d 人工智能编程》--Aung Sithu Kyaw,Clifford Peters ,Thet Naing Swe编著</span>
最近在研究此书,花费几天时间,略有收获,所以写下此编文章,计划是3章,这是第一章,受个人能力限制,这个只是我的粗陋之见。
本文主要讲述的是有限状态机的框架
首先1,2是源码,3是我个人学习的一些收获。
首先贴下此书源码下载地址,http://hzbook.com/Books/8580.html,请大家尊重知识产权,如果有需要自行购买(非广告)。
父类:
using UnityEngine;
using System.Collections;
/// <summary>
/// 状态机父类
/// </summary>
public class FSM : MonoBehaviour {
protected Transform playerTransform;
//下一个点的位置
protected Vector3 destPos;
//巡逻点的数组
protected GameObject[] pointList;
//射击旋转的角度
protected float shootRate;
//经过的时间
protected float elapsedTime;
//炮塔
public Transform turret { get; set; }
//炮塔旋转点
public Transform bulletSpwanPoint { get; set; }
protected virtual void Initialize() { }
protected virtual void FSMUpdate() { }
protected virtual void FSMFixedUpdate() { }
protected Rigidbody rb;
void Start()
{
//初始化
Initialize();
rb = GetComponent<Rigidbody>();
//pointList = new GameObject[GameObject.FindGameObjectsWithTag("WandarPoint").Length];
}
void Update()
{
FSMUpdate();
}
void FixedUpdate()
{
FSMFixedUpdate();
}
}
然后是继承它的子类
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// 用于切换状态的建
/// </summary>
public enum Transition
{
None = 0,
SawPlayer,
ReachPlayer,
LostPlayer,
NoHealth
}
/// <summary>
/// 用于切换状态的值
/// </summary>
public enum FSMStateID
{
None = 0,
Patrolling,
Chasing,
Attacking,
Dead
}
public class AdvancedFSM : FSM
{
//存储但前类的数组
private List<FSMState> fsmStates;
//当前状态的ID(值)
private FSMStateID currentStateID;
public FSMStateID CurrentStateID
{
get { return currentStateID; }
}
//当前状态
private FSMState currentState;
private FSMState CurrentState
{
get { return currentState; }
}
//构造方法,初始化
public AdvancedFSM()
{
fsmStates = new List<FSMState>();
}
/// <summary>
/// 增加FSM状态
/// </summary>
/// <param name="fsmState"></param>
public void AddFSMState(FSMState fsmState)
{
//容错处理
if (fsmState == null) return;
//往字典里面添加FSM状态
if (fsmStates.Count == 0)
{
fsmStates.Add(fsmState);
currentState = fsmState;
currentStateID = fsmState.ID ;
return;
}
foreach (FSMState state in fsmStates )
{
if (state.ID == fsmState.ID)
{
print("错误!");
return;
}
}
fsmStates.Add(fsmState);
}
/// <summary>
/// 删除FSM里面指定的状态
/// </summary>
/// <param name="fsmState"></param>
public void DeleteState(FSMStateID fsmState)
{
//容错
if (fsmState == FSMStateID.None) return;
//删除
foreach (FSMState state in fsmStates )
{
fsmStates.Remove(state);
return;
}
}
/// <summary>
/// 执行状态转换
/// </summary>
/// <param name="trans"></param>
public void PerformTransition(Transition trans)
{
//容错处理
if (trans == Transition.None)
return;
FSMStateID id = currentState.GetOutputState(trans);
if (id == FSMStateID.None)
return;
//切换状态
currentStateID = id;
foreach (FSMState state in fsmStates )
{
if (state.ID == currentStateID)
{
currentState = state;
break;
}
}
}
}
下面这个是人工智能(有限状态机)的所有行为的父类,不继承FSM类,但是会调用上面两个类的方法
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// 用于切换状态的建
/// </summary>
public enum Transition
{
None = 0,
SawPlayer,
ReachPlayer,
LostPlayer,
NoHealth
}
/// <summary>
/// 用于切换状态的值
/// </summary>
public enum FSMStateID
{
None = 0,
Patrolling,
Chasing,
Attacking,
Dead
}
public class AdvancedFSM : FSM
{
//存储但前类的数组
private List<FSMState> fsmStates;
//当前状态的ID(值)
private FSMStateID currentStateID;
public FSMStateID CurrentStateID
{
get { return currentStateID; }
}
//当前状态
private FSMState currentState;
private FSMState CurrentState
{
get { return currentState; }
}
//构造方法,初始化
public AdvancedFSM()
{
fsmStates = new List<FSMState>();
}
/// <summary>
/// 增加FSM状态
/// </summary>
/// <param name="fsmState"></param>
public void AddFSMState(FSMState fsmState)
{
//容错处理
if (fsmState == null) return;
//往字典里面添加FSM状态
if (fsmStates.Count == 0)
{
fsmStates.Add(fsmState);
currentState = fsmState;
currentStateID = fsmState.ID ;
return;
}
foreach (FSMState state in fsmStates )
{
if (state.ID == fsmState.ID)
{
print("错误!");
return;
}
}
fsmStates.Add(fsmState);
}
/// <summary>
/// 删除FSM里面指定的状态
/// </summary>
/// <param name="fsmState"></param>
public void DeleteState(FSMStateID fsmState)
{
//容错
if (fsmState == FSMStateID.None) return;
//删除
foreach (FSMState state in fsmStates )
{
fsmStates.Remove(state);
return;
}
}
/// <summary>
/// 执行状态转换
/// </summary>
/// <param name="trans"></param>
public void PerformTransition(Transition trans)
{
//容错处理
if (trans == Transition.None)
return;
FSMStateID id = currentState.GetOutputState(trans);
if (id == FSMStateID.None)
return;
//切换状态
currentStateID = id;
foreach (FSMState state in fsmStates )
{
if (state.ID == currentStateID)
{
currentState = state;
break;
}
}
}
}
此篇结束