Unet - добавление функции [Command] в Action C#

Я работаю в Unity с Unet, и у меня есть один вопрос:

-Могу ли я добавить командные функции непосредственно к действию?

По-видимому, я не могу, поэтому мой код выдает ошибку "RPC-функция RpcNextMaterial вызвана на клиенте"

Я исправил мой код так, что он работает, делая то, что кажется "уродливым": вместо того, чтобы добавить в свой Action.OnInteraction функцию Cmd, я создал функцию, которая вызывает функцию CMD.

Итак, исправлена ​​следующая строка кода:

this.OnInteraction + = NmCmdNextMaterial;

Но должно быть просто:

this.OnInteraction + = CmdNextMaterial;

Это код, который в данный момент работает, просто запускает функцию "nextMaterial", когда пользователь (сервер или клиент) нажимает на нее.

public class InteractiveObject : NetworkBehaviour, IPointerClickHandler {

    private Action OnInteraction;

    //when the user clicks on GameObject collider
    public void OnPointerClick(PointerEventData eventData)
    {
        if (eventData.button == PointerEventData.InputButton.Left)
        {
            nextMaterial();
        }
    }

    //callback fired on the client when the network authority changes
    public override void OnStartAuthority()
    {
        if (!isServer)
        {
            if(OnInteraction != null)
            {
                OnInteraction();
                OnInteraction = null;               
            }
        }
    }

    //Set Next Material
    #region nextMaterial
    private void nextMaterial()
    {
        if (isServer)
        {
            RpcNextMaterial();
        }
        else
        {
            if (!hasAuthority)
            {
                //this.OnInteraction += CmdNextMaterial;   // THIS IS WHAT I WANT
                this.OnInteraction += NmCmdNextMaterial;
                setLocalAuthority();
            }
            else
            {
                CmdNextMaterial();
            }
        }
    }   

    public void NmCmdNextMaterial()
    {
        CmdNextMaterial();
    }

    [Command]
    public void CmdNextMaterial()
    {
        RpcNextMaterial();
    }
    [ClientRpc]
    private void RpcNextMaterial()
    {
        //change Material code
    }
    #endregion
}

Является ли этот "уродливый" способ единственным решением этой проблемы? Или есть какой-то потрясающий синтаксис, который мне в настоящее время не хватает для достижения этого?

Спасибо

0 ответов

Другие вопросы по тегам