全站通知:

PawnInput

阅读

    

2023-07-24更新

    

最新编辑:TrimesS_

阅读:

  

更新日期:2023-07-24

  

最新编辑:TrimesS_

来自S&boxWIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
页面贡献者 :
-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;
	}
}