当客户端或主机按下某个对象上的按键时,如何显示游戏对象?


我这里有这段代码,当我按键盘上的 E 时,它会显示一个游戏对象,唯一的问题是它与主机一起工作,并且 当客户按下 E 与之交互时,什么也没有发生。解决方案是什么或者我做错了什么,谢谢您花时间。

我尝试过的:

using System.Collections.Generic;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;

public class InteractiveComputer : NetworkBehaviour
{
    public GameObject computerScreen;
    public float interactionRange = 3f; // Adjust the interaction range as needed
    private float displayDuration = 5f; // 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;
    }
}

//works well but for the server can only interact but client no

コメント

タイトルとURLをコピーしました