FSM有限状态机实现简单的巡逻追击AI

本文介绍了如何利用有限状态机(FSM)来实现一个简单的AI巡逻和追击行为。AI会在预设的四个点位之间进行巡逻,当检测到目标时则切换到追击状态。
摘要由CSDN通过智能技术生成

Points表示四个点位,敌人在这四个点之间来回巡逻Points表示四个点位,敌人在这四个点之间来回巡逻。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;

/// <summary>
/// 状态ID
/// </summary>
public enum FSMStateID
{
   
    NullFSMStateID,
    PatrolFSMStateID,//巡逻状态
    ChaseFSMStateID,//追逐状态
}

/// <summary>
/// 状态转化条件
/// </summary>
public enum FSMTransition
{
   
    SeePlayer,//看到主角(目标)
    LeavePlayer,//远离敌人(目标)
}

public class FSMSystem
{
   
    private FSMStateID mCurrentStateID;
    private FSMBaseState mCurrentState;

    private Dictionary<FSMStateID, FSMBaseState> mFSMStateDic = new Dictionary<FSMStateID, FSMBaseState>();


    public void AddFSMSate(FSMBaseState state)
    {
   
        if (state == null)
        {
   
            Debug.Log("角色状态为空,无法添加");
            return;
        }
        if (mCurrentState == null)
        {
   
            //第一个添加的状态被作为系统首个运行的状态
            mCurrentStateID = state.mStateID;
            mCurrentState = state;
            mCurrentState.StateStart();
        }
        if (mFSMStateDic.ContainsValue(state))
        {
   
            Debug.Log("容器内存在该状态");
            return;
        }
        mFSMStateDic.Add(state.mStateID, state);
    }

    public void DeleteFSMSate(FSMBaseState state)
    {
   
        if (state == null)
        {
   
            Debug.Log("角色状态为空,无法添加");
            return;
        }
        if (!mFSMStateDic.ContainsValue(state))
        {
   
            Debug.Log("容器内不存在该状态");
            return;
        }
        mFSMStateDic.Remove(state.mStateID);
    }

    //更新(执行)系统
    public void UpdateSystem()
    {
   
        if (mCurrentState != null)
        {
   
            mCurrentState.StateUpdate();
            mCurrentState.TransitionReason(
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值