public static void UnregisterNstId(NetworkSyncTransform nst, NSTNetAdapter na) { // Don't try to remove this nst from lookups/arrays if it was never added. if (!allNsts.Contains(nst)) { return; } if (na != null && nstIdToNSTLookup != null && nstIdToNSTLookup.ContainsKey(na.NetId)) { nstIdToNSTLookup.Remove(na.NetId); } if (na != null && NstIds != null) { NstIds[na.NstIdSyncvar] = null; } if (allNsts != null && allNsts.Contains(nst)) { allNsts.Remove(nst); } if (allNstsWithOfftick != null && allNstsWithOfftick.Contains(nst)) { allNstsWithOfftick.Remove(nst); } }
// TODO move to helper public static void GetNstIdAndSetSyncvar(NetworkSyncTransform nst, NSTNetAdapter na, int assignValue = -1) { // Server needs to set the syncvar for the NstId if (na.IsServer && MasterNetAdapter.NetworkLibrary == NetworkLibrary.UNET) { if (HeaderSettings.Single.BitsForNstId < 6) { // If an ID value hasn't been passed, we need to get a free one na.NstIdSyncvar = (assignValue != -1) ? (uint)assignValue : (uint)GetFreeNstId(); } else { na.NstIdSyncvar = na.NetId; } } else { //TEST should use a method in na to convert the viewid to a smaller nstid if (NSTNetAdapter.NetLibrary == NetworkLibrary.PUN) { int clientId = (int)na.NetId / 1000; int entityId = (int)na.NetId % 1000; na.NstIdSyncvar = (uint)((clientId << HeaderSettings.single.bitsForPUNClients) | entityId); } } RegisterNstId(na.NstIdSyncvar, nst); }
/// <summary> /// Add a network adapter and the NetworkIdenity/NetworkView as needed /// </summary> public static NSTNetAdapter EnsureNstAdapterExists(GameObject go) { go.transform.root.gameObject.EnsureRootComponentExists <NetworkIdentity>(); NSTNetAdapter na = go.transform.root.gameObject.EnsureRootComponentExists <NSTNetAdapter>(false); return(na); }
// TODO this is redudant with NSTNetAdapter code for UNET public static void CopyPlayerPrefabFromPUNtoOthers() { PUNSampleLauncher punl = PUNSampleLauncher.Single; if (!punl || punl.playerPrefab == null) { return; } NSTNetAdapter.AddAsRegisteredPrefab(punl.playerPrefab, true); //// Copy player prefab from PUN launcher to NM //if (MasterNetAdapter.NetLib == NetworkLibrary.UNET) // NSTNetAdapter.AddAsRegisteredPrefab(punl.playerPrefab, true); //// Copy PUN playerPrefab to UNET //NetworkManager nm = GetNetworkManager(MasterNetAdapter.NetLib == NetworkLibrary.UNET); //if (nm && !nm.playerPrefab) //{ // Debug.Log("Copying Player Prefab : <b>'" + punl.playerPrefab.name + "'</b> from " + punl.GetType().Name + " to NetworkManager for you."); // NetworkIdentity ni = punl.playerPrefab.GetComponent<NetworkIdentity>(); // if (!ni) // ni = punl.playerPrefab.AddComponent<NetworkIdentity>(); // // This seemingly pointless code forces the NI to initialize the assetid. For some dumb reason UNET. // ni.assetId.IsValid(); // if (nm.playerPrefab != punl.playerPrefab) // { // nm.playerPrefab = punl.playerPrefab; // EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); // } //} }
/// <summary> /// Replacement for standard Awake that instead of firing when the component first wakes up, fires after the root NetworkSyncTransform /// completes its Awake(). This ensures the NST has been initialized first. /// </summary> public virtual void OnNstPostAwake() { // If there is no network, then this NST shouldn't exist - is likely just an orphaned prefab instance in the scene and will be deleted at startup. if (MasterNetAdapter.ServerIsActive == false && MasterNetAdapter.ClientIsActive == false) { isShuttingDown = true; return; } nst = transform.root.GetComponent <NetworkSyncTransform>(); na = nst.na; }
/// <summary> /// Remove the adapter and the NetworkIdentity/View from an object /// </summary> /// <param name="nst"></param> public static void RemoveAdapter(NetworkSyncTransform nst) { NetworkIdentity ni = nst.GetComponent <NetworkIdentity>(); NSTNetAdapter na = nst.GetComponent <NSTNetAdapter>(); if (na) { DestroyImmediate(na); } if (ni) { DestroyImmediate(ni); } }
public virtual void Initialize(NetworkSyncTransform _nst) { nst = _nst; na = _nst.na; frameCount = nst.frameCount; frames = new ElementFrame[frameCount + 1]; for (int i = 0; i < frames.Length; i++) { frames[i] = new ElementFrame(Localized, Compress(), false, this); } history = new GenericX[frameCount + 1]; for (int i = 0; i < history.Length; i++) { history[i] = new GenericX(); } }
private void AddAllDependencies(bool silence = false) { headerName = HeaderNSTName; headerColor = HeaderNSTColor; base.OnEnable(); nst = (NetworkSyncTransform)target; // Add this NST to the prefab spawn list (and as player prefab if none exists yet) as an idiot prevention if (!Application.isPlaying) { MasterNetAdapter.AddAsRegisteredPrefab(nst.gameObject, silence); } // If user tried to put NST where it shouldn't be... remove it and all of the required components it added. if (nst.transform.parent != null) { Debug.LogError("NetworkSyncTransform must be on the root of an prefab object."); nst.nstElementsEngine = nst.transform.GetComponent <NSTElementsEngine>(); NSTNetAdapter.RemoveAdapter(nst); DestroyImmediate(nst); if (nst.nstElementsEngine != null) { DestroyImmediate(nst.nstElementsEngine); } return; } nst.na = NSTNetAdapter.EnsureNstAdapterExists(nst.gameObject); nst.nstSettings = NSTSettings.EnsureExistsInScene(NSTSettings.DEFAULT_GO_NAME); nst.nstElementsEngine = NSTElementsEngine.EnsureExistsOnRoot(nst.transform, false); NSTMaster.EnsureExistsInScene("NST Master"); }
/// <summary> /// Ensure all required dependencies are added for this NST to work. Can be called often in edit mode, and should be. Returns false /// if a DestroyImmediate was invoked. /// </summary> /// <param name="nst"></param> /// <param name="silence"></param> public static void EnsureAllNSTDependencies(this NetworkSyncTransform nst, SerializedObject serializedObject, bool silence = false) { EnsureSceneNetLibDependencies(); if (Application.isPlaying) { return; } // If user tried to put NST where it shouldn't be... remove it and all of the required components it added. if (nst.transform.parent != null) { DebugX.LogError("NetworkSyncTransform must be on the root of an prefab object."); nst.nstElementsEngine = nst.transform.GetComponent <NSTElementsEngine>(); NSTNetAdapter.RemoveAdapter(nst); Object.DestroyImmediate(nst); if (nst.nstElementsEngine != null) { Object.DestroyImmediate(nst.nstElementsEngine); EditorUtility.SetDirty(nst.gameObject); } return; } nst.nstElementsEngine = NSTElementsEngine.EnsureExistsOnRoot(nst.transform, false); nst.na = EditorUtils.EnsureRootComponentExists <NSTNetAdapter>(nst.gameObject, false); AddRewindEngine(nst); //// Add this NST to the prefab spawn list (and as player prefab if none exists yet) as an idiot prevention NSTNetAdapter.AddAsRegisteredPrefab(nst.gameObject, true); //NSTNetAdapter.AddAsRegisteredPrefab(nst.gameObject, silence); return; }