- Home /
Raycast attracted to scene origin (0,0,0)
I'm experimenting with a top-down 2D shooter gameplay. The player character aims at the cursor and fires high velocity bullets. From one frame to the other the bullets were skipping over my enemies so I decided to use raycast instead of colliders.
I thought what I had was working fine but I realised that enemies were dying no where near my bullets and upon further inspection I realised the rays were stretching to the world origin, which makes the bullet effect a wide margin. It was difficult to get a quality screenshot but you can see what I mean here.
I know this has something to do with the difference between points and directions, but I don't rightly understand and I've tried all kinds of stuff to figure it out. Even trying linecast instead was producing strange results.
Here is all the relevant code.
public class Bullet : MonoBehaviour {
public Vector3 speed = new Vector3(0f,1f,0f);
void FixedUpdate ()
{
Vector3 nextPos = transform.position + speed;
RaycastHit2D hit = Physics2D.Raycast(transform.position, (nextPos.normalized));
Debug.DrawRay(transform.position, nextPos.normalized);
}
}
Currently I have it normalised because I read that was the difference between a point and a direction but again I have no understanding of what's happening, and clearly it didn't work. If it's not clear, what I want to happen is for the raycast to start at the bullet and trail behind it a bit.
Answer by LCStark · Sep 23, 2018 at 08:13 PM
You want to generate a ray from your current position in the direction you are moving. To get that direction, you have to subtract your current position from your next one.
Vector3 nextPos = transform.position + speed;
Vector3 direction = nextPos - transform.position;
RaycastHit2D hit = Physics2D.Raycast(transform.position, direction.normalized);
You are currently using your objects nextPosition
as the direction. When you do that, that position is treated as a vector starting in the coordinate system origin (0,0,0) going towards that position. When you normalize it, it still starts in the same place and goes towards the same direction.
After applying that change, the ray extends straight up. It might be relevant that the bullets are instantiated with the same rotation as the player. This had me thinking about world space / local space. I think my next position calculation is the problem because as far as the raycast is concerned the next position is 1 unit above the bullet. That being said, the actual bullet prefab does move as I expect it to. I tried playing with transform.localPosition but it doesn't seem to work that way.
Yes, that would be the problem. You should also rotate your speed. This should do the job:
Vector3 nextPos = transform.position + transform.rotation * speed;