传感器
中级 程序员
你可以使用各种传感器(Sensor)(如陀螺仪和加速度计)作为项目中的输入设备。传感器常用于移动游戏。
使用 @'Stride.Input.InputManager' 访问传感器,可以:
- 检查 Stride 是否支持某个传感器
- 禁用传感器
- 获取传感器数据
Stride 可以接收六种传感器的数据:
- 方向(Orientation)
- 加速度计(Accelerometer)
- UserAcceleration(用户加速度)
- Gravity(重力)
- 指南针(Compass)
- 陀螺仪(Gyroscope)
它们都继承自 @'Stride.Input.ISensorDevice'。
Stride 为每种传感器类型创建一个默认实例。你可以通过 @'Stride.Input.InputManager' 访问每个实例。
传感器基于状态。每个传感器实例都会每帧自动更新,包含更新前一刻的传感器数值。
例如,要访问加速度计,请使用:
var accelerometer = Input.Accelerometer;
检查传感器是否可用
获取传感器数值之前,请检查该传感器在设备上是否可用(即不为 null)。例如,要检查指南针是否可用:
var hasCompass = Input.Compass != null;
Note
如果设备不原生支持某个传感器,Stride 会尝试使用设备的其他传感器来模拟它。
启用传感器
默认情况下,Stride 会禁用所有可用的传感器,因为获取和更新传感器数据会占用大量 CPU 时间。
要启用传感器,请将 @'Stride.Input.ISensorDevice.IsEnabled' 设置为 true。不需要传感器时,将该属性设置为 false 以禁用它。
使用方向传感器
方向传感器指示设备相对于重力和地球北极的方向。当设备的 Y 轴与磁北对齐、Z 轴与重力方向对齐时,方向值为空。你可以使用方向数据控制游戏中的各种操作。

使用 Input.Orientation 获取设备的当前方向。
| 属性 | 说明 | 声明 |
|---|---|---|
| Roll | 绕 X 轴的旋转 | public float Roll { get; } |
| Pitch | 绕 Y 轴的旋转 | public float Pitch { get; } |
| Yaw | 绕 Z 轴的旋转 | public float Yaw { get; } |
| Rotation Matrix | 设备旋转矩阵 | public Matrix RotationMatrix { get; } |
| Quaternion | 设备的方向和旋转 | public Quaternion Quaternion { get; } |
例如:
var orientation = Input.Orientation.Quaternion;
Note
Stride 以俯仰/偏航/翻滚、旋转矩阵或四元数的形式提供方向数据。我们推荐使用四元数形式,因为它不会出现万向节死锁问题。
运动传感器
运动传感器测量加速度力,如倾斜、摇晃和挥动。Stride 支持三种运动传感器:
- 加速度计:测量原始加速度
- Gravity:只测量重力
- UserAcceleration:只测量用户施加的加速度
这些传感器使用物理关系式 Accelerometer = Gravity + UserAcceleration。

运动传感器有一个字段,用于指定设备当前的加速度向量。Stride 以米每二次方秒为单位测量加速度。
下图显示了 Stride 在智能手机和平板电脑上测量加速度所使用的坐标基准:

使用加速度计
加速度计测量施加到设备上的原始加速度,包括重力和用户加速度。
Note
当用户没有施加力时,设备加速度等于其重力。
要获取原始加速度,请使用 Accelerometer.Acceleration。例如:
var acceleration = Input.Accelerometer.Acceleration;
使用用户加速度传感器
用户加速度传感器与加速度计类似,但只测量用户施加的加速度(不含重力加速度)。
要获取用户加速度,请使用 UserAcceleration.Acceleration。例如:
var userAcceleration = Input.UserAcceleration.Acceleration;
使用重力传感器
重力传感器提供一个 3D 向量,指示作用在设备上的重力方向和大小(米每二次方秒)。
要获取重力向量,请使用 GravitySensor。例如:
var gravityVector = Input.Gravity.Vector;
使用指南针传感器
指南针测量设备顶部与北极之间的角度。例如,这可用于旋转和对齐数字地图。

要获取此角度,请使用 CompassSensor.Heading。例如:
var heading = Input.Compass.Heading;
使用陀螺仪
陀螺仪测量设备的旋转速度(弧度每秒)。

要获取旋转速度,请使用 GyroscopeSensor.RotationRate。例如:
var rotationRate = Input.Gyroscope.RotationRate;
var rotationSpeedX = rotationRate.X;
var rotationSpeedY = rotationRate.Y;
var rotationSpeedZ = rotationRate.Z;
示例代码
public class SensorScript : AsyncScript
{
public override async Task Execute()
{
// 检查传感器是否可用
if(Input.Accelerometer != null)
return;
// 激活传感器
Input.Accelerometer.IsEnabled = true;
while (Game.IsRunning)
{
// 读取当前加速度
var accel = Input.Accelerometer.Acceleration;
// 执行所需的工作……
await Script.NextFrame();
}
// 使用完毕后禁用传感器
Input.Accelerometer.IsEnabled = false;
}
}