Andrew Akram

Andrew Akram

  • 1.6k
  • 10
  • 207

Help I'm A NOOB in C# UNITY GAME

Feb 13 2024 2:18 AM

I have this code here that it displays a game object when I press E on keyboard the only issue is it works with the host only nothing happens when the client interacts with it when he presses on E. what is the solution or what I'm doing wrong and thx for taking time.

using System.Collections.Generic;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;
public class InteractiveComputer: NetworkBehaviour {
  public GameObject computerScreen;
  public float interactionRange = 3 f; // Adjust the interaction range as needed 
  public float displayDuration = 20 f; // Duration to display the computer screen 
  private bool isComputerScreenVisible = false;
  private bool isInteracting = false; // Flag to prevent multiple interactions 
  private void Start() {
    if (IsServer) {
      isComputerScreenVisible = false;
      computerScreen.SetActive(false);
    }
  }
  bool IsPlayerInRange() {
    foreach(var player in NetworkManager.Singleton.ConnectedClientsList) {
      if (player != null && Vector3.Distance(transform.position, player.PlayerObject.transform.position) <= interactionRange) {
        return true;
      }
    }
    return false;
  }
  void Update() {
    if (!IsServer) return; // Check if the player is nearby 
    if (IsPlayerInRange()) { // Check if the 'e' key is pressed 
      if (Input.GetKeyDown(KeyCode.E) && !isInteracting) {
        InteractWithComputerServerRpc();
      } // Check if the 'A' button on the gamepad is pressed 
      if (Gamepad.current != null && Gamepad.current.buttonSouth.isPressed && !isInteracting) {
        InteractWithComputerServerRpc();
      }
    }
  } [ServerRpc] private void InteractWithComputerServerRpc() {
    isComputerScreenVisible = true;
    RpcUpdateComputerScreenVisibilityClientRpc(isComputerScreenVisible); // Set a timer to hide the computer screen after the specified duration 
    Invoke(nameof(HideComputerScreenClientRpc), displayDuration); // Set interacting flag to prevent multiple interactions 
    isInteracting = true;
  } [ClientRpc] private void RpcUpdateComputerScreenVisibilityClientRpc(bool isVisible) {
    isComputerScreenVisible = isVisible;
    computerScreen.SetActive(isVisible); // If the computer screen is shown on the client, set the interacting flag to true 
    if (isVisible) {
      isInteracting = true;
    }
  } [ClientRpc] private void HideComputerScreenClientRpc() {
    isComputerScreenVisible = false;
    computerScreen.SetActive(false); // Reset interacting flag after hiding the computer screen 
    isInteracting = false;
  }
}

 


Answers (1)