104 lines
7.0 KiB
C#
104 lines
7.0 KiB
C#
#if UNITY_EDITOR
|
|
using UnityEngine;
|
|
|
|
namespace O3DWB
|
|
{
|
|
public static class ObjectRotationRandomization
|
|
{
|
|
#region Public Static Functions
|
|
public static void Randomize(GameObject gameObject, ObjectRotationRandomizationSettings randomizationSettings)
|
|
{
|
|
if(randomizationSettings.RandomizeRotation)
|
|
{
|
|
Transform objectTransform = gameObject.transform;
|
|
if (randomizationSettings.XAxisRandomizationSettings.Randomize) RandomizeRotationForAxis(objectTransform, randomizationSettings.XAxisRandomizationSettings.Axis, randomizationSettings.XAxisRandomizationSettings.RandomizationModeSettings);
|
|
if (randomizationSettings.YAxisRandomizationSettings.Randomize) RandomizeRotationForAxis(objectTransform, randomizationSettings.YAxisRandomizationSettings.Axis, randomizationSettings.YAxisRandomizationSettings.RandomizationModeSettings);
|
|
if (randomizationSettings.ZAxisRandomizationSettings.Randomize) RandomizeRotationForAxis(objectTransform, randomizationSettings.ZAxisRandomizationSettings.Axis, randomizationSettings.ZAxisRandomizationSettings.RandomizationModeSettings);
|
|
if (randomizationSettings.CustomAxisRandomizationSettings.Randomize) RandomizeRotationForAxis(objectTransform, randomizationSettings.CustomAxisRandomizationSettings.Axis, randomizationSettings.CustomAxisRandomizationSettings.RandomizationModeSettings);
|
|
}
|
|
}
|
|
|
|
public static Quaternion GenerateRandomRotationQuaternion(ObjectRotationRandomizationSettings randomizationSettings)
|
|
{
|
|
Quaternion randomRotationQuaternion = Quaternion.identity;
|
|
if (randomizationSettings.RandomizeRotation)
|
|
{
|
|
if (randomizationSettings.XAxisRandomizationSettings.Randomize) randomRotationQuaternion = GenerateRandomRotationQuaternionForAxis(Vector3.right, randomizationSettings.XAxisRandomizationSettings.RandomizationModeSettings) * randomRotationQuaternion;
|
|
if (randomizationSettings.YAxisRandomizationSettings.Randomize) randomRotationQuaternion = GenerateRandomRotationQuaternionForAxis(Vector3.up, randomizationSettings.YAxisRandomizationSettings.RandomizationModeSettings) * randomRotationQuaternion;
|
|
if (randomizationSettings.ZAxisRandomizationSettings.Randomize) randomRotationQuaternion = GenerateRandomRotationQuaternionForAxis(Vector3.forward, randomizationSettings.ZAxisRandomizationSettings.RandomizationModeSettings) * randomRotationQuaternion;
|
|
if (randomizationSettings.CustomAxisRandomizationSettings.Randomize) randomRotationQuaternion = GenerateRandomRotationQuaternionForAxis(randomizationSettings.CustomAxisRandomizationSettings.Axis, randomizationSettings.CustomAxisRandomizationSettings.RandomizationModeSettings) * randomRotationQuaternion;
|
|
}
|
|
|
|
return randomRotationQuaternion;
|
|
}
|
|
#endregion
|
|
|
|
#region Private Static Functions
|
|
private static void RandomizeRotationForAxis(Transform objectTransform, TransformAxis axis, AxisRotationRandomizationModeSettings rotationRandomizationModeSettings)
|
|
{
|
|
Vector3 axisVector = TransformAxes.GetVector(axis, TransformSpace.Global, objectTransform);
|
|
RandomizeRotationForAxis(objectTransform, axisVector, rotationRandomizationModeSettings);
|
|
}
|
|
|
|
private static void RandomizeRotationForAxis(Transform objectTransform, Vector3 axis, AxisRotationRandomizationModeSettings rotationRandomizationModeSettings)
|
|
{
|
|
if (rotationRandomizationModeSettings.RandomizationMode == AxisRotationRandomizationMode.RandomRotationStep)
|
|
RandomizeRotationForAxis(objectTransform, axis, rotationRandomizationModeSettings.RandomRotationStepAxisRandomizationSettings.StepSizeInDegrees);
|
|
else
|
|
if (rotationRandomizationModeSettings.RandomizationMode == AxisRotationRandomizationMode.RandomRotationValue)
|
|
{
|
|
RandomizeTransformRotationForAxis(objectTransform, axis,
|
|
rotationRandomizationModeSettings.RandomRotationValueAxisRandomizationSettings.MinRotationInDegrees,
|
|
rotationRandomizationModeSettings.RandomRotationValueAxisRandomizationSettings.MaxRotationInDegrees);
|
|
}
|
|
}
|
|
|
|
private static Quaternion GenerateRandomRotationQuaternionForAxis(Vector3 axis, AxisRotationRandomizationModeSettings rotationRandomizationModeSettings)
|
|
{
|
|
if (rotationRandomizationModeSettings.RandomizationMode == AxisRotationRandomizationMode.RandomRotationStep)
|
|
return GenerateRandomRotationQuaternionForAxis(axis, rotationRandomizationModeSettings.RandomRotationStepAxisRandomizationSettings.StepSizeInDegrees);
|
|
else
|
|
if (rotationRandomizationModeSettings.RandomizationMode == AxisRotationRandomizationMode.RandomRotationValue)
|
|
{
|
|
return GenerateRandomRotationQuaternionForAxis(axis,
|
|
rotationRandomizationModeSettings.RandomRotationValueAxisRandomizationSettings.MinRotationInDegrees,
|
|
rotationRandomizationModeSettings.RandomRotationValueAxisRandomizationSettings.MaxRotationInDegrees);
|
|
}
|
|
else return Quaternion.identity;
|
|
}
|
|
|
|
private static void RandomizeRotationForAxis(Transform objectTransform, Vector3 axis, float stepSizeInDegrees)
|
|
{
|
|
int numberOfStepsInFullRotation = (int)(360.0f / stepSizeInDegrees + 0.5f);
|
|
|
|
int randomMultiple = UnityEngine.Random.Range(0, numberOfStepsInFullRotation + 1);
|
|
float randomRotation = randomMultiple * stepSizeInDegrees;
|
|
|
|
objectTransform.Rotate(axis, randomRotation, Space.World);
|
|
}
|
|
|
|
private static Quaternion GenerateRandomRotationQuaternionForAxis(Vector3 axis, float stepSizeInDegrees)
|
|
{
|
|
int numberOfStepsInFullRotation = (int)(360.0f / stepSizeInDegrees + 0.5f);
|
|
|
|
int randomMultiple = UnityEngine.Random.Range(0, numberOfStepsInFullRotation + 1);
|
|
float randomRotation = randomMultiple * stepSizeInDegrees;
|
|
|
|
return Quaternion.AngleAxis(randomRotation, axis);
|
|
}
|
|
|
|
private static void RandomizeTransformRotationForAxis(Transform objectTransform, Vector3 axis, float minRotationValueInDegrees, float maxRotationValueInDegrees)
|
|
{
|
|
float randomRotation = UnityEngine.Random.Range(minRotationValueInDegrees, maxRotationValueInDegrees);
|
|
objectTransform.Rotate(axis, randomRotation, Space.World);
|
|
}
|
|
|
|
private static Quaternion GenerateRandomRotationQuaternionForAxis(Vector3 axis, float minRotationValueInDegrees, float maxRotationValueInDegrees)
|
|
{
|
|
float randomRotation = UnityEngine.Random.Range(minRotationValueInDegrees, maxRotationValueInDegrees);
|
|
return Quaternion.AngleAxis(randomRotation, axis);
|
|
}
|
|
#endregion
|
|
}
|
|
}
|
|
#endif |