某足球游戏
文章目录
- 1. 主要的类
- 1.1. IBehaviorScheduler
- 1.2. BehaviorScheduler
- 1.3. PlayerActionExecutor
- 1.4. PlayerAIExecutor
- 1.5. BallActionExecutor
- 1.6. CoachSkillEventConsumer
- 1.7. MatchEventConsumer
- 1.8. TeamStateManager
- 1.9. GameHub
- 1.10. Action
- 1.11. DottedLine 划线击球射门
- 1.12. AthleteLabels 头顶板
- 1.13. TimeLine 时间控制,暂停,运行,挂起
- 1.14. DataProvider
- 2. 一些约定
- 3. 配置文件
主要的类
IBehaviorScheduler
BehaviorScheduler
- 驱动PlayerActionExecutor,PlayerAIExecutor,BallActionExecutor,CoachSkillEventConsumer,MatchEventConsumer的Update,LateUpdate,FixedUpdate
PlayerActionExecutor
- 每个队员身上都会挂一个该脚本,并在Start()中,向GameHub注册自己
- 驱动:BallActionHandler,PlayerStateHandler,PlayerTransformHandler,ExtraTimeActionExecutor
- PlayerStateHandler
- 持有ActionBuffer
- 触发NotifyNewActionStart事件
- 有三态
- Stop 当前没有动作运行中
- Running 当前有动作在运行中,此状态下,如果发现需中断,则查看自身动作是否为休闲状态或者动画是否播完,如果满足则响应中断。
- TakeOverByOthers 受到外部中断指令,指示现在角色动作由外部接管,不再产生自主行为
- IKHandler
- 控制守门员救球时的反向动力学
- 主要方法:
OnNewSaveActionStart
- BallActionHandler
- 每个队员身上都会挂一个该脚本,并在Start()中,向GameHub注册自己
- 主要工作交给PlayerHeadHandler和PlayerUpperBodyHandler来做
- PlayerHeadHandler
- PlayerUpperBodyHandler
BallActionExecutor
- 控制球动作
- BallActionHandler 用来响应击球事件,并产生相应动作交与BallActionExcutor。每个队员身上都有一个BallActionHandler。
- 这个组件是挂在球上面的
-CoachSkillEventConsumer
MatchEventConsumer
TeamStateManager
GameHub
- 拥有双方队员的Animator组件
- 动作与AI调度器
- Start()-> 发出 onMatchStart 事件
- RegisterPlayerAIExecutor 注册PlayerAIExecutor
- RegisterPlayer 注册队员的Transform,Animator及ActionExecutor
- RegisterPlayerAIExecutor 注册PlayerAIExcutor
- 作用:
- 冻结队员动作的实现方法:设置所有队员的动画组件的speed属性为0
挂起
会冻结队员动作,挂起结束后会解冻队员,并恢复上一个时间状态暂停
- TLUnfreeze()与TLFreeze()
- 还会更新当前时间,但使用TLMatchTime()将得到暂停的起始时刻,其它状态下,该方法得到的是当前时间
系统级暂停,StopTimeProceed()与ResumeTimeProceed(),对Time.timeScale进行设置
DataProvider
- 提供比赛事件存储队列matchKeyFrameQueue
此队列中的事件由MatchEventConsumer单例处理,MatchEventConsumer调用GameHub的HandleMatchEvent将事件广播给所有的队员
比赛特殊事件,比如开球,正常比赛,点球,罚球,比赛结束等
一些约定
- 双方队员编号,0-10,11-21
- 0与11是守门员
配置文件
- Assets/CapstonesRes/Game/Config => /res/res_Game_Config/CAB-res_Game_Config
- # 开头的是注释
- 一行一条记录
ActionAttributes.txt
- 作用:每个动作的长度,及触球相关参数
- 加载类:ActionAttributeLoader 用于解析动画相关属性,并提供Get接口
- 按#分隔字段
- 第一行为字段名字
clip_name clip_offset clip_duration clip_rotation ( first_touch_ball_offset first_touch_ball_duration first_touch_ball_player_offset last_touch_ball_offset last_touch_ball_duration )- clip_offset 是Vector3
- clip_rotation 是Vector4
- 前四个字段是必须的,数据项要么是4个字段的,要么是9个字段的,其它数量的字段都是非法数据项
- clip_name的第一个字母是用意义的
- 3_1, A-Z 并且不是A01或T
ActionConfig.txt
- 作用:逻辑动作对应的动画,是一对多的关系
- 加载类:ActionConfig
- 两个字段
- 第一个字段是逻辑动作名字
- 第二个字段是具体动画名字,相应的动画在ActionAttribute中都有配置,以
,
分隔
PlayerAction, PlayerTransform
- PlayerAction作用:每个Player自已所能做的动作 ?
- PlayerTransfrom
- 作用:每个Player的初始位置与面向
- 所有数据都在一行上,记录以
#
分隔,记录内以;
分隔,每条记录有3项
- 加载类:PlayerActionLoader
ActionMergeInfo
- 作用:动作混合
- 三个字段
- 层
- 动作状态
- 条件
AI中Lua部分
- 估计是用行为树
- AI脚本位置:zcfy/spt/emulator
-