- Home /
Picked up Objects pass through walls
Hello. I found this script that seems to work pretty good and I made some modifications to it.
All it does it pick up objects when you hold down Left Click and fall when you let go. But it's made so that only Objects with the tag 'Pick' can be picked up.
But I have a problem, while the object is being picked up, it passes through the walls and floors. How do I stop this from happening?
Here's the script:
private var pickObj : Transform = null;
private var hit : RaycastHit;
private var dist : float;
private var newPos : Vector3;
function Update () {
if (Input.GetMouseButton (0)) {
var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
if (!pickObj) {
if (Physics.Raycast(ray, hit) && hit.transform.tag == "Pick") {
if (hit.rigidbody) hit.rigidbody.velocity = Vector3.zero;
pickObj = hit.transform;
dist = Vector3.Distance (pickObj.position, Camera.main.transform.position);
}
}
else {
newPos = ray.GetPoint(dist);
pickObj.position = newPos;
}
}
else {
pickObj = null;
}
}
Thanks
I have 3 different pick up scripts that do similar things. But I'm not sure about them. 2 of them go through walls and one of them I think seems to work well so you can check it out if you want: http://answers.unity3d.com/questions/632889/pick-up-rigid-body.html
Answer by J.D. · Aug 18, 2012 at 04:30 PM
If you change your GameObject positions directly with gameObject.transform.position = new Vector3 Unity doesn't calculate collisions.
In the other hand, the component RigidBody has also a function for move calculating collisions.
Try changingL
pickObj.position = newPos;
to
pickObj.rigidbody.MovePosition(newPos);
Of course, your pickObj needs the RigidBody Component.
Hope I've helped. Good luck.
Thanks for helping. Sadly, it does the same thing. But, it's different.
What it used to do is show the object going through the wall.
But now it appears to stay and not go through the wall, unless I keep pushing it through, then it vanishes and appears on the other side of the wall... meaning it got though.
Have you tried changing collision detection from discrete to continuous or maybe dynamic?
Yup. Tried Discrete, Continuous and Continuous Dynamic. Still the same.
Hmm...
So you could do some trick here.
Tag your walls as "wall".
Inside OnCollisionEnter method you just stop adding force.
boolean canPush;
OnColliderEnter(Collision col){
if(col.gameObject.tag == "wall"){
canPush = true;
}
}
Later, in your Update: if(canPush){ pickObj.rigidbody.$$anonymous$$ovePosition(newPos); }
Something like this could prevent the player force the object against the wall (and win this battle -.- ).
Thanks. Sorry to be dumb, but Unity doesn't like 'col'.
How do I assign my walls to 'col'?
Answer by marjanzr · Oct 17, 2012 at 08:36 PM
i have this problem too.this code dont work .what should i do?
`#pragma strict
private var pickObj : Transform = null;
private var hit : RaycastHit;
private var dist : float;
private var newPos : Vector3;
private var canPush: boolean=false;
function Update () {
if (Input.GetMouseButton (0)) {
var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
if (!pickObj) {
if (Physics.Raycast(ray, hit) && hit.transform.tag == "Pick") {
if (hit.rigidbody) hit.rigidbody.velocity = Vector3.zero;
pickObj = hit.transform;
dist = Vector3.Distance (pickObj.position, Camera.main.transform.position);
}
}
else {
if(canPush){
newPos = ray.GetPoint(dist);
pickObj.rigidbody.MovePosition(newPos);
}
}
}
else {
pickObj = null;
}
}
function OnCollisionEnter (col : Collision) {
if(col.gameObject.tag == "wall") {
canPush = true; } }`
Answer by marjanzr · Oct 17, 2012 at 08:37 PM
i have this problem too.this code dont work .what should i do?
`#pragma strict
private var pickObj : Transform = null;
private var hit : RaycastHit;
private var dist : float;
private var newPos : Vector3;
private var canPush: boolean=false;
function Update () {
if (Input.GetMouseButton (0)) {
var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
if (!pickObj) {
if (Physics.Raycast(ray, hit) && hit.transform.tag == "Pick") {
if (hit.rigidbody) hit.rigidbody.velocity = Vector3.zero;
pickObj = hit.transform;
dist = Vector3.Distance (pickObj.position, Camera.main.transform.position);
}
}
else {
if(canPush){
newPos = ray.GetPoint(dist);
pickObj.rigidbody.MovePosition(newPos);
}
}
}
else {
pickObj = null;
}
}
function OnCollisionEnter (col : Collision) {
if(col.gameObject.tag == "wall") {
canPush = true; } }`
Your answer
Follow this Question
Related Questions
How can i make the ray cast don't go through the walls 1 Answer
Move object to raycast point. 3 Answers
Trigger Event, Ring Pass thru Rod Object 3 Answers
Collision at which side? 1 Answer
Storing and using weapons and objects 0 Answers