transform.Rotate(0f, 180f, 0f); поворачивает 2D-спрайт, но не его дочерние элементы

#c# #unity3d

#c# #unity3d

Вопрос:

Я пытаюсь добиться стрельбы из 2D-плеера, прикрепил «точку возрождения» и сделал ее дочерним элементом игрока, когда я пытаюсь перевернуть спрайт, он работает, но он не переворачивает «точку возрождения», поэтому, когда я поворачиваю налево, моя «точка возрождения» все еще выглядитправильно, поэтому, когда я стреляю, пули летят влево, а не вправо.

Полный сценарий:

 public class PlayerController : MonoBehaviour
{  
    void FixedUpdate()
    {
        RaycastHit2D hit = Physics2D.BoxCast(this.transform.position, new Vector2(0.4f, 0.1f), 0f, Vector2.down, groundCheckRadius, groundMask); //using this for a bigger and more accurate ground check
        isTouchingGround = (hit.collider != null) ? true : false;

        movementInput = Input.GetAxis("Horizontal");

        CheckIfStuck(); //Checks if Mario is trying to walk into the wall and get stuck

        if (!isDead)
        {
            if ((playerRigidbody2D.velocity.x > 0 amp;amp; !isFacingRight) || (playerRigidbody2D.velocity.x < 0 amp;amp; isFacingRight))
            {
                playerAnimator.SetBool("turning", true);
            }
            else
            {
                playerAnimator.SetBool("turning", false);
            }

            float movementForceMultiplier = Mathf.Max(maxHorizontalSpeed - Mathf.Abs(playerRigidbody2D.velocity.x), 1);

            playerRigidbody2D.AddForce(new Vector2(movementInput * movementForce * movementForceMultiplier, 0));

            playerRigidbody2D.velocity = new Vector2(Mathf.Clamp(playerRigidbody2D.velocity.x, -maxHorizontalSpeed, maxHorizontalSpeed), Mathf.Clamp(playerRigidbody2D.velocity.y, -maxVerticalSpeed, maxVerticalSpeed));

            if (Input.GetKeyDown(KeyCode.Space))
            {
                if (isTouchingGround)
                {
                    //Play Jump sound
                    if (!poweredUp)
                        audioSource.PlayOneShot(smallJumpSound);
                    else
                        audioSource.PlayOneShot(bigJumpSound);

                    isJumping = true;
                    playerRigidbody2D.velocity = new Vector2(playerRigidbody2D.velocity.x, jumpVelocity);
                    jumpTimeCounter = jumpTime;
                }
            }

            if (jumpTimeCounter > 0 amp;amp; isJumping)
                if (Input.GetKey(KeyCode.Space))
                {
                    jumpTimeCounter -= Time.deltaTime;
                    {
                        playerRigidbody2D.velocity = new Vector2(playerRigidbody2D.velocity.x, jumpVelocity);
                    }
                }

            if (Input.GetKeyUp(KeyCode.Space))
            {
                isJumping = false;
                jumpTimeCounter = 0;
            }

            playerAnimator.SetFloat("movementSpeed", Mathf.Abs(playerRigidbody2D.velocity.x));
            playerAnimator.SetBool("touchingGround", isTouchingGround);
        }

        if (movementInput > 0 amp;amp; !isFacingRight)
        {
            FlipSprite();
        }
        else if (movementInput < 0 amp;amp; isFacingRight)
        {
            FlipSprite();
        }

    }

    void FlipSprite()
    {
        isFacingRight = !isFacingRight;
        //Vector3 tempScale = transform.localScale;
        //tempScale.x *= -1;
        //transform.localScale = tempScale;
        transform.Rotate(0f, 180f, 0f);
    }
}
  

Метод Flip:

 void FlipSprite()
    {
        isFacingRight = !isFacingRight;
        //Vector3 tempScale = transform.localScale;
        //tempScale.x *= -1;
        //transform.localScale = tempScale;
        transform.Rotate(0f, 180f, 0f);
    }
  

Комментарии:

1. не могли бы вы, пожалуйста, немного сократить свой код до необходимого? Я не могу найти ни spawnpoint одного или чего-то подобного в вашем коде .. ни метод shoot , ни что-то похожее на него…

2. Я удалил код, который, по моему мнению, не нужен. Поскольку он еще не запускается, все, что я хочу сделать сейчас, это убедиться, что «точка возрождения» (дочерний элемент объекта Player) переворачивается вместе с самим игроком. Это означает, что если я поверну налево, дочерний элемент также повернет налево, а его ось x будет указывать налево, и наоборот.

3. Я бы не стал использовать этот подход… почему бы не использовать что-то вроде, например var spawnPosition = player.transform.position transform.right * spawnDistance * (isFacingRight ? 1 : -1) ?