- Home /
Raycast hits and then doesn't fire again? 2D Game Raycasting Problem
Hi,
My issue involves rotating a 2D player sprite's z axis to match the slope incline they're walking on. Essentially I want them to stand up "straight" relative to the ground, rather than the world Y axis, when standing on any point of the inside edge of a circle.
For this I'm trying to use a raycast to return the ground normal and then match the transform.up to this normal.
I wanted to setup a raycast2d which would fire from the base of the player sprite to return new normal data everytime it hits so that when the player moves, they are constantly changing z rotation to match the normal, HOWEVER, the ray seems only to fire until it detects a hit; meaning that it sets the player's new z axis to whatever normal it first collects, then doesn't try to check again - despite being in Update(). This obviously leaves the player sprite at an odd and unchanging angle.
Code:
void Update() {
if (Input.GetAxis("Horizontal") != 0)
{
rb.velocity = new Vector2(Input.GetAxis("Horizontal") * moveSpeed, rb.velocity.y);
}
if (Input.GetAxis("Horizontal") < -0.1)
{
mySpriteRenderer.flipX = true;
}
if (Input.GetAxis("Horizontal") > 0.1)
{
mySpriteRenderer.flipX = false;
}
RaycastHit2D hit = Physics2D.Raycast(origin, Vector2.down, 5.0f);
// Debug.DrawRay(origin, Vector2.down, Color.red, hit.distance);
transform.up = hit.normal;
}
Please can anyone help?
(I'm pretty new to this so apologies if this is a ridiculous question for whatever reason :L)
Answer by Roger_0123 · Mar 10, 2020 at 04:01 PM
Hello, transform.up does not change object orientation. Looking at your code, after calculating hit.normal you need to rotate 90 degrees clockwise in order to get the correct looking direction. I link this answer in order to achieve this, but this should work:
Vector3 direction = Quaternion.Euler(0, 0, -90) * hit.normal;
/*Don't know if this will rotate clockwise, in case try +90 degrees.
After that, use LookRotation*/
transform.rotation = Quaternion.LookRotation(direction, Vector3.forward) //or backward?