Unity 2D Вид зверху + обертання на 45 + постріл

2075 / Unity / 2D / Гравець / Вид зверху + обертання на 45 + постріл

 

PlayerRotate45Shoot2D
  • PlayerImage – має знаходитися всередині Player (дивиться вправо)
  • Player і Bullet мають мати Rigidbody2D
  • bulletPos – всередині PlayerImg (справа) 
  • Edit -> Project Settings… -> Input Manager – змінити клавіши
  • Якщо герой чи куля дивляться не вправо, то їх покласти в пустий об'єкт та розгорнути
  • Якщо пуля проходить крізь стіни Rigidbody2D -> Collision Detection = Continuous

 

public GameObject playerImg;
public GameObject bullet;
public GameObject bulletPos;
public float playerSpeed = 6.0f;
public float bulletSpeed = 400.0f;
Rigidbody2D rb;
Vector2 movement;

void Start()
{
  rb = GetComponent<Rigidbody2D>();
}

void Update()
{
  movement.x = Input.GetAxisRaw("Horizontal");
  movement.y = Input.GetAxisRaw("Vertical");

  if (movement.x == 0 && movement.y > 0)
  {
    playerImg.transform.rotation = Quaternion.Euler(0, 0, 90);
  }
  else if (movement.x == 0 && movement.y < 0)
  {
    playerImg.transform.rotation = Quaternion.Euler(0, 0, -90);
  }
  else if (movement.x > 0 && movement.y == 0)
  {
    playerImg.transform.rotation = Quaternion.Euler(0, 0, 0);
  }
  else if (movement.x < 0 && movement.y == 0)
  {
    playerImg.transform.rotation = Quaternion.Euler(0, 0, 180);
  }
  else if (movement.x > 0 && movement.y > 0)
  {
    playerImg.transform.rotation = Quaternion.Euler(0, 0, 45);
  }
  else if (movement.x > 0 && movement.y < 0)
  {
    playerImg.transform.rotation = Quaternion.Euler(0, 0, -45);
  }
  else if (movement.x < 0 && movement.y > 0)
  {
    playerImg.transform.rotation = Quaternion.Euler(0, 0, 135);
  }
  else if (movement.x < 0 && movement.y < 0)
  {
    playerImg.transform.rotation = Quaternion.Euler(0, 0, -135);
  }

  if (Input.GetButtonDown("Fire1"))
  {
    GameObject go = Instantiate(bullet, bulletPos.transform.position, Quaternion.Euler(0, 0, 0));
    go.transform.rotation = Quaternion.Euler(0, 0, playerImg.transform.rotation.eulerAngles.z);
    Rigidbody2D goRb = go.GetComponent<Rigidbody2D>();
    Destroy(go, 5f);

    if (playerImg.transform.rotation.eulerAngles.z == 0)
    {
      goRb.AddForce(new Vector2(5, 0) * bulletSpeed);
    }
    else if (playerImg.transform.rotation.eulerAngles.z == 180)
    {
      goRb.AddForce(new Vector2(-5, 0) * bulletSpeed);
    }
    else if (playerImg.transform.rotation.eulerAngles.z == 90)
    {
      goRb.AddForce(new Vector2(0, 5) * bulletSpeed);
    }
    else if (playerImg.transform.rotation.eulerAngles.z == 270)
    {
      goRb.AddForce(new Vector2(0, -5) * bulletSpeed);
    }
    else if (playerImg.transform.rotation.eulerAngles.z == 45)
    {
      goRb.AddForce(new Vector2(2.5f, 2.5f) * bulletSpeed);
    }
    else if (playerImg.transform.rotation.eulerAngles.z == -45)
    {
      goRb.AddForce(new Vector2(2.5f, -2.5f) * bulletSpeed);
    }
    else if (playerImg.transform.rotation.eulerAngles.z == 135)
    {
      goRb.AddForce(new Vector2(-2.5f, 2.5f) * bulletSpeed);
    }
    else if (playerImg.transform.rotation.eulerAngles.z == -135)
    {
      goRb.AddForce(new Vector2(-2.5f, -2.5f) * bulletSpeed);
    }
  }
}

void FixedUpdate()
{
  rb.MovePosition(rb.position + movement * playerSpeed * 0.02f);
}