应该在Controller类中还是在unrealscript中的Pawn类中处理状态代码?

时间:2012-06-12 23:37:10

标签: state unreal-development-kit unrealscript

我在我的UDK游戏中将sprint状态写入自定义pawn类。我正在查看Epic的用于管理状态的示例代码,而一大块游戏逻辑在Controller类而不是Pawn类中。这似乎是我的倒退。我最初认为控制器只是处理AI和播放器输入,现在我不知道在哪里放置我自己的状态代码。

例如,PlayerController.uc文件有PlayerWalking,PlayerClimbing等,但似乎也改变了Pawn的状态:

// player is climbing ladder
    state PlayerClimbing
    {

        ignores SeePlayer, HearNoise, Bump;

            event NotifyPhysicsVolumeChange( PhysicsVolume NewVolume )
            {
                if( NewVolume.bWaterVolume )
                {
                    GotoState( Pawn.WaterMovementState );
                }
                else
                {
                    GotoState( Pawn.LandMovementState );
                }
            }
...

由于短跑状态应该否定PlayerWalking状态,我是否应该将短跑状态代码放在Controller类而不是Pawn中?该逻辑应该如何处理?谢谢!

1 个答案:

答案 0 :(得分:0)

PlayerWalking和PlayerClimbing更多地涉及Pawns的物理和动画模式,而不是实际的步行与冲刺。

基于状态执行此操作的一种简单方法是创建一个PlayerSprinting状态,该状态源自PlayerWalking,然后在两种状态下,在进入状态时将GroundSpeed设置为您想要的状态。

一个例子:

state PlayerSprinting extends PlayerWalking
{
    event BeginState(Name PreviousStateName)
    {
         //coped from UTPawn
        DoubleClickDir = DCLICK_None;
        bPressedJump = false;
        GroundPitch = 0;
        if ( Pawn != None )
        {
            Pawn.ShouldCrouch(false);
            if (Pawn.Physics != PHYS_Falling && Pawn.Physics != PHYS_RigidBody) // FIXME HACK!!!
                Pawn.SetPhysics(Pawn.WalkingPhysics);
        }
        //END UTPawn

        //Ground speed modify
        GroundSpeed=SprintSpeed;
    }
}