- Home /
2D Character Shooting
I'm still learning C#, I'm new to Unity, and I've been trying to piecemeal code together to make my character shoot for days now so there might be some erroneous code mixed in here. My character can move both directions, jump and double jump, and I've gotten it so it will shoot in the direction I'm traveling but only while the direction button is being pressed down(if I'm not moving when I shoot, then the projectile just sits in place on the screen), and it travels the exact speed my player is traveling (this is probably because I resorted to using my player movement code for the projectile since I couldn't get anything else to work).
I can't figure out how to code it so it will fire with a fixed velocity in the direction my player is facing instead of the way they are traveling. My character can turn left and right and I'm trying to get the direction he shoots to flip left and right accordingly without having to actually be traveling in that direction (ie standing still).
I would really appreciate it if anyone could help me with this. Thank you!
I created a "weapon" object and put a "projectile" child object under it. Right now the projectile script is attached to the projectile object.
Here is the script that is attached to the Player:
using UnityEngine;
using System.Collections;
public class charactercontroller : MonoBehaviour {
public float maxSpeed = 10f;
bool facingRight = true;
Animator anim;
bool grounded = false;
public Transform groundCheck;
float groundRadius = 0.2f;
public LayerMask whatIsGround;
public float jumpForce = 10000f;
bool doubleJump = false;
// Projectile
public GameObject Projectile;
public float attackSpeed = 0f;
public float coolDown = 0;
public float yValue = 1f;
public float xValue = 0.2f;
void Start()
{
anim = GetComponent<Animator> ();
}
void FixedUpdate ()
{
grounded = Physics2D.OverlapCircle (groundCheck.position, groundRadius, whatIsGround);
anim.SetBool ("Ground", grounded);
// When can you doubleJump
if (grounded)
doubleJump = false;
anim.SetFloat ("vSpeed", GetComponent<Rigidbody2D> ().velocity.y);
float move = Input.GetAxis ("Horizontal");
// Set Character so it can't change direction while in the air.
if (!grounded && !doubleJump)
return;
anim.SetFloat ("Speed", Mathf.Abs (move));
GetComponent<Rigidbody2D> ().velocity = new Vector2 (move * maxSpeed, GetComponent<Rigidbody2D> ().velocity.y);
if (move > 0 && !facingRight)
Flip ();
else if (move < 0 && facingRight)
Flip ();
}
void Update()
{
// Enable jump and double jump
float move = Input.GetAxis ("Horizontal");
if ((grounded || !doubleJump) && Input.GetKeyDown (KeyCode.Space)) {
anim.SetBool ("Ground", false);
GetComponent<Rigidbody2D>().AddForce(new Vector2(move, jumpForce));
if(!doubleJump && !grounded)
doubleJump = true;
}
if (Time.time >= coolDown)
{
if (Input.GetKeyDown (KeyCode.DownArrow))
{
Fire();
}
}
}
void Fire()
{
// Make a bullet with the same position and rotation as the player
Rigidbody2D pPrefab = Instantiate (Projectile, new Vector3(transform.position.x + xValue, transform.position.y + yValue, transform.position.z), transform.rotation) as Rigidbody2D;
pPrefab.GetComponent<Rigidbody2D>().AddForce(transform.up * maxSpeed);
// Wait 1 seconds
coolDown = Time.time + attackSpeed;
}
// }
void Flip()
{
facingRight = !facingRight;
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}
}
And here is the code that is attached to my projectile object:
using UnityEngine;
using System.Collections;
public class Projectile : MonoBehaviour {
bool facingRight = true;
public float speed = 1f;
/*Total time to wait*/
public float timeToDestroy = 5f;
/*Total elapsed time to destroy*/
public float elapsedTimeToDestroy;
float move = Input.GetAxis ("Horizontal");
void Start ()
{
GetComponent<Rigidbody2D> ().velocity = new Vector2 (move * speed, GetComponent<Rigidbody2D> ().velocity.y);
}
void FixedUpdate ()
{
if (move > 0 && !facingRight)
Flip ();
else if (move < 0 && facingRight)
Flip ();
transform.Translate(0, 0, speed);
elapsedTimeToDestroy += Time.deltaTime;
if (elapsedTimeToDestroy >= timeToDestroy)
{
Destroy(gameObject);
}
}
void Flip()
{
facingRight = !facingRight;
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}
}
Your answer
Follow this Question
Related Questions
shooting raycast 1 Answer
fps shooting enemy 1 Answer
How to make bullets spread in unity2D? 0 Answers
How to make 2d shooting towards the mouse but have it continue in staright line afterwards? 1 Answer
Shooting with Limited Ammo 2 Answers