HUD_PC:
HUDPC::PostRender::Super跳过父类,GFXHUD将不被初使化。
PostRender处理光标,逻辑基本在DrawHUD()。
ControllerPC通过左键开火,选择HeroPawn,玩家一旦有Pawn,不渲染HUD图像。
Controller:
关于状态编程:
状态编程用到入栈和出栈,一旦在用GoToState后,该类就会处在GoTo的那个状态,这种情况下,如果同一个类中有两个(或多个)同名函数,一个在类中,一个在状态中。当需要执行那个函数时,会执行状态中的那个同名函数而不是类中的那个。相反的,就执行类中的同名函数。Auto State的作用就是在没有使用GoToState的情况下让类进入一个状态。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
UDK默认的PlayerController.uc::eventPlayerTick( floatDeltaTime )::PlayerMove(DeltaTime);
PlayerController.uc中不止一个状态,PlayerMove函数也不止一个,默认情况下执行PlayerMove时是在state PlayerWalking::PlayerMove()::ProcessMove()。ProcessMove处理Pawn的移动。(PHYS_Falling,PHYS_Walking,,,,,)
------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------
ControllerPC状态转换逻辑:
Controller相互占有一个Pawn后,Pawn的动画资源设定后就进入Idle姿势,在Controller没有进入PlayerWalking状态时,相机视图可能不会移动和旋转,WASD也是无效的。
处理开火是在PlayerCommanding,处理玩家移动是在PlayerWalking。玩家的移动随时都是要处理的,当玩家想开火时,如果从移动状态进入了PlayerCommanding,玩家可能不会动了。综合考虑,去掉PlayerCommanding状态,开火函数写在类里面。
ControllerPC如何进入PlayerWalking状态,用状态转换,Controller有Auto State:: GotoPlayerWalking无效(未解)。
为了让ControllerPC下的PlayerWalking能像默认Controller那样工作,把默认PlayerController的PlayerMove和PlayerWalking状态下的PlayerMove都是复制到ControllerPC下并改写类中的PlayerMove函数::
functionPlayerMove(floatDeltaTime)
{
if (IsInState('PlayerWalking'))
{
BeginState('PlayerWalking');
}
else
{
GotoState('PlayerWalking');
}
}
也不明白为什么这样改写了就达到了想要的效果,PlayerTick调用PlayerMove函数的时候就直接调用PlayerWalking状态下的PlayerMove了。
Pawn:
Pawn::PostBeginPlay::如果是玩家控制器,Super跳过父类;如果不是玩家控制器,Pawn仍然是AI。
GameInfor→Possese的时候,如果是玩家控制器就占用Pawn。
不过这个逻辑似乎没用,就算先是AI,Controller改写后的Posses确定是玩家后Unposses和Posses会重新占有Pawn。
附加内容(扩展):
修饰符:
HUDPC::protected function ProcessCommands() ,类的修饰符不允许外部调用该函数。