No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SimpleDraw.cs 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.U2D;
  5. // Dynamic modification of spline to follow the path of mouse movement.
  6. // This script is just a simplified demo to demonstrate the idea.
  7. namespace SpriteShapeExtras
  8. {
  9. public class SimpleDraw : MonoBehaviour
  10. {
  11. public float minimumDistance = 1.0f;
  12. private Vector3 lastPosition;
  13. // Use this for initialization
  14. void Start()
  15. {
  16. }
  17. private static int NextIndex(int index, int pointCount)
  18. {
  19. return Mod(index + 1, pointCount);
  20. }
  21. private static int PreviousIndex(int index, int pointCount)
  22. {
  23. return Mod(index - 1, pointCount);
  24. }
  25. private static int Mod(int x, int m)
  26. {
  27. int r = x % m;
  28. return r < 0 ? r + m : r;
  29. }
  30. private void Smoothen(SpriteShapeController sc, int pointIndex)
  31. {
  32. Vector3 position = sc.spline.GetPosition(pointIndex);
  33. Vector3 positionNext = sc.spline.GetPosition(NextIndex(pointIndex, sc.spline.GetPointCount()));
  34. Vector3 positionPrev = sc.spline.GetPosition(PreviousIndex(pointIndex, sc.spline.GetPointCount()));
  35. Vector3 forward = gameObject.transform.forward;
  36. float scale = Mathf.Min((positionNext - position).magnitude, (positionPrev - position).magnitude) * 0.33f;
  37. Vector3 leftTangent = (positionPrev - position).normalized * scale;
  38. Vector3 rightTangent = (positionNext - position).normalized * scale;
  39. sc.spline.SetTangentMode(pointIndex, ShapeTangentMode.Continuous);
  40. SplineUtility.CalculateTangents(position, positionPrev, positionNext, forward, scale, out rightTangent, out leftTangent);
  41. sc.spline.SetLeftTangent(pointIndex, leftTangent);
  42. sc.spline.SetRightTangent(pointIndex, rightTangent);
  43. }
  44. // Update is called once per frame
  45. void Update()
  46. {
  47. var mp = Input.mousePosition;
  48. mp.z = 10.0f;
  49. mp = Camera.main.ScreenToWorldPoint(mp);
  50. var dt = Mathf.Abs((mp - lastPosition).magnitude);
  51. var md = (minimumDistance > 1.0f) ? minimumDistance : 1.0f;
  52. if (Input.GetMouseButton(0) && dt > md)
  53. {
  54. var spriteShapeController = gameObject.GetComponent<SpriteShapeController>();
  55. var spline = spriteShapeController.spline;
  56. spline.InsertPointAt(spline.GetPointCount(), mp);
  57. var newPointIndex = spline.GetPointCount() - 1;
  58. Smoothen(spriteShapeController, newPointIndex - 1);
  59. spline.SetHeight(newPointIndex, UnityEngine.Random.Range(0.1f, 2.0f));
  60. lastPosition = mp;
  61. }
  62. }
  63. }
  64. }