using System; using Unity.Netcode; using UnityEngine; using UnityEngine.UI; namespace DefaultNamespace { public class NetworkPlayer : NetworkBehaviour { [Header( "Player Settings" )] [SerializeField] private float speed = 10.0f; [SerializeField] private float initialHealth = 100.0f; [Header( "Elements")] [SerializeField] private Camera playerCamera; [SerializeField] private Canvas playerCanvas; [SerializeField] private Image playerHealthBar; [Header( "Prefabs" )] [SerializeField] private NetworkObject projectilePrefab; private NetworkVariable _health = new NetworkVariable(); public override void OnNetworkSpawn() { playerCamera.gameObject.SetActive(IsLocalPlayer); playerCanvas.gameObject.SetActive(IsLocalPlayer); if (IsLocalPlayer) { _health.OnValueChanged += OnValueChanged; } if (IsServer) { _health.Value = initialHealth; } } public override void OnNetworkDespawn() { if (IsLocalPlayer) { _health.OnValueChanged -= OnValueChanged; } } private void OnValueChanged(float previousValue, float newValue) { playerHealthBar.fillAmount = newValue / initialHealth; } private void Update() { if (!IsLocalPlayer) return; Vector3 input = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical")); transform.Translate(input * (speed * Time.deltaTime)); if (Input.GetButtonDown("Fire1")) { FireProjectileRpc(); } } [Rpc(SendTo.Server)] private void FireProjectileRpc() { NetworkObject projectile = Instantiate(projectilePrefab, transform.position, Quaternion.identity); projectile.Spawn(true); } } }