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]