ไม่สามารถเล่นวิดีโอนี้
ขออภัยในความไม่สะดวก
Unity Tutorial : Drag Gameobject with Mouse
ฝัง
- เผยแพร่เมื่อ 16 ส.ค. 2024
- In this Unity Gamedev tip and tutorial I show how to drag a gameobject around in your scene while the game is running.
I write a C# script that you can attach to you game object to have the drag feature.
The script can be found here, you can use it in your won Unity projects:
/ unity-3d-drag-22917454
See my social profiles here
G+: plus.google.co...
Twitter: / jayanamgames
Facebook: / jayanamgames
Patreon: / jayanam
Production Music courtesy of Epidemic Sound: www.epidemicsou...
For those having issues make sure your camera for the scene is tagged as being "main camera", not as "untagged", the option for this is just under the name for the camera in the inspector panel.
thanks!!!
Thanks so Much!
Thanks. It works but I am not sure why
This is exceptional. Clear, fast, clean and massively useful. I'm now prompted to look at a lot more by the author.
how to fix the objects clipping through the ground? while you are dragging it
Just a little adaptation to fulfill my implementation and its working like a charm. Thanks a lot!!
Omg, You star, you managed to solve my problem, thank you a million times over.!!
Thanks For Help
But I want to know How to move 3D object by touch dragging Finger By the screen means our object should follow our finger dirction
Well done! It helped me to understand the concept in practice were now I can tailor it for my requirements. Thanks
Thanks for this, this was super clear and easy to follow!
Thank you for the tutorial, but there is a small mistake in your script.
If you pick your object up and let it loose, it lands correctly, in the same spot where you have picked it up, if your camera is NOT rotated, only. If you rotate your camera downwards, the script will do its job as it should but with the rigidbody attached, the object will fall straight down to the ground + the "rotationOffset" of the camera.
For example: Your camera rotation is (20, 0, 0), your objectsPosition is (-10, 1, 0). You lift it up to "y = 9" and let go. You should notice, that the new coordninate is something like (-10.6, 9, 2.9) and not (-10, 1, 0), because it adds the rotation of the camera to it.
The same problem occurs for cameraRotations in y and z.
If anyone wants to stop movement along a particular axis, the easy way is to go into the rigidbody component of the object you're moving/dragging, and under constraints, "Freeze" the axis you don't want to use. :D
Great explanation, quick and simple to implement.
with this method, the calculated world position will have a fixed z value and the object will only move along x/y axis cuz you're using the clip space z value of the object to construct the vec3, but is there a way to make it have a fixed y value and the object move along x/z axis?
I'd also very much like to know this
@@jn1703 I solved by creating a plane and calculate the intersection between the play and the ray casted to the mouse position. E.g. if you want to use mouse to place an object on the ground, you can create a plane of normal vec3(0, 1, 0), then cast a ray from eye position to mouse, the intersection point would be the position of the object
@@slmjkdbtl Thanks for your response but not sure I'm following, I have my camera rotated at 45 degrees and just want to move the object on these axis. How can I get the correct mouse offset to work with my objects current postiion?
Thank you very much! I spent many hours tryng to do this but it didn't work, but this video did!! I'm very happy!
Quick & easy to understand. Thank you very much.
OMG I finally found something that works! Thank you!
having an issue where when I drag the object... it just goes flying off screen
my camera has to move around the world and I would like ti to be able to go from any position and pick up and drack the object into specific places... by when I run the code, it just seems to make the objects fly of into the void. anyone got any way to fix this?
edit: so i simply copied the code and its seems to work now (slightly stange), but still face an issue with my camera moving with the object... it seems that the objects gravity is accelerated when i move my camera around
edit2: also figured that out... have the rigidbody be set to zero when dragging
Object can be dragged thru other objects floor etc, How 2 fix?
Also looking for a fix
u find a fix yet?
@@TheDynamicDudes Add a 2D collider to the cube and floor, etc... and add a ground/collision check. Check out brackey's tutorial on that.
need to incorporate collider components
and onCollision events
@@ryana.9821 incorporate is a cooking word
i like it but the velocity keeps going up as the object is in the air, any way to make the velocity more realistic? everything goes through the ground
add more gravity
go to edit: project settings and add a (-0) value or a lower walue (+) means less (-) means
@@aperm8834 that'll slow down the gravity of the entire game i suggest turning off Use Gravity in your draggable objects rigidbody when Mouse is down and turning it back one with the mouse button is up
Good luck! @Jakub Majewski
@@DeezNuts-hy7qn Thanks!! Really helped me!
@@acompletelynormalrobloxgam7383 no problem
physics while dragging? like it flops around when i drag it
Maybe use the hinge-method that unityengine provides? Shouldn't be too hard creating a gameobject at the mouse-position connecting it to your object at the raycast-point where the mouse clicks. That will probably create the physics-effect you want :)
@@saiverx You can also set `isKinematic` to `true` in `OnMouseDown` and reset it back to `false` on `OnMouseUp`.
@@naterivard It will flop on gravity, but mouse movement itself will not create any force
Tutorial is too quick, but after watching it several times i got it.
Do you happen to have a similar tutorial for touch input?
Hi, thanks for the great tutorial. But I'm having "Assets/DragFox.cs(23,23): Error CS0029: Cannot implicitly convert type 'UnityEngine.Vector3' to 'float' (CS0029)". It seems that mZCoord can't be float?
apologies, I jst missed .z coordinate in this expression mZCoord = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
Nice! I want to be able to pick up an object and have it "snap" to the center (position and rotation) so I can carry it around and drop it somewhere else in a first person game. What's the best way to do that?
You want to snap it to the hand of the first person player?
Jayanam Yeah, exactly! I wrote a simple script that lets me pick up objects and carry them around, but if they hit a wall they get off center. I also want the objects to rotate so they face the camera properly.
Two problems/Questions. First, it's very sensitive. Is there a way to slow down the movement?
Second, how can i lock the Y axis? I tried the obvious thing of freezing Y axis on its rigidbody but that didnt work.
did you find a way to lock it? i need it too
multiply the position by a float that is named smooth you can adjust it to your liking im not sure if this works but it should work
Good Luck!
Very nice and clear tutorial ! Thanks !
Excelent Tutorial!!! thnx so much, that helps me alot!!! Regars from Argentina!!!
Simple and working amazing still in 2022 :)
Can somebody please tell me how to use the script on a prefab? My script is not working on the prefab.
I am very very new to Unity and need help.
How could I go about making the object stop once it hits a wall whilst dragging? Currently it goes through anything but if I collide with something it should just stop
Hello I'm having same issue. If you have found any solution then please help me 🙏
unity is throwing up errors like 'Assets\Drag.cs(14,19): error CS0120: An object reference is required for the non-static field, method, or property 'GameObject.transform' and Assets\Drag.cs(24,24): error CS0103: The name 'GetMousePosWorld' does not exist in the current context. please help
For the second error check if your method name 'GetMousePosWorld' is exactly the same as where you are calling the method in 'OnMouseDown'.
really cool! many thanks!
Glad you liked it!
How would i limit the mouse to a specific area?
Remixx i have completely given up on that lmao
İf when ı want to for mobile touch how ı can doit?
How can I lock its movement to only the X axis and also stop when touching another collider (such as ground)?
Is there any way how to move object only in two axis at once? Example: left mouse button move in X and Y and right mouse button move in Z and Y?
As long as u hold the rock up with mouse it builds up acceleration with gravity, how can I fix this?
did u ever find a solution for this?
edit: i figured out a solution. turn off gravity onMouseDown like this:
rb.useGravity =false;
then turn it back to true on onMouseUp
@@bruhvioli that was exactly what i was going to say
I know this is old, but for anyone in the future, you can also set Time.timeScale = 0; when moving it, and back to 1 when the move is finished . . this is what I am doing in my poly bridge knock off, except I am using a button which I call "Play" to activate the time, the time is set to 0 on game play start.
excellent tutorial, thanks for this !
Thx, you're welcome
How do you drag one object by clicking anywhere?
Does this work for mobile(IPhone). I know it gets mouse input but i heard that mouse input also works with touch controls is that correct?
Yes That is correct
I am having a little issue using this in on a boardlike scene. Moving the Object towards the player will cause it to move down and (potentionally) into the ground. Any soloutions?
TH-cam is broken. 3 advertisements for 3 and bit minutes of video.
Thank You!, I've been using this to make my fps game, at first i thought it was very hard to do, but then i realized just how easy it is only a few lines of code. Thank You!
Can you tell me how to make the object by clicking the mouse become a little to the left or to the right, and releasing the mouse returned to the center as it was before clicking?(for kinematic)
How to do this with 2D object
works the same, if your using sprites - only use x and y and within the context of Vector2 instead of Vector3
hey uhh... i want it to have collision with other objects while i hold it.. how do i?
hmm why cant i "clamp" the y position instead of z?
if i change the values simply to y, it just do not react when i try to drag it. but when i change it back to Z it works again :/
I have a same problem It's driving me crazy please help me I'm crying My tears are making a lake
@@user-iv5hl8gu4l uff sorry its already too long ago.
i think i just keep searching for other solutions or i tried around with that one.. i dont remember
Fantastic tutorial!!!
Best tutorial ever
Thanks buddy really really Appricaiated
Do you know how to lock it so it doesn't move the object in the y axis?
estou com a mesma duvida
I want the same too, lock axis
THANK YOU, you are amazing
Does anyone know how to fix that the game objects can be dragged through walls and floors?
Thanks a lot. Helped me a lot.
Works as magic, thank you!
thankyou very nice , it helped me alot.
why the movement speed is so slow?
nice tutorial thank you but i have a problem. when i dragged an object to a wall , it passes through the wall. i think i have to add velocity or something like that for dragging. but i dont know how to do it :/
I want the same too
VERY SIMPLE ADD THIS "mousePoint.y = 0;" TO GetMouseWorldPos() function
this way you lock the y axis
How can I freeze the y-axis while dragging whis this base code?
Thanks! You really Helped Me For My Game!
Glad I could help!
@@JayAnAm :)
Not working for me. Also no errors given... I use a cube with nothing else (no rigid body, throewable, etc)
So you didnt add a rigidbody? Because you will need one 03:03
@@JayAnAm hi. I tried at first with one
what we do if we need to drag object on only x axis
thanks but the object is rotating
Constraint the rotation in the rigidbody setting
My object disappears from the game window when I click on it. I logged the object coordinates in the console and it seems to be sending it way off screen. Unity 2019.2.18f1
same
nwm I copied the script from the desc and it worked
I don’t understand shit since i am a beginner. But it works like a charm
I need this for Super Mario 64 remake to stretch Mario head
Bur, this script works on unity 2017?
with the rock its bout drive its bout powa
Translate please, почему одного ScreenToWorldPoint недостаточно для перемещения объекта, для чего нужен moffset, что это такое?
Here script who want to lock gameobject by Y axis - pastebin.com/AV0cgtnu
You can lock any axis you want
so this script works fine for me!!!
but can someone explain me what's happening?
well, turn on the sound :D
Anybody Knows how to add like a white drag line?
Apparently Callback Executor needs to derive from Mono Behavior??? Help!
Hey man...I love this
I just wanna..know...how do I move the object by dragging along the path...
...help.plzzzz
It works! Thank you!
THE SCRIPT boyz
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class dragobiject : MonoBehaviour
{
private Vector3 mOffset;
private float mZCoord;
void OnMouseDown()
{
mZCoord = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
//idk
mOffset = gameObject.transform.position - GetMouseWorldPos();
}
private Vector3 GetMouseWorldPos()
{
//Y X
Vector3 mousePoint = Input.mousePosition;
// Z COORD
mousePoint.z = mZCoord;
return Camera.main.ScreenToWorldPoint(mousePoint);
}
void OnMouseDrag()
{
transform.position = GetMouseWorldPos() + mOffset;
}
}
thx
Short and sweet. Really nice video :)
perfect! thanks!
Thank you
I can get it to work but only if the objects are closer to the camera??? How can I get it to select distant objects (not that distant really)
Check Here th-cam.com/video/FKEXWn68DSA/w-d-xo.html
does this version work with visual studio code?
Isn't this available in the editor already?
Nice, thx to allow us easy copy past
i'm using Unity 2020.1.10f1 and for some reason in visual studio code i got an error code C1513 } expected
you forgot a closing bracket
little question: how would you limit the object from being able to get dragged through walls?
either raycasts or box colliders on your walls
Thanks my dude!
PERFECT NOW I CAN MAKE AN amnesia like door!
Hey how can i move that only in x axis?
Nice solution, thanks bro :)
lifesaver Thanks man. God Bless You.
Glad it helped
@@JayAnAm Hey, do you have any idea what trs is at 1:57 my game isn't accepting it and I'm using 2018.4.
Cool, It actually works.
Hi Jayanam, how do i move 3d obj move forward/backward along z axis when mouse is up/down ,( currently in your video is show obj is move up/down when mouse is up/down)
up
Why did I also do it my way didn't work ,but as soon as I took your implementation everything worked? Code one in one just like that minus 2 days:(
SPS cel at least someone helped like
Hi there!
Could you please have a sample of this, but using IDragHandler and similar interfaces on a single object/class?
I'm targeting mobile and don't want to use Mouse-related code, as it's considered a bad habit.
Thank you so much
Btw, you know you dont need to write gameObject.transform , just transform is fine, or this.transform
:-) Yes, thx. But I found it a good practice for demonstrating that the gameobject has a transform.
Thank you so much man
Thank you!
Thank you good man!
With that technique, you can drag the objects into the ground and into each other. Is there a way to avoid that?
seme hapens in hello neighbor never join 2 cans in that game
colliders or raycasts could help
@@aperm8834 imagine asking? lol
Thanks bro ! can you help pls i need delete Z and Y just move object on X
You need to ad a rigidbody then go on constraint and freeze the position you dont want it to go on or rotation
@@thepotatogaming2340 nope. that doesn't work, because the script ignores that.
Clean, thanks a lot :)