SimpleDraw.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. public class SimpleDraw : MonoBehaviour
  8. {
  9. public float minimumDistance = 1.0f;
  10. private Vector3 lastPosition;
  11. // Use this for initialization
  12. void Start()
  13. {
  14. }
  15. private void Smoothen(SpriteShapeController sc, int pointIndex)
  16. {
  17. Vector3 position = sc.spline.GetPosition(pointIndex);
  18. Vector3 positionNext = sc.spline.GetPosition(SplineUtility.NextIndex(pointIndex, sc.spline.GetPointCount()));
  19. Vector3 positionPrev = sc.spline.GetPosition(SplineUtility.PreviousIndex(pointIndex, sc.spline.GetPointCount()));
  20. Vector3 forward = gameObject.transform.forward;
  21. float scale = Mathf.Min((positionNext - position).magnitude, (positionPrev - position).magnitude) * 0.33f;
  22. Vector3 leftTangent = (positionPrev - position).normalized * scale;
  23. Vector3 rightTangent = (positionNext - position).normalized * scale;
  24. sc.spline.SetTangentMode(pointIndex, ShapeTangentMode.Continuous);
  25. SplineUtility.CalculateTangents(position, positionPrev, positionNext, forward, scale, out rightTangent, out leftTangent);
  26. sc.spline.SetLeftTangent(pointIndex, leftTangent);
  27. sc.spline.SetRightTangent(pointIndex, rightTangent);
  28. }
  29. // Update is called once per frame
  30. void Update()
  31. {
  32. var mp = Input.mousePosition;
  33. mp.z = 10.0f;
  34. mp = Camera.main.ScreenToWorldPoint(mp);
  35. var dt = Mathf.Abs((mp - lastPosition).magnitude);
  36. var md = (minimumDistance > 1.0f) ? minimumDistance : 1.0f;
  37. if (Input.GetMouseButton(0) && dt > md)
  38. {
  39. var spriteShapeController = gameObject.GetComponent<SpriteShapeController>();
  40. var spline = spriteShapeController.spline;
  41. spline.InsertPointAt(spline.GetPointCount(), mp);
  42. var newPointIndex = spline.GetPointCount() - 1;
  43. Smoothen(spriteShapeController, newPointIndex - 1);
  44. spline.SetHeight(newPointIndex, UnityEngine.Random.Range(0.1f, 2.0f));
  45. lastPosition = mp;
  46. }
  47. }
  48. }