Table of Contents

传感器

中级 程序员

你可以使用各种传感器(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;
	}
}

另请参阅