Help! My projectile just falls to the ground :(

Ever since I started to add networking to my script I am having a problem with firing my arrow.

I have an arrow prefab and two scripts, the arrow script which goes on the arrow, and the shootArrow script which goes on the player. Now all was well and good until I added multiplayer. Now, while playing online my characters can not see eachother’s arrows flying. They see it instantiate, but then it just falls to the ground in front of them on their screen.

So I read in some other threads that instead of adding force when the arrow is instantiated (in the shoot arrow script), to add force in the awake or start function on the arrow itself. OK - no problem so I have done that. but now the arrow doesnt even shoot on my screen.

Whats odd is when I change it from addforce in the start function to transform.translate in the update function,it works, AND the other player can see it! But I really want to use add force for obvious reasons.

How can I get add force to work? Here is my script called Arrow, that is on the arrow. You will see my addforce at the beginning, but no force seems to be added.

using UnityEngine;
using System.Collections;

//script description:
//this script is attached to the arrow prefab and governs the behavior of the arrow.

//Accesses the spawn script

//Accessed by the ShootArrow script

public class Arrow : MonoBehaviour {

	
	private Transform myTransform;	   //caches transform of arrow
	private int expireTime = 60;
	private float range = 0.5f;
	private RaycastHit hit;
	
	//Used for hit detection
	public string team;
	public string myOriginator;
	public float arrowPower = 100;
	public float speed = 100;

	void Start () 
	{
		rigidbody.AddForce(Vector3.forward * speed);
		//As soon as arrow is created start the countdown to destory in after "expireTime" seconds
		StartCoroutine(DestroyMyself());
		myTransform = transform;
	}
		


	
	
	void FixedUpdate ()
	{
		//if I use this it works: myTransform.Translate(Vector3.forward * 10 * Time.deltaTime);
		
		if(Physics.Raycast(myTransform.position, myTransform.forward, out hit, range))
		{
		rigidbody.isKinematic = true;
		
			if(hit.transform.tag == "BlueTeam" || hit.transform.tag == "RedTeam")
			{
				//Access the HealthAndDamage script of the enemy player and inform them that they have been attacked and by whom
				
				if(hit.transform.tag == "BlueTeam" && team  == "red")
				{
					HealthAndDamage HDscript = hit.transform.GetComponent<HealthAndDamage>();
					HDscript.iWasJustAttacked = true;
					HDscript.myAttacker = myOriginator;
					HDscript.hitByArrow = true;
				}
				
				if(hit.transform.tag == "RedTeam" && team == "blue")
				{
					HealthAndDamage HDscript = hit.transform.GetComponent<HealthAndDamage>();
					HDscript.iWasJustAttacked = true;
					HDscript.myAttacker = myOriginator;
					HDscript.hitByArrow = true;
				}
			}
		}
			
	}

	IEnumerator DestroyMyself()
	{
		//Wait for the timer to count to expireTime then destroy the arrow
		yield return new WaitForSeconds(expireTime);
		Destroy(myTransform.gameObject);
	}	
}

And here is the sniped from shootArrow where I instantiate if you need that as well:

public void Shoot(float power)
{
		launchPosition = cameraHeadTransform.TransformPoint(0,0,0); 		//where to launch arrow from
		
		//instantiate arrow and add force to it based on the amount of power
		//make the arrow team specific.
		
		if(iAmOnTheRedTeam == true)
		{
		networkView.RPC("SpawnProjectile", RPCMode.All, launchPosition, Quaternion.Euler(aim.eulerAngles.x - 5, myTransform.eulerAngles.y, 0), myTransform.name, "red");
		}
		
		if(iAmOnTheBlueTeam == true)
		{
		networkView.RPC("SpawnProjectile", RPCMode.All, launchPosition, Quaternion.Euler(aim.eulerAngles.x - 5, myTransform.eulerAngles.y, 0), myTransform.name, "blue");
		}

		
}
	
	[RPC]
	void SpawnProjectile (Vector3 position, Quaternion rotation, string originatorName, string team)
	{
		
		
		GameObject myArrow = Instantiate(arrow, position, rotation) as GameObject;
		//myArrow.rigidbody.AddRelativeForce(Vector3.forward * power);
		
		//Access the Arrow script on instantiated arrow and supply players name and team.
		
		
		Arrow bScript = myArrow.GetComponent<Arrow>();
		bScript.arrowPower = power;
		bScript.myOriginator = originatorName;
		bScript.team = team;
	}
}

The problem is you want to add an instantaneous force, where AddForce is applied over time in physics. For an instantaneous force in your case of hitting the jump button once, you need to use ForceMode.Impulse :

 rigidbody.AddForce( transform.forward * speed, ForceMode.Impulse );

also note the difference between Vector3.forward and transform.forward . I assume you want the bullet to travel in the direction that it is facing ( transform.forward ) and not just forward in world-space along the +ve Z_axis ( Vector3.forward )

Links :