PawnInput
阅读
2023-07-24更新
最新编辑:TrimesS_
阅读:
更新日期:2023-07-24
最新编辑:TrimesS_
为了帮助你操作 Pawn,你可能需要从客户端提供一些特殊的输入数据。
客户端输入属性
你可以在Pawn上使用 [ClientInput] 特性或在实体组件上标记属性。
带有该特性的属性会自动序列化并发送到服务器。
构建输入
每帧 BuildInput() 都会在客户端调用。静态输入类可用于抓取原始输入数据,然后使用该数据设置任何带有[ClientInput] 特性的属性。
// 玩家 Pawn 类中的 BuildInput 方法示例。
[ClientInput] public Vector3 InputDirection { get; protected set; }
[ClientInput] public Angles ViewAngles { get; set; }
public override void BuildInput()
{
InputDirection = Input.AnalogMove;
var look = Input.AnalogLook;
var viewAngles = ViewAngles;
viewAngles += look;
ViewAngles = viewAngles.Normal;
}
模拟
客户端每Tick一次都会发送一个命令,其中包含从 BuildInput 中生成的值。该命令会在 Game.Simulate( Client ) 中模拟每个客户端。
在 Simulate( Client ) 中,静态输入类包含当前模拟客户端的特定输入,这样就可以在服务器和客户端上运行相同的代码进行预测。
// 玩家 Pawn 类中的模拟方法示例。
public override void Simulate( Client cl )
{
if ( Input.Pressed( "jump" ) )
{
Velocity += Vector3.Up * 100f;
}
Velocity += InputDirection * 400f;
Rotation = ViewAngles.ToRotation();
}
按钮状态
[ClientInput] 特性也可以是 ButtonState。通过该结构体,你可以将输入视为一个按钮,这样在模拟中就可以知道输入是按下还是松开,或者是向下。这可以让像couch co-op等操作变得更简单。
[ClientInput] public ButtonState Jump { get; set; }
public override void BuildInputs()
{
if ( IsPlayerOne )
Jump = Input.Down( "jump" );
else if ( IsPlayerTwo )
Jump = Input.Down( "drop" );
}
public override void Simulate( Client client )
{
if ( Jump.Pressed )
{
Velocity += Vector3.Up * 100f;
}
}