Unet igonore collisions between layers?

So this is about the 5th time I asked this question, just hoping that someone can help me out through this frustrating process. I want to ignore the collisions between my “spell” layer game objects, and my “LocalPlayer” capsule collider, so the player’s own spells do not damage the player. I believe I setup the layers correctly in my PlayerController script, but I have tried so many things to try to ignore these layer collisions. I went to the physics chart and unchecked the collision box between the two layers as well as adding phyics.ignorelayermaskcollision which only worked on the lan host side, while the client could still shoot itself and not shoot the lan host. My hit detection script is assigned to a game object that is spawned on the server. Any help is appreciated thanks!

//Player Controller
using System.Collections;
using System.Collections.Generic;
using UnityEngine.Networking;
using UnityEngine.UI;
using UnityEngine;
[RequireComponent(typeof(PlayerMotor))]
public class PlayerController : NetworkBehaviour {

	public AudioListener listener;
	[SerializeField]
	[SyncVar]
	public float speed = 5f;
	[SerializeField]
	private float lookSensitivity = 3f;
	[SerializeField]
	Behaviour[] disableComponents;
	[SerializeField]

	private PlayerMotor motor;
	private Health health;
	public Camera cam;
	public Image healthBar;

	void Start () {
		if (!isLocalPlayer) {
			AssignRemoteLayer ();
			ComponentsToDisable ();
		}
		RegisterPlayer ();
	}
		
	void Update () {
		if (!isLocalPlayer) {
			return;
		}
		MovePlayer ();
		playerUI ();
	}

	void ComponentsToDisable() {
		for (int i = 0; i < disableComponents.Length; i++) {
			disableComponents *.enabled = false;*
  •  }*
    
  • }*

  • void AssignRemoteLayer () {*

  •  gameObject.layer = LayerMask.NameToLayer ("RemotePlayer");*
    
  •  foreach (Transform t in transform) {*
    
  •  	t.gameObject.layer = LayerMask.NameToLayer ("RemotePlayer");*
    
  •  }*
    
  • }*

  • void RegisterPlayer () {*

  •  motor = GetComponent<PlayerMotor> ();*
    
  •  string ID = "Player " + GetComponent<NetworkIdentity> ().netId;*
    
  •  transform.name = ID;*
    
  • }*

  • void MovePlayer () {*

  •  //all of this is for moving the character*
    
  •  float xMove = Input.GetAxis ("Horizontal");*
    
  •  float zMove = Input.GetAxis ("Vertical");*
    
  •  float yMove = Input.GetAxis ("Jump");*
    

_ Vector3 moveHorizontal = transform.right * xMove;_
_ Vector3 moveVertical = transform.forward * zMove;_
_ Vector3 jump = transform.up * yMove;_
_ Vector3 velocity = (moveHorizontal + moveVertical + jump).normalized * speed;_

  •  //used to move the character*
    
  •  motor.Move (velocity);*
    
  •  //this is for only turning the character*
    
  •  float yRot = Input.GetAxisRaw ("Mouse X");*
    

_ Vector3 rotation = new Vector3 (0f, yRot, 0f) * lookSensitivity;_

  •  motor.Rotate (rotation);*
    
  •  float xRot = Input.GetAxisRaw ("Mouse Y");*
    

_ float cameraRotation = xRot * lookSensitivity;_

  •  motor.RotateCamera (cameraRotation);*
    
  • }*

  • void playerUI() {*

  •  health = GetComponent<Health> ();*
    
  •  healthBar.fillAmount = (health.currentHealth/100f);*
    
  • }*

  • public void temporarySlow () {*

  •  StartCoroutine (slowMovement ());*
    
  • }*

  • IEnumerator slowMovement () {*

  •  speed = 0f;*
    
  •  yield return new WaitForSeconds (3f);*
    
  •  speed = 5f;*
    
  • }*
    }
    //hit detection
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine.Networking;
    using UnityEngine;
    public class hitDetection : NetworkBehaviour {

  • public int damage;*

  • // Use this for initialization*

  • void Start () {*

  • }*

  • // Update is called once per frame*

  • void Update () {*

  • }*

  • void OnTriggerEnter (Collider col) {*

  •   var hit = col.gameObject;*
    
  •   var health = hit.GetComponent<Health> ();*
    
  •   if (health != null) {*
    
  •   	health.TakeDamage (damage);*
    
  •   	}*
    
  •   }*
    
  • }*

Hey there,

I’ll tell you how I managed to, kind of, understand UNET.
Everytime a local player (client) wants to do something, it should notice the server about it.
You do this by using so called Commands.
A command is the way a client says:

“Hey Server! I’d like you to inform you that I want to change a layer!”

In your case I suggest to make “AssignToLayer” a command.
You’ll do this as followed:

[Command] private void CmdAssignToLayer(string layerName) {
    gameObject.layer = LayerMask.NameToLayer(layerName);
}

Note that I put a “Cmd” as a prefix in front of your method’s name.
Additionally, I’d suggest you pass the layer name or the int value of that layer in the Command.
At this point the server knows that you want to change a layer.

I hope this solves your problem.

Dominik