Yay, more on my fake physics because it'd be easier for what I'm making so, errors on collision, it only works on certain studs, could someone help?
This script detects the collision, for my local to handle, and say whether something's in the way or not :
detectLeft=function() local ray = Ray.new(script.Parent.Parent.CFrame.p,((CFrame.new(100,0,0) * CFrame.new(script.Parent.Parent.CFrame.p)).lookVector).unit * 1) local ignore = script.Parent local hit, position, normal = workspace:FindPartOnRay(ray, ignore) if hit then script.Parent.Left.Value=true else script.Parent.Left.Value=false end end detectRight=function() local ray = Ray.new(script.Parent.Parent.CFrame.p,((CFrame.new(-100,0,0) * CFrame.new(script.Parent.Parent.CFrame.p)).lookVector).unit * 1) local ignore = script.Parent local hit, position, normal = workspace:FindPartOnRay(ray, ignore) if hit then script.Parent.Right.Value=true else script.Parent.Right.Value=false end end detectForward=function() local ray = Ray.new(script.Parent.Parent.CFrame.p,((CFrame.new(0,0,100) * CFrame.new(script.Parent.Parent.CFrame.p)).lookVector).unit * 1) local ignore = script.Parent local hit, position, normal = workspace:FindPartOnRay(ray, ignore) if hit then script.Parent.Forward.Value=true else script.Parent.Forward.Value=false end end detectBackwards=function() local ray = Ray.new(script.Parent.Parent.CFrame.p,((CFrame.new(0,0,-100) * CFrame.new(script.Parent.Parent.CFrame.p)).lookVector).unit * 1) local ignore = script.Parent local hit, position, normal = workspace:FindPartOnRay(ray, ignore) if hit then script.Parent.Backwards.Value=true else script.Parent.Backwards.Value=false end end game:service'RunService'.Stepped:connect(function() detectLeft() detectRight() detectForward() detectBackwards() end)
Is it that I'm not using lookvector, on the raycasting, or what? I'll experiment while waiting for answers. If you find nothing wrong, and you don't know what the problem is, it's that the collision only works in certain directions.
Funny that I ran into this; I have an artificial collision script as well, but because collisions are much more complex than simply a few vectors (since objects can interfere with other objects from multiple angles), I simply use the "theoretical cylinder" method. Objects are checked based on their magnitude to others on the X,Z plane, and then a predetermined height based on the object being checked is compared to all other objects to make sure the new position won't collide into others on this axis as well. However, this is because all parts in this game are anchored to help deny lag. Here's a visual of how my method works:
Since each of these models only have to calculate based on a rough cylinder occupancy space, the server doesn't have to do as much math and the result is still reasonable. The main problem with your code is that it can only detect objects along the four directions it's facing. For example,
in this picture, block 2 is avoiding the four rays coming off of block one's collision script. Even block 2's collision script does not notice the impending collision because of the positioning of the rays.
Unfortunately, this is inevitable for ANY number of rays off of a block, since there will always be an object small enough heading in just the right angle to cause a collision, even though if there are more rays (per angle measurement), only the less severe collision errors can occur. I would suggest using the cylinder method, or even a sphere method shown below (where you just compare magnitudes, but based on all 3 axes instead of 2).
If your objects are specifically checking for square collision properties, I'm not sure there is a full-proof method for this, at least in my eyes, without just letting ROBLOX's unanchored physics engine handle it (even though it can be glitchy). I hope I helped.