- Home /
Unity Netwroking Layer Masks?
Hello I want to have the local player not be able to shoot himself in the foot, and still be able to shoot other clients. I have it so the local player gets assigned to "LocalPlayer" layer, and any other clients get assigned to the "RemoteClients" layer. I seem to only be able to make the lan host not shoot itself, but any other client can shoot itself and not shoot the lan host. I am certain that I am missing something to do with networking but I do not know what to do. I have had this problem for two weeks now and I just want this to work so badly. I will add my code down below and thanks for the help!
// This is my player script that assigns the layers
using System.Collections;
using System.Collections.Generic;
using UnityEngine.Networking;
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;
private PlayerMotor motor;
void Start () {
if (!isLocalPlayer) {
AssignRemoteLayer ();
ComponentsToDisable ();
}
RegisterPlayer ();
}
void Update () {
if (!isLocalPlayer) {
return;
}
MovePlayer ();
}
void ComponentsToDisable() {
for (int i = 0; i < disableComponents.Length; i++) {
disableComponents [i].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);
}
public IEnumerator slowMovement (float time) {
speed = 0f;
yield return new WaitForSeconds (time);
speed = 5f;
}
}
// This is my bullet collision script
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 () {
ColliderDetection ();
}
// Update is called once per frame
void Update () {
}
[Server]
void OnCollisionEnter (Collision col) {
if (col.gameObject.layer == LayerMask.NameToLayer ("LocalPlayer")) {
return;
} else {
var hit = col.gameObject;
var health = hit.GetComponent<Health> ();
health.TakeDamage (damage);
}
Destroy (gameObject);
}
void ColliderDetection () {
Physics.IgnoreLayerCollision (LayerMask.NameToLayer ("LocalPlayer"), LayerMask.NameToLayer ("Spell"));
}
}
// This is my health script
using System.Collections;
using System.Collections.Generic;
using UnityEngine.Networking;
using UnityEngine;
public class Health : NetworkBehaviour {
public const int maxHealth = 100;
[SyncVar]
public int currentHealth = 0;
public NetworkStartPosition[] spawnPoints;
// Use this for initialization
void Start () {
currentHealth = maxHealth;
spawnPoints = FindObjectsOfType<NetworkStartPosition> ();
}
void OnConnectedToServer () {
RpcRespawn ();
}
// Update is called once per frame
void Update () {
}
public void TakeDamage (int amount) {
currentHealth -= amount;
if (currentHealth <= 0) {
RpcRespawn ();
currentHealth = maxHealth;
}
}
[ClientRpc]
public void RpcRespawn () {
if (isLocalPlayer) {
Vector3 spawnPoint = Vector3.zero;
if (spawnPoints != null) {
spawnPoint = spawnPoints [Random.Range (0, spawnPoints.Length)].transform.position;
}
transform.position = spawnPoint;
}
}
IEnumerator spawnDelay () {
yield return new WaitForSeconds (0f);
Debug.Log ("spawning");
}
}
Your answer
Follow this Question
Related Questions
Unet collision and layer mask issues 0 Answers
Layer Collision in Networks (Mulitplayer Game). 0 Answers
Help with getting script of another player 0 Answers
Check if layers can collide 1 Answer