void Update() { transform.localPosition = Vector3.SmoothDamp(transform.localPosition, targetLocalPosition, ref velocity, tracker.smoothing, 10, Time.deltaTime); Vector3 zOrigin = new Vector3(origin.position.x, 0, origin.position.z); relPos = transform.position - zOrigin; groundPos = new Vector3(transform.position.x, 0, transform.position.z) - zOrigin; if (relPos != lastSendPos) { hasChangedSinceLastUpdate = true; } if (Time.time > lastSendUpdateTime + 1.0f / sendUpdateFPS) { float deltaUpdateTime = (Time.time - lastSendUpdateTime); float targetSpeed = Vector3.Distance(relPos, lastRealUpdatePos) / deltaUpdateTime; if (speedSmooth == 0) { currentSpeed = targetSpeed; } else { currentSpeed = Mathf.SmoothDamp(currentSpeed, targetSpeed, ref refSpeed, speedSmooth); } if (currentSpeed < idleSpeedThreshold) { idleTime += deltaUpdateTime; } else { idleTime = 0; } bool nowIsMoving = idleTime > 0; if (sendIdleTime) { DataFeedback.sendIdleTime(idleTime); if (isMoving != nowIsMoving) { DataFeedback.sendIsMoving(nowIsMoving); } } isMoving = nowIsMoving; if (sendDistAndSpeed) { DataFeedback.sendDistance(jointName, groundPos.magnitude); DataFeedback.sendSpeed(jointName, currentSpeed); } lastRealUpdatePos = new Vector3(relPos.x, relPos.y, relPos.z); lastSendUpdateTime = Time.time; } }