help with firing projectile, character controller + child object

I have a character controller (with a plane childed for sprite texture), (This is a 2D platform game). I also added an empty gameobject called “shuriken_launcher” which I am using as a launch point for my projectile.

What I am stuck on is how to get the projectile firing off in the direction my character is facing so when walking left and fire pressed projectile goes <===== and facing right projectile goes =====> I am using the script below at the moment this only fire’s right all the time as I lack the wording to fire along the child objects axis (assuming the child rotates with the character object it is childed to?

private var ray : Ray;
private var rayCastHit : RaycastHit;
var bulletPrefab:Transform;
var spawnRightObject : GameObject;
//var mySound: AudioClip;

function Start()
    {
    spawnRightObject = GameObject.Find("shuriken_launcher");
    }

function Update(){

if(Input.GetMouseButtonDown(0)){

ray = Camera.main.ScreenPointToRay (Input.mousePosition);

if (Physics.Raycast (ray, rayCastHit)){

if(rayCastHit.transform.name == "fire_button"){
//audio.clip = mySound;
//audio.Play();

    var rightBullet=Instantiate(bulletPrefab, spawnRightObject.transform.position,Quaternion.identity);
    rightBullet.rigidbody.AddForce(1000,0,0);
    }
   }
  }
}

any pointers or help would be appriciated, thankyou for looking, I’m using javascript as I am still trying to wrap my head around programming!

this is my character controller/movement script, would your solution apply to this? (thankyou for your quick response!)

public var skin : GUISkin;						//GUI skin
    	public var mesh : GameObject;					//Mesh
    	public var texMove : Texture2D[];				//Move texture
    	public var texJump : Texture2D;					//Jump texture
    	public var audioJump : AudioClip;				//Jump sound
    	public var audioDead : AudioClip;				//Dead sound
    	private var selectedTex : int;					//Selected texture
    	public var texUpdateTime : float;				//Texture update time
    	private var tmpTexUpdateTime : float;			//Tmp texture update time
    	public var moveSpeed : float;					//Move speed
    	public var jumpSpeed : float;					//Jump speed
    	public var gravity : float;						//Gravity
    	private var dir : Vector3;						//The direction the player is movin
    	private var rightTouchPad : GameObject;			//Right touchpad
    	private var leftTouchPad : GameObject;			//Left touchpad
    	var dead = false;								//Are we dead
    	private var controller : CharacterController;	//The character controller
    	var respawn : Transform;						//respawn point
    	var Ninja : GameObject;							//player
    	
    	//try to add in ducking later...public var crouch : Texture2D;
    	
    	
    	function Start ()
    	{
    		//Find the character controller
    		controller = GetComponent(CharacterController);
    		//Screen orientation to landscape left
    		Screen.orientation = ScreenOrientation.LandscapeLeft;
    		//Find left touchpad
    		leftTouchPad = GameObject.Find("LeftTouchPad");
    		//Find right touchpad
    		rightTouchPad = GameObject.Find("RightTouchPad");
    		//Start SetupJoysticks
    		StartCoroutine("SetupJoysticks");
    		//Set sleep time to never
    		Screen.sleepTimeout = SleepTimeout.NeverSleep;
    	}
    	
    	function Update ()
    	{
    		//If we are not dead
    		if (!dead)
    		{
    			//Update
    			MoveUpdate();
    			TexUpdate();
    		}
    	}
    	
    	function MoveUpdate()
    	{
    		//If we hit a object
    		var hit : RaycastHit;
    		if (Physics.Raycast(transform.position, Vector3.up, hit, 0.5f))
    		{
    			//If it is not the player
    			if (hit.transform.gameObject.tag != "goal")
    			{
    				//Set dir y to -1
    				dir.y = -1;
    			}
    		}
    		
    		//If we are grounded
    		if (controller.isGrounded)
    		{
    			//If the game is not running on a android device
    			if (Application.platform != RuntimePlatform.Android)
    			{
    				//Set dir x to Horizontal
    				dir.x = Input.GetAxis("Horizontal") * moveSpeed;
    				//If we get Space key down
    				if (Input.GetKeyDown(KeyCode.Space))
    				{
    					//Set dir y to jumpSpeed
    					dir.y = jumpSpeed;
    					//Play jump sound
    					audio.clip = audioJump;
    					audio.Play();
    				}
    			}
    			//If the game is running on a android device
    			else
    			{
    				//Get left touchpad position x
    				var pX = leftTouchPad.GetComponent(Joystick).position.x;
    				//Get left touchpad tap count
    				var tC = rightTouchPad.GetComponent(Joystick).tapCount;
    				
    				//Set dir x to touchpad x position
    				dir.x = pX * moveSpeed;
    				//If touchpad tap count are not 0
    				if (tC != 0)
    				{
    					//Set dir y to jumpSpeed
    					dir.y = jumpSpeed;
    					//animation.Play("somersault");
    					//Play jump sound
    					audio.clip = audioJump;
    					audio.Play();
    				}
    			}
    		}
    		//If we are not grounded
    		else
    		{
    			//Set dir y to gravity
    			dir.y -= gravity * Time.deltaTime;
    		}
    		
    		//Move the player
    		controller.Move(dir * Time.smoothDeltaTime);
    	}
    	
    	function TexUpdate()
    	{
    		//If we are not grounded
    		if (!controller.isGrounded)
    		{
    			//Set main texture to jump texture
    			mesh.renderer.material.mainTexture = texJump;
    			return;
    		}
    		//If the game is not running on a android device
    		if (Application.platform != RuntimePlatform.Android)
    		{
    			//Get Horizontal
    			var h = Input.GetAxis("Horizontal");
    			//If Horizontal is not 0
    			if (h != 0)
    			{
    				//If Horizontal is bigger than 0
    				if (h > 0)
    				{
    					//Set scale to 1,1,1
    					mesh.transform.localScale = Vector3(1,1,1);
    				}
    				//If Horizontal is less than 0
    				else
    				{
    					//Set scale to -1,1,1
    					mesh.transform.localScale = Vector3(-1,1,1);
    				}
    			}
    			//If Horizontal is 0
    			else
    			{
    				//Set main texture to move texture
    				mesh.renderer.material.mainTexture = texMove[0];
    				return;	
    			}
    		}
    		//If the game is running on a android device
    		else
    		{
    			//Get left touchpad x position
    			var pX = leftTouchPad.GetComponent(Joystick).position.x;
    			//If touchpad x position is not 0
    			if (pX != 0)
    			{
    				//If touchpad x position is bigger than 0
    				if (pX > 0)
    				{
    					//Set scale to 1,1,1
    					mesh.transform.localScale = Vector3(1,1,1);
    				}
    				//If touchpad x position is less than 0
    				else
    				{
    					//Set scale to -1,1,1
    					mesh.transform.localScale = Vector3(-1,1,1);
    				}
    			}
    			else
    			{
    				//Set main texture to move texture
    				mesh.renderer.material.mainTexture = texMove[0];
    				return;	
    			}
    		}
    		
    		//If tmpTexUpdateTime is bigger than texUpdateTime
    		if (tmpTexUpdateTime > texUpdateTime)
    		{
    			//Set tmpTexUpdateTime to 0
    			tmpTexUpdateTime = 0;
    			//Add one to selectedTex
    			selectedTex++;
    			//If selectedTex si bigger than texMove.Length - 1
    			if (selectedTex > texMove.Length - 1)
    			{
    				//Set selectedTex to 0
    				selectedTex = 0;
    			}
    			//Set main texture to move texture
    			mesh.renderer.material.mainTexture = texMove[selectedTex];
    		}
    		else
    		{
    			//Add 1 to tmpTexUpdateTime
    			tmpTexUpdateTime += 1 * Time.deltaTime;
    		}
    	}
    	
    	function OnTriggerEnter(other : Collider)
    	{
    		//If we are in a enemy trigger
    		if (other.tag == "Enemy")
    		{
    			//Play dead sound
    			audio.clip = audioDead;
    			audio.Play();
    			//Dont show renderer
    			mesh.renderer.enabled = false;
    			//Kill
    			dead = true;
    			
    			//testing respawn
    			//wait for 1 second
    			yield WaitForSeconds(1);
    
    			//take a life off lives
    			lives_counter.Counter -= 1;
    			
    			//turn back on mesh renderer with a few flashes first
    			mesh.renderer.enabled = true;
    			yield WaitForSeconds(0.1);
    			mesh.renderer.enabled = false;
    			yield WaitForSeconds(0.1);
    			mesh.renderer.enabled = true;
    			mesh.renderer.enabled = true;
    			yield WaitForSeconds(0.1);
    			mesh.renderer.enabled = false;
    			yield WaitForSeconds(0.1);
    			mesh.renderer.enabled = true;
    
    			//make dead false again
    			dead = false;
    			
    		}
    	}
    	
    //	function OnGUI()
    //	{
    //		GUI.skin = skin;
    
    		//Menu Button
    //		if(GUI.Button(new Rect(Screen.width - 120,0,120,40),"Menu"))
    //		{
    //			Application.LoadLevel("Menu");
    //		}
    		//If we are dead
    //		if (dead)
    //		{
    			//Play Again Button
    //			if(GUI.Button(new Rect(Screen.width / 2 - 90,Screen.height / 2 - 60,180,50),"Play Again"))
    //			{
    //				Application.LoadLevel("Game 3");
    //			}
    			//Menu Button
    //			if(GUI.Button(new Rect(Screen.width / 2 - 90,Screen.height / 2,180,50),"Menu"))
    //			{
    //				Application.LoadLevel("Menu");
    //			}
    //		}	
    //	}
    	
    	function SetupJoysticks()
    	{
    		//Set touchpad position
    		leftTouchPad.transform.position = Vector3(0,0,0);
    		rightTouchPad.transform.position = Vector3(1,0,0);
    		
    		//Wait 1 second
    		yield WaitForSeconds(1);
    		
    		//Start the touchpads
    		leftTouchPad.GetComponent(Joystick).StartGame();
    		rightTouchPad.GetComponent(Joystick).StartGame();
    	}

as you already know the object fires in the direction that the Z axis of your spawnRightObject is facing. so the simple dodgy fix you could do is to change the local transform position and rotation of the “shuriken_launcher”. you can do this with a condition in your movement script. i havent seen your movement script so i will assume that your using the horizontal axis to move left and right.

if(Input.GetAxis("Horizontal") > 0.1f ){
spawnRightObject.transform.localPosition = Vector3(0, 0, 0); // make the position where you want it
}

and like do the same for the other direction. hope this helps :smiley: