Why are all my player prefabs shooting lasers, instead of just one?

Hello All,

quick question about prefabs. I have a script that handles the players in my game, which shoot lasers… rainbow lasers for now, but thats besides the point. I have the script dropped onto the prefab, which I have a funny feeling is responsible for the issue im experiencing. The process is supposed to be only the selected player shoots lasers, but all of them are shooting with my current setup. Can anyone lend some insight into how to correctly approach this?

Notably, each player has a unique name (ex: RedPlayer, BluePlayer).

void Start(){
		LineRenderer[] lineRenderers = gameObject.GetComponentsInChildren<LineRenderer>();
		line = lineRenderers [0];
		gunTip = GameObject.Find(playerObject.name + "RainbowGun/GunTip");

	}

	void Update(){

		if(TileMap.selectedGameObject != null && 
		   Input.GetButtonDown("Fire1") ){
			
			StopCoroutine("FireLazer");
			StartCoroutine("FireLazer");
		}
	}

	IEnumerator FireLazer(){
		float lazerRange = 13;
		line.enabled = true;
		gunTip.SetActive (true);
		
		while(Input.GetButton("Fire1")){
			line.GetComponent<Renderer>().material.mainTextureOffset = new Vector2(0, Time.time);
			Ray ray = new Ray(gunTip.transform.position, gunTip.transform.forward);
			RaycastHit hit;
			line.SetPosition(0 , ray.origin);
			
			if(Physics.Raycast(ray, out hit, lazerRange))
				line.SetPosition(1, hit.point);
			else
				line.SetPosition(1, ray.GetPoint(lazerRange));
			
			yield return null;
			
		}
		line.enabled = false;
		this.gunTip.SetActive (false);

	}

Any and all help appreciated. Thanks in advance!

You can use tags to solve this problem, right now the script is equal to all the prefabs. You can tag one of your prefabs with the “player” tag, or create your own tag.

Then, in your update function add a line for: if (gameObject.CompareTag(“Player”)) before all the other stuff.

If only one of your prefabs is tagged with the player tag this should work just fine barring any other issues.

You need to add logic into your update method to check if the script is on the current selected user …

i.e

void Update(){
         if(!isCurrentSelectedPlayer)
           return;

         if(TileMap.selectedGameObject != null && 
            Input.GetButtonDown("Fire1") ){
             
             StopCoroutine("FireLazer");
             StartCoroutine("FireLazer");
         }
     }

So what this is doing is if the variable ‘isCurrentSelectedPlayer’ is false, it will return and not do anything, but if the value is true, it will continue to the code that fires the laser. You will obviously need to set the value for isCurrentSelectedPlayer when they are selected.