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 WeaponView weaponView; private PlayerShield playerShield; private bool isActive = false; public void Init() { isActive = true; playerHealth = GetComponent(); playerShield = GetComponent(); weaponView = GetComponentInChildren(true); } void Update() { if (!isActive) return; if (playerHealth == null || playerHealth.isDead.Value) return; if (playerShield != null && playerShield.IsShieldUp) return; if (Input.GetMouseButtonDown(0)) { weaponView?.PlayShoot(); ShootServerRpc(cameraRoot.position, cameraRoot.forward); } } [ServerRpc] private void ShootServerRpc(Vector3 _origin, Vector3 _direction) { // Записываем выстрел для клона — ровно то, что пришло в RPC GetComponent()?.RecordShot(_origin, _direction); Collider[] ownerColliders = GetComponentsInChildren(); if (Physics.Raycast(_origin, _direction, out RaycastHit _hit, range)) { if (System.Array.Exists(ownerColliders, c => c == _hit.collider)) { return; } PlayerHealth _playerHealth = _hit.collider.GetComponentInParent(); if (_playerHealth != null) { _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); } }