标签:return locate 自定义 delegate iat other ati ack The
以下代码放置到PhotonNetwork.cs即可
    #region >>> Photon自定义异步加载GameObject
    public delegate void CustomLoader(string prefabName, Action<UnityEngine.Object> ac);
    public static bool InstantiateCustom(string prefabName, Vector3 position, Quaternion rotation, byte group, object[] data, CustomLoader loader, Action<GameObject> callback)
    {
        if (!connected || (InstantiateInRoomOnly && !inRoom))
        {
            Debug.LogError("Failed to Instantiate prefab: " + prefabName + ". Client should be in a room. Current connectionStateDetailed: " + PhotonNetwork.connectionStateDetailed);
            return false;
        }
        GameObject prefabGo;
        if (!UsePrefabCache || !PrefabCache.TryGetValue(prefabName, out prefabGo))
        {
            loader(prefabName, (ab) =>
            {
                prefabGo = (GameObject)(ab);
                if (UsePrefabCache)
                {
                    PrefabCache.Add(prefabName, prefabGo);
                }
                if (prefabGo == null)
                {
                    Debug.LogError("Failed to Instantiate prefab: " + prefabName + ". Verify the Prefab is in a Resources folder (and not in a subfolder)");
                    callback.Invoke(null);
                }
                // a scene object instantiated with network visibility has to contain a PhotonView
                if (prefabGo.GetComponent<PhotonView>() == null)
                {
                    Debug.LogError("Failed to Instantiate prefab:" + prefabName + ". Prefab must have a PhotonView component.");
                    callback.Invoke(null);
                }
                Component[] views = (Component[])prefabGo.GetPhotonViewsInChildren();
                int[] viewIDs = new int[views.Length];
                for (int i = 0; i < viewIDs.Length; i++)
                {
                    //Debug.Log("Instantiate prefabName: " + prefabName + " player.ID: " + player.ID);
                    viewIDs[i] = AllocateViewID(player.ID);
                }
                // Send to others, create info
                Hashtable instantiateEvent = networkingPeer.SendInstantiate(prefabName, position, rotation, group, viewIDs, data, false);
                // Instantiate the GO locally (but the same way as if it was done via event). This will also cache the instantiationId
                callback.Invoke(networkingPeer.DoInstantiate(instantiateEvent, networkingPeer.LocalPlayer, prefabGo));
            });
            return true;
        }
        if (prefabGo != null)
        {
            // a scene object instantiated with network visibility has to contain a PhotonView
            if (prefabGo.GetComponent<PhotonView>() == null)
            {
                Debug.LogError("Failed to Instantiate prefab:" + prefabName + ". Prefab must have a PhotonView component.");
                callback.Invoke(null);
            }
            Component[] views = (Component[])prefabGo.GetPhotonViewsInChildren();
            int[] viewIDs = new int[views.Length];
            for (int i = 0; i < viewIDs.Length; i++)
            {
                //Debug.Log("Instantiate prefabName: " + prefabName + " player.ID: " + player.ID);
                viewIDs[i] = AllocateViewID(player.ID);
            }
            // Send to others, create info
            Hashtable instantiateEvent = networkingPeer.SendInstantiate(prefabName, position, rotation, group, viewIDs, data, false);
            callback.Invoke(networkingPeer.DoInstantiate(instantiateEvent, networkingPeer.LocalPlayer, prefabGo));
            return true;
        }
        return false;
    }
    #endregion
标签:return locate 自定义 delegate iat other ati ack The
原文地址:https://www.cnblogs.com/kenkao/p/10276556.html