Romi
Romi

Reputation: 109

RigidBody drag and drop with mouse

I have been trying to drag and drop a rigidbody. I have used this script. It's moving the rigidbody with mouse but does not drop the rigidbody, it keeps moving.

public class move : MonoBehaviour {

public Camera cam;
private float maxWidth;

// Use this for initialization
void Start()
{
    if (cam == null)
    {
        cam = Camera.main;
    }
    Vector3 upperCorner = new Vector3(Screen.width, Screen.height, 0.0f);
    Vector3 targetWidth = cam.ScreenToWorldPoint(upperCorner);
    float hatWidth = renderer.bounds.extents.x;
    maxWidth = targetWidth.x - hatWidth;
}


// Update is called once per frame
void FixedUpdate () {

    Vector3 rawPosition = cam.ScreenToWorldPoint(Input.mousePosition);
    Vector3 targetPosition = new Vector3(rawPosition.x, 0.0f, 0.0f);
    float targetWidth = Mathf.Clamp(targetPosition.x, -maxWidth, maxWidth);
    targetPosition = new Vector3(targetWidth, targetPosition.y, targetPosition.z);
    rigidbody.MovePosition(targetPosition);


}

}

I want something like this example that means it will drag a gameobject having rigidbody and drop in place.

Thanks

Upvotes: 0

Views: 3054

Answers (1)

Barış Çırıka
Barış Çırıka

Reputation: 1570

You need to use Input.GetMouseButtonDown for begin drag,

Input.GetMouseButton for dragging,

Input.GetMouseButtonUp for end dragging.

Simple code is:

void FixedUpdate () {
    // 0 means left mouse button.
    if(Input.GetMouseButton(0)){ // Check left button is still down so change rigidbody position
       Vector3 rawPosition = cam.ScreenToWorldPoint(Input.mousePosition);
       Vector3 targetPosition = new Vector3(rawPosition.x, 0.0f, 0.0f);
       float targetWidth = Mathf.Clamp(targetPosition.x, -maxWidth, maxWidth);
       targetPosition = new Vector3(targetWidth, targetPosition.y, targetPosition.z);
       rigidbody.MovePosition(targetPosition);
    }else if(Input.GetMouseButtonDown(0)){
       Vector3 startPositionRaw = cam.ScreenToWorldPoint(Input.mousePosition);
    }else if(Input.GetMouseButtonUp(0)){
       cam.ScreenToWorldPoint(Input.mousePosition);
}

Update for your need

 void FixedUpdate () {
        // 0 means left mouse button.
        if(Input.GetMouseButton(0)){ // Check left button is still down so change rigidbody position
           RaycastHit hit;
           Ray ray = cam.ScreenPointToRay(Input.mousePosition);
           if (Physics.Raycast(ray,out hit,100)){
               if(hit.collider.gameObject.name=="TargetObjectName"){
                  Vector3 rawPosition = cam.ScreenToWorldPoint(Input.mousePosition);
                   //This is your solution 
                   Vector3 targetPosition = new Vector3(rawPosition.x, 0.0f, 0.0f);
                   float targetWidth = Mathf.Clamp(targetPosition.x, -maxWidth, maxWidth);
                   targetPosition = new Vector3(targetWidth, targetPosition.y, targetPosition.z);

                   // Maybe this is more usefull
                   Vector3 targetPosition = new Vector3(rawPosition.x, 0.0f, 0.0f);
                   rigidbody.MovePosition(targetPosition);
               }
           }
        }else if(Input.GetMouseButtonDown(0)){
           Vector3 startPositionRaw = cam.ScreenToWorldPoint(Input.mousePosition);
        }else if(Input.GetMouseButtonUp(0)){
           Vector3 endPositionRaw = cam.ScreenToWorldPoint(Input.mousePosition);
    }

PS: Maybe, some syntax error in code i don't check it.

Upvotes: 0

Related Questions