我正在使用手机作为控制器进行桌面游戏 . 该游戏采用Unity 3D开发,使用SensoDuino Android应用程序通过蓝牙发送Accelerometer和Orientation传感器值 . 值以100ms的频率发送 . 但手机运动与游戏反射之间存在滞后现象 . 如何减少滞后并以1:1的比例绘制运动,而不会出现任何抖动或跳跃 . 这是我正在使用的代码 -
进行串行端口连接后,以下代码用于从端口读取数据
void recData() {
if ((sp != null) && (sp.IsOpen)) {
byte tmp;
string data = "";
string avalues="";
tmp = (byte) sp.ReadByte();
while(tmp !=255) {
data+=((char)tmp);
tmp = (byte) sp.ReadByte();
if((tmp=='>') && (data.Length > 30)){
avalues = data;
parseValues(avalues);
data="";
}
}
}
}
由于Unity不允许从另一个主线程访问对象,我在 parseValues()
中设置了一个布尔变量 moveObject = true
(将传入的字符串转换为float) . 在 Update()
函数中检查此布尔值,如果为true,则使用以下函数移动对象 .
void moveObj(float x, float y) {
speed = 15.0f;
Vector3 move = Vector3.zero ;
move.x = x;
move.y = y;
move.Normalize();
// low pass filter
prevY = (0.8f * prevY) + ((1.0f - 0.8f) * move.y);
prevX = (0.8f * prevX) + ((1.0f - 0.8f) * move.x);
transform.Translate((-prevX * speed) * Time.deltaTime,(prevY * speed)* Time.deltaTime, -0.1f, Space.World);
readyToMove = false;
我尝试使用简单的低通滤波器来平滑值并使用translate来移动对象 . 问题是没有1:1的运动映射 . 有一个滞后 . 我怎样才能解决这个问题?如何从另一个线程访问主线程中的对象?
1 回答
要解决“滞后”,可以使用可用的插值函数 .
Alternatives: