• Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by steffeng3000 · Jun 20, 2018 at 04:05 PM · c#dragpath

Drag a 2D object along a path.

Hey everyone, I’ve stumbled along a question I can’t seem to solve. Is there a way of dragging an object (like a 2D sprite) along some lines? The thing I want to achieve is me only being able to drag the object along a specific track. If my question is not clear there is a picture down below illustrating what I mean (I’m not an artist). Thanks in advance. alt text

question.jpg (74.7 kB)
Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

1 Reply

· Add your reply
  • Sort: 
avatar image
1
Best Answer

Answer by Horschty · Jun 20, 2018 at 08:59 PM

Now that can get really complicated really fast depending on what your requirements are. What kind of path is it? A sequence of straight lines? If so, my example code could get you started. If instead you want bezier curves or some other fancy nice and smooth curves, you have to wait for a mathemagician to come around because that requires some seriously complicated algebra or other kinds of math (just google "find closest point on bezier curve" to see what I mean).

Here is my partial unoptimized solution for a sequence of straight lines (if you put enough small straight lines together it can look like a curve!).

So here is the idea: Loop through all line segments and for each one, try to find the point on that line segment that is closest to your mouse poiner (or touch pointer whatever). And of all of those, keep the one thats closest overall.

My code only demonstrates how you can find the closest point on a path made up of line segments. Implementing dragging, making sure you can't skip line segment etc is way too much work and will be up to you.

Hopefully it will help you get started. You can just copy the code and test it out. You just need to assign some kind of object to "circleSprite" to visualize the closest point.

 using UnityEngine;
 
 public class PointFollowPath : MonoBehaviour {
     public Transform circleSprite;
     private LineRenderer _lr;
 
     void Start () {
         _lr = gameObject.AddComponent<LineRenderer>();
         _lr.startWidth = 0.1f;
         _lr.endWidth = 0.1f;
         int waveResolution = 20;
         _lr.positionCount = waveResolution;
         // Construct a sine wave out of lines, the more lines (waveResolution) the smoother it gets
         for(int i = 0; i < waveResolution; i++) {
             float p = i / (float)waveResolution;
             _lr.SetPosition(i, new Vector2(-2.5f + p * 5.0f,  Mathf.Sin(p *  Mathf.PI * 4)));
         }
     }
     
     void Update () {
         Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
         Vector2 closestPoint = Vector2.zero;
         float closestDistance = float.MaxValue;
         for(int i = 0; i < _lr.positionCount - 1; i++) {
             Vector2 p1 = _lr.GetPosition(i);
             Vector2 p2 = _lr.GetPosition(i + 1);
             var closestPointBetweenP1P2 = GetClosestPoint(p1, p2, mousePos);
             float distanceToClosestPoint = Vector2.Distance(closestPointBetweenP1P2, mousePos);
             if(distanceToClosestPoint < closestDistance) {
                 closestDistance = distanceToClosestPoint;
                 closestPoint = closestPointBetweenP1P2;
             }
         }
         circleSprite.position = closestPoint;
     }
 
     private Vector2 GetClosestPoint(Vector2 p1, Vector2 p2, Vector2 p3) {
         Vector2 from_p1_to_p3 = p3 - p1;
         Vector2 from_p1_to_p2 = p2 - p1;
         float dot = Vector2.Dot(from_p1_to_p3, from_p1_to_p2.normalized);
         dot /= from_p1_to_p2.magnitude;
         float t = Mathf.Clamp01(dot);
         return p1 + from_p1_to_p2 * t;
     }
 }
Comment
Add comment · Show 2 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image steffeng3000 · Jun 21, 2018 at 12:00 PM 0
Share

Hey, I really appreciate your answer It will defiantly get me started. I’m about to look deeper in this right away. Thanks

avatar image freedom667 · Nov 04, 2019 at 01:59 PM 0
Share

hi there. I saw your code and tried it. that's what I want but. the draggable object always the starting center of the camera. I put in an object and moved it but the same again. how can I start the drag object from the line's start point? Also, can we use it in Canvas? Thanks.

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Welcome to Unity Answers

If you’re new to Unity Answers, please check our User Guide to help you navigate through our website and refer to our FAQ for more information.

Before posting, make sure to check out our Knowledge Base for commonly asked Unity questions.

Check our Moderator Guidelines if you’re a new moderator and want to work together in an effort to improve Unity Answers and support our users.

Follow this Question

Answers Answers and Comments

515 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Multiple Cars not working 1 Answer

Distribute terrain in zones 3 Answers

Sluggish relative drag 1 Answer

Programmmed Animation (making transform move to vectors with code) 0 Answers

Creating an SQLite database in build 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges