GameFrameWork框架(Unity3D)使用笔记(七)游戏主流程ProcedureMain——虽然游戏本来没有怪物但是为了使用状态机模块写一个简单怪物AI吧(下)

【GameFramework】有关 GF Demo的下载和运行问题 新手期就到这里就可以了,如果想看 GF 的核心代码学习,那么下个小节我们介绍如何替换 GF 的dll,用源码的形式放到打飞机项目里。上面的章节介绍了,如何把项目跑起来。学习下)内嵌到打飞机项目中的,直接下载 ZIP 的时候,没有下载子模块内容,所以就没有 GF+UGF 的东西在,可以看到 Asset/GameFramework/ 目录下是空文件夹。直接把上面解压出来的文件夹,拷贝到 Assets/GameFramework/Libraries/ 下面,把原有的 GameFramework.dll,删除。 阅读详情

这篇直接接着上一篇开始写啦。


目录

四、开始撸状态机代码!

1、写状态类

IdleState      

AttackingState

ChasingState

ReturningState

 2、Enemy类

五、测试运行


四、开始撸状态机代码!

        使用GF的状态机的话,我们要做的主要是实现一下各个状态类。状态机的创建使用这个模块的Create函数即可,然后就可以用了。

        所以实际上是开始撸状态代码!

1、写状态类

        GF里的状态机需要继承FsmState这个类......嗯不多说了直接开始干就知道了!

        有个注意点这里先提一下,就是状态类里面使用ChangeState<>()方法并不是立即切换状态,下面的代码不执行。并且执行这个方法后就会执行该状态类的OnLeave()。所以要注意如果ChangeState<>()后面的内容不想执行的话要加上return语句。(否则的话比如某个引用在OnLeave()的时候释放了,那在ChangeState<>()后面执行就会报错。)

        注:因为状态机中要调用Enemy实体类的内容,所以写状态的时候实体类里面也做了点工作,写完状态类后会贴出来代码。

  • IdleState      

     创建一个IdleState.cs:

            

        类继承GameFramework.Fsm.FsmState<T> ,生成一下重写:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityGameFramework.Runtime;
using GameFramework.Fsm;
namespace ShadowU
{
    public class IdleState : FsmState<Enemy>
    {
        protected override void OnDestroy(IFsm<Enemy> fsm)
        {
            base.OnDestroy(fsm);
        }

        protected override void OnEnter(IFsm<Enemy> fsm)
        {
            base.OnEnter(fsm);
        }

        protected override void OnInit(IFsm<Enemy> fsm)
        {
            base.OnInit(fsm);
        }

        protected override void OnLeave(IFsm<Enemy> fsm, bool isShutdown)
        {
            base.OnLeave(fsm, isShutdown);
        }

        protected override void OnUpdate(IFsm<Enemy> fsm, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(fsm, elapseSeconds, realElapseSeconds);
        }
    }

}

 然后就是很简单的根据上一篇的设计填代码就行了:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityGameFramework.Runtime;
using GameFramework.Fsm;
namespace ShadowU
{
    public class IdleState : FsmState<Enemy>
    {
        private Enemy owner;       //状态机所控制的Enemy实体

        private float moveTimer;   //移动计时器,归零的时候移动一次
        private Vector3 targetPos; //Idle移动的时候的随目标点
        private float speed; //速度
        protected override void OnDestroy(IFsm<Enemy> fsm)
        {
            base.OnDestroy(fsm);
        }

        protected override void OnEnter(IFsm<Enemy> fsm)
        {
            base.OnEnter(fsm);
            owner = fsm.Owner;
            speed = owner.enemyData.Speed;

            SetMoveTimer();
            SetRandomTargetPos();
        }

        protected override void OnInit(IFsm<Enemy> fsm)
        {
            base.OnInit(fsm);
        }

        protected override void OnLeave(IFsm<Enemy> fsm, bool isShutdown)
        {
            base.OnLeave(fsm, isShutdown);
            owner = null;
        }

        protected override void OnUpdate(IFsm<Enemy> fsm, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(fsm, elapseSeconds, realElapseSeconds);

            if (moveTimer > 0)
            {
                if (Vector3.Distance(targetPos, owner.transform.position) > 0.1)
                {
                    //如果还没有到达目标位置
                    //向目标位置移动
                    Vector3 direction = Vector3.Normalize(targetPos - owner.transform.position);
                    owner.transform.Translate(direction * speed * elapseSeconds);
                }
                else
                {
                    //已经到了目标位置
                    //Enemy就停在原地啥也不做
                }
                
            }
            else
            {
                //重新选择一个目标点移动
                SetMoveTimer();
                SetRandomTargetPos();
            }
            moveTimer -= elapseSeconds;

            //如果玩家进入了发现范围,则进入追逐状态
            if (owner.IsPlayerFound())
            {
                ChangeState<ChasingState>(fsm);//状态机的状态切换
            }
        }
        /// <summary>
        /// 随机设置一个0.5-3秒的Timer 
        /// </summary>
        private void SetMoveTimer()
        {
            moveTimer = Random.Range(0.5f,3.0f);
        }
        /// <summary>
        /// 随机设置一个IdleRange内的目标点
        /// </summary>
        private void SetRandomTargetPos()
        {
            float idleRange = -owner.enemyData.IdleRange;
            targetPos = new Vector3(Random.Range(-idleRange,idleRange),owner.transform.position.y,owner.transform.position.z);
        }
    }

}

  • AttackingState

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GameFramework.Fsm;
using UnityGameFramework.Runtime;
namespace ShadowU
{
    public class AttackingState : FsmState<Enemy>
    {
        private Enemy owner;
        private Transform targetTran;
        private float speed = 0.7f; //速度  因为即便进入了攻击范围还要靠近走走
        private Color preCol;       //之前Enemy的颜色
        protected override void OnDestroy(IFsm<Enemy> fsm)
        {
            base.OnDestroy(fsm);
        }

        protected override void OnEnter(IFsm<Enemy> fsm)
        {
            base.OnEnter(fsm);
            owner = fsm.Owner;
            targetTran = owner.targetTran;

            //进入攻击状态  Enemy变为红色
            preCol = owner.GetComponent<SpriteRenderer>().material.color;
            owner.GetComponent<SpriteRenderer>().material.color = Color.red;
            Log.Info("变红色!");
        }

        protected override void OnInit(IFsm<Enemy> fsm)
        {
            base.OnInit(fsm);
        }

        protected override void OnLeave(IFsm<Enemy> fsm, bool isShutdown)
        {
            base.OnLeave(fsm, isShutdown);

            //退出攻击状态 颜色变回去
            owner.GetComponent<SpriteRenderer>().material.color = preCol;

            owner = null;
            targetTran = null;
        }

        protected override void OnUpdate(IFsm<Enemy> fsm, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(fsm, elapseSeconds, realElapseSeconds);

            //慢慢靠近目标
            Vector3 direction = Vector3.Normalize(targetTran.position - owner.transform.position);
            owner.transform.Translate(direction * speed * elapseSeconds);

            //如果超出了攻击范围 则进入追逐状态
            if (!owner.IsInAttackRange())
            {
                ChangeState<ChasingState>(fsm);
            }
        }
    }
}

  • ChasingState

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GameFramework.Fsm;
namespace ShadowU
{
    public class ChasingState : FsmState<Enemy>
    {
        private Enemy owner;
        private Transform targetTran;
        private float speed; //速度
        protected override void OnDestroy(IFsm<Enemy> fsm)
        {
            base.OnDestroy(fsm);
        }

        protected override void OnEnter(IFsm<Enemy> fsm)
        {
            base.OnEnter(fsm);
            owner = fsm.Owner;
            targetTran = owner.targetTran;
            speed = owner.enemyData.Speed;
        }

        protected override void OnInit(IFsm<Enemy> fsm)
        {
            base.OnInit(fsm);
        }

        protected override void OnLeave(IFsm<Enemy> fsm, bool isShutdown)
        {
            base.OnLeave(fsm, isShutdown);
            owner = null;
            targetTran = null;
        }

        protected override void OnUpdate(IFsm<Enemy> fsm, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(fsm, elapseSeconds, realElapseSeconds);

            //追逐玩家
            Vector3 direction = Vector3.Normalize(targetTran.position - owner.transform.position);
            owner.transform.Translate(direction * speed * elapseSeconds);
            
            //如果超出了追逐的活动范围则进入返回状态
            if (owner.IsOutOfChasingRange())
            {
                ChangeState<ReturningState>(fsm);
                return;
            }
            //如果进入了攻击范围则进入攻击状态
            if (owner.IsInAttackRange())
            {
                ChangeState<AttackingState>(fsm);
            }
        }
    }
}
  • ReturningState

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GameFramework.Fsm;
namespace ShadowU
{
    public class ReturningState : FsmState<Enemy>
    {
        private Enemy owner;
        private float speed;
        private float timer; //敌人返回两秒后才会检测玩家是否进入发现范围,否则如果玩家一直在发现范围内Enemy会卡在追逐范围边缘。
        protected override void OnDestroy(IFsm<Enemy> fsm)
        {
            base.OnDestroy(fsm);
        }

        protected override void OnEnter(IFsm<Enemy> fsm)
        {
            base.OnEnter(fsm);
            owner = fsm.Owner;
            speed = owner.enemyData.Speed;
            timer = 2.0f;   
        }

        protected override void OnInit(IFsm<Enemy> fsm)
        {
            base.OnInit(fsm);
        }

        protected override void OnLeave(IFsm<Enemy> fsm, bool isShutdown)
        {
            base.OnLeave(fsm, isShutdown);
            owner = null;
        }

        protected override void OnUpdate(IFsm<Enemy> fsm, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(fsm, elapseSeconds, realElapseSeconds);

            //向Enemy的原点移动
            Vector3 direction = Vector3.Normalize(owner.enemyData.Origin- owner.transform.position);
            owner.transform.Translate(direction * speed * elapseSeconds);

            if(timer > 0)
            {
                timer -= elapseSeconds;
            }
            else
            {
                //玩家进入发现范围 转换到  追逐状态
                if (owner.IsPlayerFound())
                {
                    ChangeState<ChasingState>(fsm);
                    return;
                }
            }
            //Enemy进入了巡逻范围 则转到巡视状态
            if (owner.IsInIdleRange())
            {
                ChangeState<IdleState>(fsm);
            }
        }
    }
}

 2、Enemy类

       Enemy类也进行了一点修改,主要就是加入了四个检测:IsPlayerFound(),IsInAttackRange(),IsOutOfChasingRange()和IsInIdleRange();以及创建、启动和销毁状态机的内容。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GameFramework.Fsm;
using UnityGameFramework.Runtime;
namespace ShadowU
{
    public class Enemy : EntityLogic
    {
        public EnemyData enemyData;//敌人实体数据类
        public Transform targetTran; //玩家Transform  即Enemy追逐的目标
        private IFsm<Enemy> fsm;     //状态机
        protected override void OnInit(object userData)
        {
            base.OnInit(userData);
            CachedTransform.position = ((EnemyData)userData).Position;
        }

        protected override void OnShow(object userData)
        {
            base.OnShow(userData);
            enemyData = (EnemyData)userData;
            /*
            Log.Debug("敌人加载成功");
            Log.Info(enemyData.Origin);
            Log.Info(enemyData.IdleRange);
            Log.Info(enemyData.ChasingRange);
            Log.Info(enemyData.AlarmRange);
            Log.Info(enemyData.AttackRange);
            Log.Info(enemyData.Speed);
            */
            targetTran = GameObject.FindGameObjectWithTag("Player").transform;
            //状态类的列表
            List<FsmState<Enemy>> states = new List<FsmState<Enemy>>(){ new IdleState() ,new ChasingState(),new ReturningState(),new AttackingState()};
            //创建状态机
            fsm = GameEntry.Fsm.CreateFsm<Enemy>("EnemyFsm",this,states);
            //启动状态机
            fsm.Start<IdleState>();
        }

        protected override void OnUpdate(float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(elapseSeconds, realElapseSeconds);

        }
        /// <summary>
        /// 是否已经发现了玩家(检测玩家是否在Alarm范围内)
        /// </summary>
        /// <returns></returns>
        public bool IsPlayerFound()
        {
            return Vector3.Distance(transform.position,targetTran.position)<enemyData.AlarmRange;
        }
        /// <summary>
        /// 玩家是否处于Enemy的攻击范围
        /// </summary>
        /// <returns></returns>
        public bool IsInAttackRange()
        {
            return Vector3.Distance(transform.position, targetTran.position) < enemyData.AttackRange;
        }
        /// <summary>
        /// Enemy是否超出了追逐范围
        /// </summary>
        /// <returns></returns>
        public bool IsOutOfChasingRange()
        {
            return Vector3.Distance(transform.position, enemyData.Origin) > enemyData.ChasingRange;
        }
        public bool IsInIdleRange()
        {
            return Vector3.Distance(transform.position, enemyData.Origin) < enemyData.IdleRange;
        }

        protected override void OnHide(bool isShutdown, object userData)
        {
            base.OnHide(isShutdown, userData);

            GameEntry.Fsm.DestroyFsm(fsm);
            fsm = null;
        }
    }
}



五、测试运行

        看看效果!

        

 搞定!

GameFramework框架详解之 Fsm状态机 FSM(有限状态机)是一种在游戏编程中非常常用的编程技术,可以方便地管理游戏中的各种状态转换。在Gameframework中,FSM也被广泛使用,并且该框架提供了方便易用的FSM API,使得我们可以在Unity项目中快速实现FSM逻辑。有限状态机(Finite-state machine,FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。 阅读详情

相关推荐

Unity 游戏框架之GameFramework和ET对比

Unity 框架 GF 和 ET 哪个更好用,各自的优点,缺点是什么? 随着Unity的不断发展,现在出现了很多比较牛逼的 开源 框架,其中,我觉得 最厉害的是 Game Framework 和 ET 这2个框架。 ET:https://github.com/egametang/ET GameFramework:https://github.com/EllanJiang/UnityGameFramework

TxNet 4万+

GameFramework框架

ellan做事风格非常低调,属于实干派,几乎没有宣传过框架,但是多年持续维护更新,框架实际是提炼于知名的商业项目。虽然框架文档十分匮乏,新人上手相对困难,但是GF依然靠着过硬的代码质量吸引开发者使用和学习。每个模块的xxxManager都会实现对应的IxxxManager接口,UGF只会直接引用接口,不会直接引用Manager。如果需要调用依赖于引擎实现的接口,可以定义对应的IHelper接口并在UGF层实现接口,GF层只管调用不管具体实现。对常用模块封装,规范开发过程,保证产品质量,内置19个模块。

—巨人绿 4507

【GameFramework框架内置模块】9、有限状态机(FSM)

这篇文章分享FSM有限状态机,了解过StarForce源码的同学相比都比较了解,GameFramework框架给我们抽象了一个Procedure流程的概念。这个Procedure流程可以方便的处理我们游戏从启动到游戏的各个流程阶段的处理逻辑,实现的核心就是FSM状态机,内部的Procedure流程就是不同的FsmState状态。接下来,就是FSM有限状态机的教程了。有限状态机(Finite-state machine,FSM)

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2533

初识GameFrameWork(二)有限状态机FSM篇

FSM(Finite State Machine)有限状态机,主要用于管理一些线性的流程,例如怪物的AI,游戏的流程控制等等。本篇将着重介绍GF层的FSM模块以及在Unity中的使用。

m0_74936198的博客 1745

GameFramework框架详解之 UI框架

UI框架是我们不管开发游戏还是App,都必不可少的一个模块。好的UI框架凤毛麟角,但是Gameframework可以算是其中一个了。今天我们就来拆解一下GF的UI框架。Unity技术开发干活 - 总目录Unity精选 - 专栏目录Unity之ASE入门到精通 - 专栏目录UniRx入门到精通 - 专栏目录Unity技术开发干活 - 总目录。

TxNet 6975

【GameFramework框架】四、GameFramework框架内置模块

【GameFramework框架内置模块】1、全局配置(Config)【GameFramework框架内置模块】2、数据节点(Data Node)【GameFramework框架内置模块】3、数据表(Data Table)【GameFramework框架内置模块】4、调试器(Debugger)【GameFramework框架内置模块】5、下载(Download)【GameFramework框架内置模块】6、实体(Entity)【GameFramework框架内置模块】7、事件(Event)

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 5643

GameFrameWork框架(Unity3D)使用笔记(七)游戏主流程ProcedureMain——虽然游戏本来没有怪物但是为了使用状态机模块写一个简单怪物AI吧(上)

状态机是游戏开发中很常用的东西,GF中也有对应的模块FSM(有限状态机)。但是呢,前面我用到的玩家预制体里的控制脚本是一把梭的。。。而且代码是很久以前写的可读性很差。。。(就是说不想再重构了呗),然后在这个游戏里目前并没有AI怪物的需求。。。所以为了强行练习使用GF的有限状态机模块,我准备写一个简单的怪物AI,使用FSM来完成。

HowToPause的博客 1414

别再浪费主板上的PCIE插槽了!手把手教你用VL805芯片打造高速USB3.0扩展坞

本文详细介绍了如何利用VL805芯片将主板闲置的PCIE插槽改造为高性能USB3.0扩展坞。从芯片选型、电路设计到焊接工艺和系统调试,提供了一套完整的实战指南,帮助用户充分释放硬件潜能,实现高达5Gbps的传输速度。

weixin_27134495的博客 326

GameFramework——FSM

前言 提到FSM有限状态机,做过游戏的人应该都知道简单的敌人AI很多情况下都是基于这个实现的。其实前不久吉比特面试官也问过我,有没有使用过状态机模式来运行整个游戏,我根本听不懂他在说什么。直到看了GF之后,才懂了些。 GameFramework整个游戏流程也是基于状态机来实现的,我们先在这篇笔记看看状态机,下一篇再研究流程~ 总的来说,我觉得只要是能切换的都可以基于这个模块来实现?比如idle状态切换到move状态 标题 ...

白小飞 879

技术美术个人笔记(十三)——Houdini金属弯曲模拟

最近接收到使用Houdini自动解算破损/砸坏/扭曲汽车的需求,以此文记录制作金属弯曲自动解算工具时使用的部分节点解析;

小谁的博客 2148

从理论到实践:用CST微波工作室完成单站雷达RCS仿真的完整指南

本文提供了一份利用CST微波工作室进行单站雷达RCS仿真的完整实践指南。文章深入剖析了从求解器选择(重点推荐积分方程法)、模型与材料设置、平面波激励定义到后处理分析的完整逻辑链条,旨在帮助工程师不仅完成仿真,更能理解其背后的物理原理与工程考量,从而高效、精准地评估目标的电磁散射特性。

weixin_29256771的博客 180

GameFramework深度解析 : FSM有限状态机架构设计与框架简介

FSM有限状态机框架详解!!!

不定时分享所学所得,包括游戏开发和其他收获! 1165

快速了解GPU分布通信技术:PCIe、NVLink与NVSwitch

PCIe(Peripheral Component Interconnect Express)是一种高速串行计算机扩展总线标准,广泛用于连接计算机的各种硬件设备。PCIe4.0是目前较为先进的版本,提供了高达64GB/s的带宽。InfiniBand是一种用于高性能计算的高速互连技术,通过交换机在节点之间直接创建一个专用的受保护通道。InfiniBand适配器通过PCIe接口连接到CPU,另一端通过InfiniBand网络端口连接到InfiniBand子网。

全世界的博客 7543

GameFrameWork框架(Unity3D)使用笔记(八) 实现场景加载进度条

游戏在转换场景的时候,需要花费时间来加载相关的资源。而这个过程往往因为游戏场景的规模和复杂度以及玩家电脑配置的原因花费一小段时间(虽然这个项目里用不到)。目前大多数游戏在转换关卡这种时候都会有个加载界面,显示加载进度。这样玩家可以对啥时候能加载好有个心理预估(判断要不要因为加载太久浪费时间不如卸载游戏(开个玩笑))。那本篇的任务就是探究如何在UGF框架下实现加载场景的进度条功能。

HowToPause的博客 4699

江科大笔记—OLED调试工具

OLED介绍及调试工具

m0_62005595的博客 657

房产平台系统小程序源码

🏠 一键解锁购房新体验 🔓房产小程序 实现前端 发布二手房 租房 商品 求租 求购等信息;后台发布 新房,二手房租房 商品 写字楼 求租求购等房源信息;功能完善的一块房产小程序。

2401_84413757的博客 795

简易版GameFramework游戏框架搭建教程(三)Fsm

在前一篇文章中,我们已经将框架里几个基本的类编写完成,在本文中,将开始正式进行功能模块的开发我们第一个开发的模块将是Fsm模块,因为作为管理整个游戏运行时生命周期的Procedure模块,是基于Fsm的官网中关于Fsm的介绍首先新建一个Fsm文件夹,在其中再新建4个类文件Fsm是状态机类,IFsm是状态机的接口(可能会有人疑惑为什么还要再写一个接口?别急,这一点到后面就能明白了),FsmState...

道友请留步 5097

深度学习论文: Towards Total Recall in Industrial Anomaly Detection

在大规模工业制造中,能够准确检测出有缺陷的零件至关重要。我们在这项工作中面临的一个特殊挑战是冷启动问题:仅使用正常的示例图像来训练模型。虽然可以针对每个类别手动设计解决方案,但我们的目标是构建能够自动适用于多个任务的系统。最佳的方法是将ImageNet模型的嵌入特征与异常检测模型结合起来。在本文中,我们在这一研究基础上进行了扩展,并提出了PatchCore,它利用了一个具有最大代表性的正常补丁特征内存库。通过这种方法,我们能够更好地解决冷启动问题,并提高系统在多任务上的性能。

mingo_敏 1875

GameFramework篇:新项目搭建GF框架需知

1.AB包相关配置 GF资源管理实属牛批,但要使用它,并不是全自动的,还是要配置一下 创建一个静态类,类名随意,注意里面至少要包含以下三个属性,后面的地址所指就是打AB包所必须的三个配置文件(这个地址可以自己更改,注意改变路径就行) [AssetBundleBuilderConfigPath] public static string AssetBundleBuilderC...

设计师养成记 7106

03 Token、Embedding、上下文窗口:开发者必须懂的三个基本概念

Token、Embedding 和上下文窗口是大模型应用开发的三个基础概念。本文从成本、速度、检索和上下文设计四个角度讲清它们的工程意义,帮助开发者理解为什么同一段内容会超限、变贵,为什么 RAG 能做语义检索。

老于的笔记的专栏 407

“华为杯”全国研究生数学建模往届试题(从2012到2016)

这个是研究生数学建模的试题,由于优快云限制上传文件大小不得大于220M,所以只能将所有往届试题拆分开来上传,其他的可以在我的账号下面继续下载

[2021.10.21]<呆头熊的开发日记>怪物AI之有限状态机(1)

经过跟队长的一致讨论,决定还是用<有限状态机>来实现怪物的行为逻辑,这样耦合性更低,更好操作。 这次的还是定点巡逻的小怪。 有三个脚本文件,IState作为接口,NewIdleS记录所有存在的状态,NewFSM为有限状态机。 具体实现形式: 1.接口: public interface NewIstate { void OnEnter(); void OnUpdate(); void OnExit(); } 2.记录所有存在的状态: using Sy

热爱游戏开发的呆头熊。的小本本 295

java毕业设计 基于SpringBoot+Mybatis的学生就业管理系统的设计与实现+详细文档+全部资料(优秀项目).zip

【资源说明】java毕业设计 基于SpringBoot+Mybatis的学生就业管理系统的设计与实现+详细文档+全部资料(优秀项目).zipjava毕业设计 基于SpringBoot+Mybatis的学生就业管理系统的设计与实现+详细文档+全部资料(优秀项目).zip【备注】1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!2、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕设项目、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。3、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。欢迎下载,沟通交流,互相学习,共同进步!

Unity3D开发之手游热更,基于GameFramework(GF),涵盖Android|IOS|资源包|打包等功能非专业团队勿扰

Unity打包和热更

大话程序员 2260

2024重庆市道路路网矢量数据图层Shp数据最新版下载

2024重庆市道路路网矢量数据图层,shp格式,包含多级道路分类属性,路名等属性,包含全省几十万条道路,坐标系为WGS1984坐标系统

山东大学数据结构课设二叉树实现及分析

山东大学数据结构课设二叉树实现及分析。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

GameFrameWork框架(Unity3D)使用笔记(五)游戏主流程ProcedureMain

前面已经完成了UI界面切换等功能,但是真正的游戏内容主体部分还没有开始,下面就来实现游戏的主流程。本篇的内容又用到了GF的一个新模块:Entity。这一次我们主要实现的就是在场景中生成主角。

HowToPause的博客 2545

Gameframework(开发环境搭建)

前言 最近看到E大写的基于unity的GameFramework,是一个集成了很多模块的游戏开发框架,所以准备深度的学习这个框架,接下来就开始爆肝更新这个框架的所有模块的用法和实现的原理,在这个之前我们需要把开发环境搭建好。 1.获取工程 Gameframework写的游戏demo:https://github.com/EllanJiang/StarForce Gameframework....

大将军岂可有勇无谋? 2141

GameFramework食用指南

GameFramework使用指南;

小紫苏的博客 2200

Unity Game FrameWork—模块使用—有限状态机

如果用if else来判断则太过复杂不便于梳理流程,以及一堆条件变量控制,当状态改变或触发条件改变,整个流程的维护是很复杂的,我们不能专注当前状态要做的事,需要去看前后关联的触发条件是否会有问题,这些条件变量在其他状态是怎样的,会不会由于条件变量的改变导致其它问题,因此诞生了状态机。状态机所解决的问题与流程需要完成的事情是完全吻合的。创建ProcedureFSM流程类,在流程类中创建英雄实体并添加逻辑类FSM_Hero,英雄逻辑类中创建四种状态类,随后在四个状态类中完成触发及状态切换等工作。

qq_37619255的博客 1266
上一篇: GameFrameWork框架(Unity3D)使用笔记(七)游戏主流程ProcedureMain——虽然游戏本来没有怪物但是为了使用状态机模块写一个简单怪物AI吧(上)
下一篇: Unity3D异步加载场景SceneManager.LoadSceneAsync()卡住,并不异步,获取process直接到0.9的问题
咖啡咖_CoffCa
博客等级 码龄6年 116粉丝 58原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡咖_CoffCa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值