public void MoveTo(Vector3 direction)
{
var origin = transform.position;
var x = (int)Math.Floor(transform.position.x + direction.x);
var z = (int)Math.Floor(transform.position.z + direction.z);
float targetHeight;
if (x >= 0 && x < TerrainGrid.Instance.sizeX &&
z >= 0 && z < TerrainGrid.Instance.sizeZ)
{
targetHeight = TerrainGrid.GetHeightAt(x, z);
}
else
throw new InvalidOperationException("Trying to move out of the terrain grid");
var destination = new Vector3(x + 0.5f, targetHeight, z + 0.5f);
if (Network.isServer)
Cell = TerrainGrid.MoveTotem(origin, destination);
TaskManager.Instance.WaitUntil(elapsedTime =>
{
if (disposed) return true;
var step = Mathf.Clamp01(elapsedTime / TransitionDuration);
var xzStep = JumpTimeCurve.Evaluate(step);
var height = JumpHeightCurve.Evaluate(xzStep) + (targetHeight - origin.y) * xzStep;
transform.position = new Vector3(Mathf.Lerp(origin.x, destination.x, xzStep), height + origin.y,
Mathf.Lerp(origin.z, destination.z, xzStep));
return step >= 1;
});
}