Making The Z rotation always on 0 plz help
I'm very new to Unity and C#, my sprite he requires a kinematic rigid body to move around properly but if I made it a dynamic rigid body he moves around fine just when he shoots his Z rotation changes and he rotates I would like it to stay on dynamic just if someone could please help me with the code to make sure his Z rotation is always 0 that would be great also here is the code i use to move the "fish"
public float Speed; public GameObject FirePoint; public string Tag;
bool facingRight = true;
public void OnTriggerEnter2D(Collider2D Border)
{
if (Border.gameObject.tag == Tag)
{
Debug.Log("TouchingBorder!");
}
}
void Update()
{
Vector3 target = Camera.main.ScreenToWorldPoint(Input.mousePosition);
target.z = transform.position.z;
transform.position = Vector3.MoveTowards(transform.position, target, Speed * Time.deltaTime/Mathf.Abs(transform.localScale.x));
// using mousePosition and player's transform (on orthographic camera view)
var delta = target - transform.position;
if (delta.x >= 0 && !facingRight)
{ // mouse is on right side of player
transform.localScale = new Vector3(
Mathf.Abs(transform.localScale.x),
transform.localScale.y,
transform.localScale.z); // or activate look right some other way
FirePoint.transform.Rotate(0f, -180f, 0f);
facingRight = true;
}
else if (delta.x < 0 && facingRight)
{ // mouse is on left side
transform.localScale = new Vector3(
-Mathf.Abs(transform.localScale.x),
transform.localScale.y,
transform.localScale.z); // activate looking left
FirePoint.transform.Rotate(0f, 180f, 0f);
facingRight = false;
}
}
by the way, I watch a tutorial to get this code but I sort of understand of what it is doing also please don't refer me a link to the unity manual for rigid bodies
Answer by lgarczyn · Jan 23, 2020 at 04:05 AM
Same old advice, but don't use the transform to move a rigidbody.
Since your rigidbody is kinematic, you need to do a few things:
Use FixedUpdate instead of Update
Add a private RigidBody2D variable called rb, to store the rigidbody of your object
Use a Vector2 for the target if you don't use the z
change your movement code to this:
// Get the movement magnitude this frame float deltaMove = Speed * Time.fixedDeltaTime / Mathf.Abs(transform.localScale.x); // Get the movement direction, but limited to your speed Vector2 targetDir = Vector2.ClampMagnitude(target - rb.position, deltaMove); // Move to the new position rb.MovePosition(rb.position + targetDir);
As for your rotation, note that
FirePoint.transform.Rotate(0f, -180f, 0f);
is exactly equivalent to
FirePoint.transform.Rotate(0f, 180f, 0f);
Rotating 180 degrees on an axis clockwise is the same as rotating 180 degrees counterclockwise.
The reason that your object is rotation on the z axis is not in this code though.
Your answer
Follow this Question
Related Questions
How can I make a ball roll when using Vector3.MoveTowards? 0 Answers
Rigidbody2D.Cast() against mutiple colliders with a single Rigidbody2D 0 Answers
Rigidbody2D.rotation unclear behaviour 0 Answers
[UNET] Rigidbody physics sync 0 Answers
How Calculation a new rotate on circle2d when add torque 0 Answers