#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)
?