public override void ActionUpdate(float timekey) { Vector3 position; float preferredDistance = distance + timekey * moveSpeed; if (!NeverdawnUtility.SamplePath(corners, distances, preferredDistance, out position) || preferredDistance > maxDistance) { Done(); return; } Vector3 dir = (position - transform.position); dir.y = 0.0f; dir.Normalize(); Vector2 fwdTurn = NeverdawnUtility.InputToForwardTurn(character.transform, dir, 1.0f); Vector3 forward = character.transform.forward; character.transform.forward = Vector3.RotateTowards(forward, dir, timekey * Mathf.PI * 2.0f * (turnSpeed / 360.0f), 0.0f); distance = distance + fwdTurn.x * timekey * moveSpeed; NeverdawnUtility.SamplePath(corners, distances, distance, out position); character.transform.position = position; RaycastHit rayHit; // experimental: stick to ground if (Physics.Raycast(character.transform.position + Vector3.up, Vector3.down, out rayHit, 3f, 1 << 9)) { character.transform.position = rayHit.point; } }