123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- #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
|