- Home /
How do I rotate a bullet (arrow) in Unity 2D?
How do I rotate the bullet? Im a beginner programmer and I can't bring the bullet to rotate. I've tried it with many different approaches but it doesn't work. I think one attempt was pretty close and I will write the code down below. In my case the enemy is a archer and he shoots arrows not bullets.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ArcherCombat : MonoBehaviour
{
[SerializeField]
public Transform player;
[SerializeField]
public Transform FirePoint;
public float range, TimeBTWShots = 5, arrowSpeed;
private float DistanceToPlayer;
[SerializeField]
private GameObject Arrow;
private bool canShoot;
void Start()
{
canShoot = true;
}
// Update is called once per frame
void Update()
{
DistanceToPlayer = Vector2.Distance(transform.position, player.position);
if(DistanceToPlayer <= range)
{
if(player.position.x < transform.position.x && transform.localScale.x < 0
|| player.position.x > transform.position.x && transform.localScale.x > 0)
{
transform.localScale = new Vector2(transform.localScale.x * -1, transform.localScale.y);
}
if (canShoot)
{
StartCoroutine(Shoot());
}
}
}
IEnumerator Shoot()
{
canShoot = false;
yield return new WaitForSeconds(TimeBTWShots);
GameObject newArrow = Instantiate(Arrow, FirePoint.position, Quaternion.identity);
// this is my attempt to rotate the arrow
if(gameObject.transform.localScale.x < 0)
{
newArrow.transform.localScale = new Vector2(newArrow.transform.localScale.x * -1, newArrow.transform.localScale.y);
}
newArrow.GetComponent<Rigidbody2D>().velocity = new Vector2(arrowSpeed * -1 * Time.fixedDeltaTime, 0f);
canShoot = true;
}
}
For anyone wondering: I fixed the problem by checking in which direction the gameObject is facing and then creating an if-statement for both directions. The code looks like this:
IEnumerator Shoot() { canShoot = false; yield return new WaitForSeconds(TimeBTWShots); GameObject newArrow = Instantiate(Arrow, FirePoint.position, Quaternion.identity); if(gameObject.transform.localScale.x < 0) { newArrow.transform.rotation = Quaternion.Euler(0, 180, 0); newArrow.GetComponent<Rigidbody2D>().velocity = new Vector2(arrowSpeed * 1 * Time.fixedDeltaTime, 0f); canShoot = true; } if(gameObject.transform.localScale.x > 0) { newArrow.GetComponent<Rigidbody2D>().velocity = new Vector2(arrowSpeed * -1 * Time.fixedDeltaTime, 0f); canShoot = true; } }
Your answer
Follow this Question
Related Questions
(2D) rotate object to face movement direction 1 Answer
Rotation of the character along the axis Z 0 Answers
Bullet dissapears from screen when I use LookAt? 0 Answers
How can you make a 2D object move based on rotation, and rotate while moving? 1 Answer
Rotate object after swipe according to swipe direction 0 Answers