MotionBuilderExtensions.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. using System;
  2. using Unity.Collections;
  3. using UnityEngine;
  4. namespace LitMotion
  5. {
  6. /// <summary>
  7. /// Provides additional Bind methods for MotionBuilder.
  8. /// </summary>
  9. public static class MotionBuilderExtensions
  10. {
  11. /// <summary>
  12. /// Create a motion data and bind it to IProgress
  13. /// </summary>
  14. /// <typeparam name="TValue">The type of value to animate</typeparam>
  15. /// <typeparam name="TOptions">The type of special parameters given to the motion data</typeparam>
  16. /// <typeparam name="TAdapter">The type of adapter that support value animation</typeparam>
  17. /// <param name="builder">This builder</param>
  18. /// <param name="progress">Target object that implements IProgress</param>
  19. /// <returns>Handle of the created motion data.</returns>
  20. public static MotionHandle BindToProgress<TValue, TOptions, TAdapter>(this MotionBuilder<TValue, TOptions, TAdapter> builder, IProgress<TValue> progress)
  21. where TValue : unmanaged
  22. where TOptions : unmanaged, IMotionOptions
  23. where TAdapter : unmanaged, IMotionAdapter<TValue, TOptions>
  24. {
  25. Error.IsNull(progress);
  26. return builder.BindWithState(progress, static (x, progress) => progress.Report(x));
  27. }
  28. /// <summary>
  29. /// Create a motion data and bind it to Debug.unityLogger
  30. /// </summary>
  31. /// <typeparam name="TValue">The type of value to animate</typeparam>
  32. /// <typeparam name="TOptions">The type of special parameters given to the motion data</typeparam>
  33. /// <typeparam name="TAdapter">The type of adapter that support value animation</typeparam>
  34. /// <param name="builder">This builder</param>
  35. /// <returns>Handle of the created motion data.</returns>
  36. public static MotionHandle BindToUnityLogger<TValue, TOptions, TAdapter>(this MotionBuilder<TValue, TOptions, TAdapter> builder)
  37. where TValue : unmanaged
  38. where TOptions : unmanaged, IMotionOptions
  39. where TAdapter : unmanaged, IMotionAdapter<TValue, TOptions>
  40. {
  41. return builder.Bind(static x => Debug.unityLogger.Log(x));
  42. }
  43. /// <summary>
  44. /// Create a motion data and bind it to UnityEngine.ILogger
  45. /// </summary>
  46. /// <typeparam name="TValue">The type of value to animate</typeparam>
  47. /// <typeparam name="TOptions">The type of special parameters given to the motion data</typeparam>
  48. /// <typeparam name="TAdapter">The type of adapter that support value animation</typeparam>
  49. /// <param name="builder">This builder</param>
  50. /// <returns>Handle of the created motion data.</returns>
  51. public static MotionHandle BindToUnityLogger<TValue, TOptions, TAdapter>(this MotionBuilder<TValue, TOptions, TAdapter> builder, ILogger logger)
  52. where TValue : unmanaged
  53. where TOptions : unmanaged, IMotionOptions
  54. where TAdapter : unmanaged, IMotionAdapter<TValue, TOptions>
  55. {
  56. Error.IsNull(logger);
  57. return builder.BindWithState(logger, static (x, logger) => logger.Log(x));
  58. }
  59. /// <summary>
  60. /// Specifies the rounding format for decimal values when animating integer types.
  61. /// </summary>
  62. /// <typeparam name="TValue">The type of value to animate</typeparam>
  63. /// <typeparam name="TAdapter">The type of adapter that support value animation</typeparam>
  64. /// <param name="builder">This builder</param>
  65. /// <param name="roundingMode">Rounding mode</param>
  66. /// <returns>This builder to allow chaining multiple method calls.</returns>
  67. public static MotionBuilder<TValue, IntegerOptions, TAdapter> WithRoundingMode<TValue, TAdapter>(this MotionBuilder<TValue, IntegerOptions, TAdapter> builder, RoundingMode roundingMode)
  68. where TValue : unmanaged
  69. where TAdapter : unmanaged, IMotionAdapter<TValue, IntegerOptions>
  70. {
  71. builder.buffer.Data.Options.RoundingMode = roundingMode;
  72. return builder;
  73. }
  74. /// <summary>
  75. /// Specify the frequency of vibration.
  76. /// </summary>
  77. /// <typeparam name="TValue">The type of value to animate</typeparam>
  78. /// <typeparam name="TAdapter">The type of adapter that support value animation</typeparam>
  79. /// <param name="builder">This builder</param>
  80. /// <param name="frequency">Frequency</param>
  81. /// <returns>This builder to allow chaining multiple method calls.</returns>
  82. public static MotionBuilder<TValue, PunchOptions, TAdapter> WithFrequency<TValue, TAdapter>(this MotionBuilder<TValue, PunchOptions, TAdapter> builder, int frequency)
  83. where TValue : unmanaged
  84. where TAdapter : unmanaged, IMotionAdapter<TValue, PunchOptions>
  85. {
  86. builder.buffer.Data.Options.Frequency = frequency;
  87. return builder;
  88. }
  89. /// <summary>
  90. /// Specify the vibration damping ratio.
  91. /// </summary>
  92. /// <typeparam name="TValue">The type of value to animate</typeparam>
  93. /// <typeparam name="TAdapter">The type of adapter that support value animation</typeparam>
  94. /// <param name="builder">This builder</param>
  95. /// <param name="dampingRatio">Damping ratio</param>
  96. /// <returns>This builder to allow chaining multiple method calls.</returns>
  97. public static MotionBuilder<TValue, PunchOptions, TAdapter> WithDampingRatio<TValue, TAdapter>(this MotionBuilder<TValue, PunchOptions, TAdapter> builder, float dampingRatio)
  98. where TValue : unmanaged
  99. where TAdapter : unmanaged, IMotionAdapter<TValue, PunchOptions>
  100. {
  101. builder.buffer.Data.Options.DampingRatio = dampingRatio;
  102. return builder;
  103. }
  104. /// <summary>
  105. /// Specify the frequency of vibration.
  106. /// </summary>
  107. /// <typeparam name="TValue">The type of value to animate</typeparam>
  108. /// <typeparam name="TAdapter">The type of adapter that support value animation</typeparam>
  109. /// <param name="builder">This builder</param>
  110. /// <param name="frequency">Frequency</param>
  111. /// <returns>This builder to allow chaining multiple method calls.</returns>
  112. public static MotionBuilder<TValue, ShakeOptions, TAdapter> WithFrequency<TValue, TAdapter>(this MotionBuilder<TValue, ShakeOptions, TAdapter> builder, int frequency)
  113. where TValue : unmanaged
  114. where TAdapter : unmanaged, IMotionAdapter<TValue, ShakeOptions>
  115. {
  116. builder.buffer.Data.Options.Frequency = frequency;
  117. return builder;
  118. }
  119. /// <summary>
  120. /// Specify the vibration damping ratio.
  121. /// </summary>
  122. /// <typeparam name="TValue">The type of value to animate</typeparam>
  123. /// <typeparam name="TAdapter">The type of adapter that support value animation</typeparam>
  124. /// <param name="builder">This builder</param>
  125. /// <param name="dampingRatio">Damping ratio</param>
  126. /// <returns>This builder to allow chaining multiple method calls.</returns>
  127. public static MotionBuilder<TValue, ShakeOptions, TAdapter> WithDampingRatio<TValue, TAdapter>(this MotionBuilder<TValue, ShakeOptions, TAdapter> builder, float dampingRatio)
  128. where TValue : unmanaged
  129. where TAdapter : unmanaged, IMotionAdapter<TValue, ShakeOptions>
  130. {
  131. builder.buffer.Data.Options.DampingRatio = dampingRatio;
  132. return builder;
  133. }
  134. /// <summary>
  135. /// Specify the random number seed that determines the shake motion value.
  136. /// </summary>
  137. /// <typeparam name="TValue">The type of value to animate</typeparam>
  138. /// <typeparam name="TAdapter">The type of adapter that support value animation</typeparam>
  139. /// <param name="builder">This builder</param>
  140. /// <param name="seed">Random number seed</param>
  141. /// <returns>This builder to allow chaining multiple method calls.</returns>
  142. public static MotionBuilder<TValue, ShakeOptions, TAdapter> WithRandomSeed<TValue, TAdapter>(this MotionBuilder<TValue, ShakeOptions, TAdapter> builder, uint seed)
  143. where TValue : unmanaged
  144. where TAdapter : unmanaged, IMotionAdapter<TValue, ShakeOptions>
  145. {
  146. builder.buffer.Data.Options.RandomState = new Unity.Mathematics.Random(seed);
  147. return builder;
  148. }
  149. /// <summary>
  150. /// Enable support for Rich Text tags.
  151. /// </summary>
  152. /// <typeparam name="TValue">The type of value to animate</typeparam>
  153. /// <typeparam name="TAdapter">The type of adapter that support value animation</typeparam>
  154. /// <param name="builder">This builder</param>
  155. /// <param name="richTextEnabled">Whether to support Rich Text tags</param>
  156. /// <returns>This builder to allow chaining multiple method calls.</returns>
  157. public static MotionBuilder<TValue, StringOptions, TAdapter> WithRichText<TValue, TAdapter>(this MotionBuilder<TValue, StringOptions, TAdapter> builder, bool richTextEnabled = true)
  158. where TValue : unmanaged
  159. where TAdapter : unmanaged, IMotionAdapter<TValue, StringOptions>
  160. {
  161. builder.buffer.Data.Options.RichTextEnabled = richTextEnabled;
  162. return builder;
  163. }
  164. /// <summary>
  165. /// Specify the random number seed used to display scramble characters.
  166. /// </summary>
  167. /// <typeparam name="TValue">The type of value to animate</typeparam>
  168. /// <typeparam name="TAdapter">The type of adapter that support value animation</typeparam>
  169. /// <param name="builder">This builder</param>
  170. /// <param name="seed">Rrandom number seed</param>
  171. /// <returns>This builder to allow chaining multiple method calls.</returns>
  172. public static MotionBuilder<TValue, StringOptions, TAdapter> WithRandomSeed<TValue, TAdapter>(this MotionBuilder<TValue, StringOptions, TAdapter> builder, uint seed)
  173. where TValue : unmanaged
  174. where TAdapter : unmanaged, IMotionAdapter<TValue, StringOptions>
  175. {
  176. builder.buffer.Data.Options.RandomState = new Unity.Mathematics.Random(seed);
  177. return builder;
  178. }
  179. /// <summary>
  180. /// Fill in the parts that are not yet displayed with random strings.
  181. /// </summary>
  182. /// <typeparam name="TValue">The type of value to animate</typeparam>
  183. /// <typeparam name="TAdapter">The type of adapter that support value animation</typeparam>
  184. /// <param name="builder">This builder</param>
  185. /// <param name="scrambleMode">Type of characters used for blank padding</param>
  186. /// <returns>This builder to allow chaining multiple method calls.</returns>
  187. public static MotionBuilder<TValue, StringOptions, TAdapter> WithScrambleChars<TValue, TAdapter>(this MotionBuilder<TValue, StringOptions, TAdapter> builder, ScrambleMode scrambleMode)
  188. where TValue : unmanaged
  189. where TAdapter : unmanaged, IMotionAdapter<TValue, StringOptions>
  190. {
  191. if (scrambleMode == ScrambleMode.Custom) throw new ArgumentException("ScrambleMode.Custom cannot be specified explicitly. Use WithScrambleMode(FixedString64Bytes) instead.");
  192. builder.buffer.Data.Options.ScrambleMode = scrambleMode;
  193. return builder;
  194. }
  195. /// <summary>
  196. /// Fill in the parts that are not yet displayed with random strings.
  197. /// </summary>
  198. /// <typeparam name="TValue">The type of value to animate</typeparam>
  199. /// <typeparam name="TAdapter">The type of adapter that support value animation</typeparam>
  200. /// <param name="builder">This builder</param>
  201. /// <param name="customScrambleChars">Characters used for blank padding</param>
  202. /// <returns>This builder to allow chaining multiple method calls.</returns>
  203. public static MotionBuilder<TValue, StringOptions, TAdapter> WithScrambleChars<TValue, TAdapter>(this MotionBuilder<TValue, StringOptions, TAdapter> builder, FixedString64Bytes customScrambleChars)
  204. where TValue : unmanaged
  205. where TAdapter : unmanaged, IMotionAdapter<TValue, StringOptions>
  206. {
  207. builder.buffer.Data.Options.ScrambleMode = ScrambleMode.Custom;
  208. builder.buffer.Data.Options.CustomScrambleChars = customScrambleChars;
  209. return builder;
  210. }
  211. }
  212. }