using Unity.Netcode; using UnityEngine; public class PlayerShoot : NetworkBehaviour { [SerializeField] float damageAmount = 10f; [SerializeField] float range = 100f; [SerializeField] Transform cameraRoot; [SerializeField] GameObject hitEffectPrefab; private PlayerHealth playerHealth; private bool isActive = false; public void Init() { isActive = true; } // public override void OnNetworkSpawn() // { // if (IsOwner) // { // playerHealth = GetComponent(); // if (playerHealth == null) // { // Debug.LogError("PlayerHealth component not found on player"); // } // } // } void Update() { if(!isActive) return; playerHealth = GetComponent(); if(playerHealth == null || playerHealth.isDead.Value) return; if (Input.GetMouseButtonDown(0)) { ShootServerRpc(cameraRoot.position, cameraRoot.forward); } } [ServerRpc] private void ShootServerRpc(Vector3 _origin, Vector3 _direction) { Collider[] ownerColliders = GetComponentsInChildren(); if (Physics.Raycast(_origin, _direction, out RaycastHit _hit, range)) { if (System.Array.Exists(ownerColliders, c => c == _hit.collider)) { return; } if (_hit.collider.TryGetComponent(out PlayerHealth _playerHealth)) { _playerHealth.TakeDamage((int)damageAmount); } SpawnHitEffectClientRpc(_hit.point); } } [ClientRpc] private void SpawnHitEffectClientRpc(Vector3 _hitPosition) { // Debug.Log($"Spawning hit effect at {_hitPosition}"); Instantiate(hitEffectPrefab, _hitPosition, Quaternion.identity); } }