【问题标题】:Why can't you use Scriptable Objects in Mirror?为什么不能在 Mirror 中使用 Scriptable Objects?
【发布时间】:2022-06-20 04:24:59
【问题描述】:

在我的网络行为脚本中,我正在尝试使用可编写脚本的对象(块)来获取要实例化的预制件。我有这个功能。

[Command(requiresAuthority = false)]
private void InstiniateBlock(Vector2 blockPos,Block bl)
{

    GameObject Stone =GameObject.Instantiate(bl.prefab, blockPos, Quaternion.Euler(0, 0, 0), null);
    NetworkServer.Spawn(Stone);
}

每当我运行它时,我都会收到此错误

Disconnecting connId=0 to prevent exploits from an Exception in MessageHandler: ArgumentException The Object you want to instantiate is null.

我已确保 Scriptable Object 有一个预制件,并且该预制件位于具有网络标识的 spawn 预制件中。你能帮忙吗?

【问题讨论】:

  • 你真的为它设置了值吗?您的 NetworkBehavior 脚本是否实际上指向 ScriptableObject? ScriptableObject 是否真的为.prefab 字段设置了一些东西?我认为The Object you want to instantiate is null. 应该是一个很大的提示。
  • 是的,Scriptable 对象有一个预制件并且它指向 scriptableObject
  • 然后,我会使用调试语句将操作分成几部分,看看究竟是什么触发了错误。您正在尝试实例化一些为 null 的东西,但您在那里同时引用了两个东西,bl.prefab

标签: c# unity3d mirror


【解决方案1】:

您是否在“bl”可编写脚本的对象上使用[SyncVar]?我在使用 SyncVar 时遇到了同样的问题,如果您使用的是 SyncVar,您可以通过它们的 ID(如 guid)识别项目并将它们加载为 SyncVar 的替代方案 (我假设您使用的是 SyncVar)

这是我的方法: (您可以使用传递 ID 的 [Command][ClientRPC] 属性执行某些操作,这样您就可以直接加载可编写脚本的对象,因为 GameObject 不可序列化)

public ItemClass currentItem;
[...]
public ItemClass GetItemByID(string id)
    {
       // i put my ScripableObject on the resources folder
        ItemClass[] items = Resources.LoadAll<ItemClass>("Items/Data");
        foreach(ItemClass i in items)
        {
            if(i.id == id)
            {
                return i;
            }
        }
        return null;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 2021-07-13
    • 2021-05-12
    • 1970-01-01
    • 2016-12-12
    • 2020-01-02
    • 1970-01-01
    相关资源
    最近更新 更多