Forum begins after the advertisement:


[Part 1] Issue with player’s sprite not flipping properly

Home Forums Video Game Tutorial Series Creating a Metroidvania in Unity [Part 1] Issue with player’s sprite not flipping properly

Viewing 12 posts - 1 through 12 (of 12 total)
  • Author
    Posts
  • #17683
    Terence
    Level 30
    Keymaster
    Helpful?
    Up
    0
    ::

    @redakumaproduction has a question regarding the player’s sprite flipping.

    i am trying to do the flip part,everything is type correctly, but as soon as i move in a direction or an other, my player disapear . any help would be verry appreciated. i also tried this code and it too didnt work , i also noticed that as soon as i move my z scale become 0.
    void Flip()
    {
        if (xAxis < 0)
        {
            transform.localScale = new Vector2(-1 -Mathf.Abs(transform.localScale.x), transform.localScale.y);
        }
        else if (xAxis > 0)
        {
            transform.localScale = new Vector2(1 Mathf.Abs(transform.localScale.x), transform.localScale.y);
        }
    }
    #17685
    Ser Apustaja
    Level 5
    AI Assistant
    (BETA)
    Helpful?
    Up
    0
    ::

    It looks like there are a couple of issues in your Flip method that may be causing the player to disappear.

    1. Setting the Scale Incorrectly: When you are flipping the sprite, you should not subtract the absolute value of the current scale from -1. Instead, you should just set the x scale to -1 or 1 depending on the direction. The following changes can be made:
    void Flip()
    {
        if (xAxis  0)
        {
            transform.localScale = new Vector2(Mathf.Abs(transform.localScale.x), transform.localScale.y);
        }
    }
    1. Z Scale: You mentioned that the z scale becomes 0. Ensure that you do not modify the z scale in your Flip method, as it should remain 1 (or whatever your original z scale is). In Unity, if the z scale is 0, the object will not be rendered correctly.

    2. Calling the Flip Method: Ensure that your Flip method is being called appropriately in your code, ideally when you’re checking for input. For example, you can call it inside your update loop or where you handle player movement.

    3. Complete Movement Code: If you have a complete player movement code, ensure that it’s not conflicting with the scaling. Make sure that the xAxis variable reflects the correct input value you want to use.

    Here’s a more complete example of how you might integrate this:

    void Update()
    {
        float xAxis = Input.GetAxis("Horizontal");
        MovePlayer(xAxis); // Assuming you have a method to handle movement
        Flip(xAxis);
    }
    
    void MovePlayer(float xAxis)
    {
        // Your movement code here
    }
    
    void Flip(float xAxis)
    {
        if (xAxis  0)
        {
            transform.localScale = new Vector2(Mathf.Abs(transform.localScale.x), transform.localScale.y);
        }
    }

    Make sure to test the code after making these adjustments. If you still encounter issues, check if there are any other parts of your code that might be affecting the player’s scale or visibility.

    #17687
    Tom’s Reef
    Level 3
    Participant
    Helpful?
    Up
    0
    ::

    here is my complete coding up to now

    using UnityEngine;
    
    public class PlayerController : MonoBehaviour
    {
        [Header("Horizontal Movement Settings")]
        [SerializeField] private float WalkSpeed = 1f;
    
    
        [Header("Ground Check Settings")]
        [SerializeField] private float jumpForce = 45;
        [SerializeField] private Transform GroundCheckPoint;
        [SerializeField] private float GroundCheckY = 0.2f;
        [SerializeField] private float GroundCheckX = 0.5f;
        [SerializeField] private LayerMask WhatIsGround;
    
        private Rigidbody2D rb;
        private float xAxis;
        Animator anim;
    
        // Start is called once before the first execution of Update after the MonoBehaviour is created
        void Start()
        {
            rb= GetComponent<Rigidbody2D>();
    
            anim = GetComponent<Animator>();
        }
    
        // Update is called once per frame
        void Update()
        {
            GetInputs();
            Move();
            Jump();
            Flip();
        }
        void GetInputs()
        {
            xAxis = Input.GetAxisRaw("Horizontal");
        }
    
        void Flip()
        {
            if(xAxis < 0)
            {
                transform.localScale = new Vector2( -1, transform.localScale.y);
            }
            else if(xAxis > 0)
            {
                transform.localScale = new Vector2( 1, transform.localScale.y);
            }
        }
    
        private void Move()
        {
            rb.linearVelocity = new Vector2(WalkSpeed * xAxis, rb.linearVelocity.y);
            anim.SetBool("Walk", rb.linearVelocity.x != 0 && Grounded());
        }
    
        public bool Grounded()
        {
            if (Physics2D.Raycast(GroundCheckPoint.position, Vector2.down, GroundCheckY, WhatIsGround)
                || Physics2D.Raycast(GroundCheckPoint.position + new Vector3(GroundCheckX, 0, 0), Vector2.down, GroundCheckY, WhatIsGround)
                || Physics2D.Raycast(GroundCheckPoint.position + new Vector3(-GroundCheckX, 0, 0), Vector2.down, GroundCheckY, WhatIsGround))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        void Jump()
        {
            if (Input.GetButtonUp("Jump") && rb.linearVelocity.y > 0)
            {
                rb.linearVelocity = new Vector2(rb.linearVelocity.x, 0);
            }
    
            if (Input.GetButtonDown("Jump") && Grounded())
            {
                rb.linearVelocity = new Vector3(rb.linearVelocity.x, jumpForce);
            }
        }
    
    }
    #17688
    Ser Apustaja
    Level 5
    AI Assistant
    (BETA)
    Helpful?
    Up
    0
    ::

    Thank you for sharing your complete code! I see a few issues that could be contributing to your player disappearing when flipping or moving.

    1. HTML Entities: It looks like your code has HTML entities (like < and >) instead of the actual symbols (). This can cause syntax errors and unexpected behaviors. Make sure to replace all instances of `<` with.

    2. Flipping Logic: You’re correctly flipping the sprite in the Flip method, but ensure that you’re checking the right conditions. As long as your xAxis is being updated correctly in your GetInputs() method, it should work fine.

    3. Z Scale: From your description, if your sprite’s z scale becomes 0, it could be an issue with how you’re modifying the scale. The Flip method should not affect the z scale, but if you accidentally set it to 0 somewhere else, it will cause the object to disappear in a 2D view. Make sure to keep the z scale constant, typically at 1.

    4. Animator: If you are using an Animator, ensure that the animations do not inadvertently change the scale of the sprite. Check your animation settings and ensure that they aren’t conflicting with the scale changes in the Flip method.

    Here’s your corrected code with the HTML entities fixed:

    using UnityEngine;
    
    public class PlayerController : MonoBehaviour
    {
        [Header("Horizontal Movement Settings")]
        [SerializeField] private float WalkSpeed = 1f;
    
        [Header("Ground Check Settings")]
        [SerializeField] private float jumpForce = 45;
        [SerializeField] private Transform GroundCheckPoint;
        [SerializeField] private float GroundCheckY = 0.2f;
        [SerializeField] private float GroundCheckX = 0.5f;
        [SerializeField] private LayerMask WhatIsGround;
    
        private Rigidbody2D rb;
        private float xAxis;
        Animator anim;
    
        void Start()
        {
            rb = GetComponent();
            anim = GetComponent();
        }
    
        void Update()
        {
            GetInputs();
            Move();
            Jump();
            Flip();
        }
    
        void GetInputs()
        {
            xAxis = Input.GetAxisRaw("Horizontal");
        }
    
        void Flip()
        {
            if (xAxis  0)
            {
                transform.localScale = new Vector2(1, transform.localScale.y);
            }
        }
    
        private void Move()
        {
            rb.velocity = new Vector2(WalkSpeed * xAxis, rb.velocity.y);
            anim.SetBool("Walk", rb.velocity.x != 0 && Grounded());
        }
    
        public bool Grounded()
        {
            if (Physics2D.Raycast(GroundCheckPoint.position, Vector2.down, GroundCheckY, WhatIsGround)
                || Physics2D.Raycast(GroundCheckPoint.position + new Vector3(GroundCheckX, 0, 0), Vector2.down, GroundCheckY, WhatIsGround)
                || Physics2D.Raycast(GroundCheckPoint.position + new Vector3(-GroundCheckX, 0, 0), Vector2.down, GroundCheckY, WhatIsGround))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    
        void Jump()
        {
            if (Input.GetButtonUp("Jump") && rb.velocity.y > 0)
            {
                rb.velocity = new Vector2(rb.velocity.x, 0);
            }
    
            if (Input.GetButtonDown("Jump") && Grounded())
            {
                rb.velocity = new Vector2(rb.velocity.x, jumpForce);
            }
        }
    }

    Make sure to use this corrected code and test it again. If the player still disappears, check other parts of your game setup, such as the sprite renderer component and ensure it’s not being affected by any other scripts or settings.

    #17689
    Tom’s Reef
    Level 3
    Participant
    Helpful?
    Up
    0
    ::

    i tried the corrected code, unfortunetly it didnt work .

    it give me an error with this line

    if (xAxis 0)

    #17690
    Ser Apustaja
    Level 5
    AI Assistant
    (BETA)
    Helpful?
    Up
    0
    ::

    It seems like there is a syntax error in your Flip method. The condition if (xAxis 0) is missing a comparison operator. It should be either “ depending on what you want to check.

    Here’s the corrected line:

    if (xAxis < 0)

    Make sure to replace that line in your Flip method. The complete Flip method should look like this:

    void Flip()
    {
        if (xAxis  0)
        {
            transform.localScale = new Vector2(1, transform.localScale.y);
        }
    }

    Please try this correction and let me know if you encounter any further issues!

    #17691
    Tom’s Reef
    Level 3
    Participant
    Helpful?
    Up
    0
    ::

    i did not worked , and the z scale always end up on zero.

    i must add that the size of my sprite are not 1 , its 0.590268 on the x and y axis

    #17692
    Ser Apustaja
    Level 5
    AI Assistant
    (BETA)
    Helpful?
    Up
    0
    ::

    It sounds like the issue with the z scale becoming zero might be related to how you’re setting the local scale in the Flip method. Since your sprite’s size is not 1, you need to ensure that you maintain the original scale values for the y and z axes while flipping the x axis.

    Here’s how you can modify your Flip method to keep the original scale for y and z:

    void Flip()
    {
        Vector3 currentScale = transform.localScale; // Store the current scale
        if (xAxis  0)
        {
            transform.localScale = new Vector3(Mathf.Abs(currentScale.x), currentScale.y, currentScale.z);
        }
    }

    This way, you are ensuring that the z scale remains unchanged and is set to whatever it was originally.

    Please try this adjustment and let me know if the issue persists. Additionally, could you clarify if there are any other scripts or components that might be affecting the player’s scale?

    #17693
    Tom’s Reef
    Level 3
    Participant
    Helpful?
    Up
    0
    ::

    the z axis dont change anymore, but the caracter dont flip, and i had to change if (xAxis 0) for if (xAxis < 0) to work

    #17694
    Ser Apustaja
    Level 5
    AI Assistant
    (BETA)
    Helpful?
    Up
    1
    ::

    It seems like the character is not flipping because the xAxis value might not be updating correctly or the Flip method is not being called at the right time.

    Please ensure that your GetInputs() method is correctly capturing the input values. You should check if the xAxis variable is being set to the expected values when you press the left or right movement keys.

    Here’s a quick checklist:

    1. Input Settings: Make sure that the input settings in Unity are configured correctly for “Horizontal” axis. You should be able to move left and right using the assigned keys (usually A/D or Left/Right Arrow keys).

    2. Debugging: Add a debug log in your GetInputs() method to see what value xAxis is getting:

      void GetInputs()
      {
          xAxis = Input.GetAxisRaw("Horizontal");
          Debug.Log("xAxis: " + xAxis); // This will print the value of xAxis to the console
      }
    3. Calling Flip: Ensure that the Flip() method is being called in the Update() method after GetInputs():

      void Update()
      {
          GetInputs();
          Move();
          Jump();
          Flip(); // Make sure this is called after GetInputs
      }

    If you check these points and the character still does not flip, could you let me know what keys you are using to control the character? This will help in diagnosing the issue further.

    has upvoted this post.
    #17695
    Tom’s Reef
    Level 3
    Participant
    Helpful?
    Up
    1
    ::

    i got it to work, this is my code

    void Flip()
    {
        Vector3 currentScale = transform.localScale; // Store the current scale
        if (xAxis < 0)
    {
            transform.localScale = new Vector3(Mathf.Abs(currentScale.x), currentScale.y, currentScale.z);
        }
        else if (xAxis > 0)
        {
            transform.localScale = new Vector3(-Mathf.Abs(currentScale.x), currentScale.y, currentScale.z);
        }
    }
    has upvoted this post.
    #17696
    Ser Apustaja
    Level 5
    AI Assistant
    (BETA)
    Helpful?
    Up
    1
    ::

    It looks like you’ve made a modification to your Flip method that allows your character to flip correctly! However, it seems there is a small issue with the logic in your Flip method.

    Currently, when xAxis is less than 0, you are setting the x scale to its absolute value, which means it will always be positive. This will prevent the character from flipping to face left. Instead, you should set the x scale to its negative value when moving left.

    Here’s the corrected version of your Flip method:

    void Flip()
    {
      Vector3 currentScale = transform.localScale; // Store the current scale
      if (xAxis  0)
      {
          transform.localScale = new Vector3(Mathf.Abs(currentScale.x), currentScale.y, currentScale.z); // Flip right
      }
    }

    This way, when xAxis is less than 0, the character will face left, and when xAxis is greater than 0, it will face right.

    Does this adjustment work for you? If you have any further questions or issues, feel free to ask!

    has upvoted this post.
Viewing 12 posts - 1 through 12 (of 12 total)
  • You must be logged in to reply to this topic.

Go to Login Page →


Advertisement below: