IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity战斗系统 角色基础功能(一) -> 正文阅读

[游戏开发]Unity战斗系统 角色基础功能(一)

使用代码关联unity有限状态机

注:参考来自b站up主 Joker_Unity 的教程视频,完整视频链接:
unity中文课堂

在战斗系统中通常使用有限状态机对角色的各个状态(移动、攻击等)进行管理。为了应对复杂的状态转化,我们可以使用C#代码自定义状态机或行为树的节点。

先创建所需的基类:

  1. 状态基类
  2. 有限状态机基类(后续角色的基类)

在unity中创建 StateBase 、FSMController 脚本,如下:

创建状态基类

在该基类中应具有以下成员:

  1. 当前的状态(枚举值)
  2. 持有该状态对象的控制器
  3. 初始化函数
  4. 进入、停留、离开该状态时的函数

在定义枚举值时,由于后续需求的枚举类型是未知的,因此我们使用宽泛的Enum类型:

public Enum stateType;

完整代码如下:

using System;

/// <summary>
/// 状态对象基类
/// 之后的所以状态都继承自这个基类
/// 如:idel wlak attack
/// </summary>
public abstract class StateBase
{
    //当前 状态对象 代表的 枚举状态
    public Enum stateType;
    //当前控制的角色(角色控制器)
    public FSMController controller;

    public virtual void Init(FSMController controller, Enum stateType)
    {
        this.controller = controller;
        this.stateType = stateType;
    }
    
    //进入该状态时
    public abstract void OnEnter();
    //更新该状态时
    public abstract void OnUpdate();
    //退出该状态时
    public abstract void OnExit();
}

创建有限状态机基类

在该基类中应具有以下成员:

  1. 该状态机当前所处于的状态(枚举值)
  2. 当前所持有的状态对象
  3. 修改为指定状态的函数

完整代码为:

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

public abstract class FSMController : MonoBehaviour
{
    //当前状态
    public abstract Enum CurretState { get; set; }
    //当前的状态对象
    protected StateBase CurrStateObj;
    //保存所有可使用的状态(避免重复的创建或销毁对象影响性能)
    private List<StateBase> stateList;

    /// <summary>
    /// 修改状态
    /// </summary>
    /// <param name="NetState"></param>
    /// <param name="reCurrState"></param>
    public void ChangeState(Enum newState, bool reCurrState = false)
    {
        //如果要改变的新状态与当前状态相同 并且 不需要更新状态 则 返回
        if (newState == CurretState && !reCurrState) return;
        //如果当前持有的状态对象不为空 则 退出当前持有的状态对象
        if(CurrStateObj!=null) CurrStateObj.OnExit();
        
        //获取要改变的新状态对象并执行进入状态时的逻辑
        CurrStateObj = GetStateObj(newState);
        CurrStateObj.OnEnter();
    }

    /// <summary>
    /// 获取状态对象
    /// 给出一个枚举,返回与这个枚举同名的状态对象
    /// 要确保返回值不为空
    /// </summary>
    /// <param name="stateType"></param>
    /// <returns></returns>
    private StateBase GetStateObj(Enum stateType)
    {
        //如果列表中已有,返回已有的状态对象
        for (int i = 0; i < stateList.Count; i++)
        {
            if (stateList[i].stateType == stateType) return stateList[i];
        }
        //如果没有,创建新的状态对象并加入表中
        //反射  根据名称创建对象实例
        StateBase state=Activator.CreateInstance(Type.GetType(stateType.ToString())) as StateBase;
        state.Init(this,stateType);
        stateList.Add(state);

        return state;
    }

    protected virtual void Update()
    {
        if(CurrStateObj!=null) CurrStateObj.OnUpdate();
    }
}
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-30 12:15:25  更:2021-09-30 12:16:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/13 18:04:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码