Sometimes it is necessary to perform test/client-side calculations that can be tricky but are required for testing. That's why we have compiled a few that have proven useful over the years below. These can be added to your tests directly or stored in a separate class and used directly in your test code.


Quaternion RotateTo(string objectToRotate, string targetObject, Vector3 offset = null, Vector3 orientation = null)
{
    //GameObject player = GameObject.Find(objectToRotate);
    Vector3 playerPosition = api.GetObjectPosition($"//*[@name='{objectToRotate}']");
    Vector3 targetPosition = api.GetObjectPosition($"//*[@name='{targetObject}']");
    if (offset != null)
    {
        targetPosition = Vec3Addition(targetPosition, offset);
    }

    Vector3 targetVector = Vec3Subtraction(targetPosition, playerPosition);
    targetVector = NormalizeVector(targetVector);

    if (orientation == null)
        orientation = new Vector3(0.0f, 1.0f, 0.0f);

    Quaternion rotation = api.CallMethod<Quaternion>("fn:type('UnityEngine.Quaternion')", "LookRotation", new object[] { targetVector, orientation });
    return rotation;
}

public Vector3 Vec3Addition(Vector3 vecA, Vector3 vecB)
{
    return new Vector3(vecA.x + vecB.x, vecA.y + vecB.y, vecA.z + vecB.z);
}

public Vector3 Vec3Subtraction(Vector3 vecA, Vector3 vecB)
{
    return new Vector3(vecA.x - vecB.x, vecA.y - vecB.y, vecA.z - vecB.z);
}

public Vector3 Vec3Multiplication(Vector3 vec, float multiplier)
{
    return new Vector3(vec.x * multiplier, vec.y * multiplier, vec.z * multiplier);
}

public float SquareMagnitude(Vector3 vec)
{
    // Square each vector value and add them
    return ((vec.x * vec.x) + (vec.y * vec.y) + (vec.z * vec.z));
}

public Vector3 NormalizeVector(Vector3 vecToNormalize)
{
    // Find the magnitude squared, without the square root
    float squareMag = SquareMagnitude(vecToNormalize);

    // Do the fast inverse square root
    double fastInvSqrt = 1 / Math.Sqrt(squareMag);

    // Multiply values to get the normalized vector
    Vector3 normVector = Vec3Multiplication(vecToNormalize, (float)fastInvSqrt);
    return normVector;
}


Do you have a useful helper method you would like to share? Let us know on Slack, or by emailing [email protected]