public void InitiView(ExampleNetworkedEntity entity) { try { state = entity; IsMine = ExampleManager.Instance.CurrentUser != null && string.Equals(ExampleManager.Instance.CurrentUser.id, state.ownerId); state.attributes.OnChange += Attributes_OnChange; state.OnChange += Entity_State_OnChange; OwnerId = state.ownerId; Id = state.id; RefId = state.__refId; //Syncs Transform on Initi SetStateStartPos(); //set my transform if (myTransform == null) { myTransform = transform; } //Save lastLoc prevLocalPosition = myTransform.localPosition; HasInit = true; } catch (System.Exception e) { LSLog.LogError($"Error: {e.Message + e.StackTrace}"); } }
public void CreateScoreEntry(ExampleNetworkedEntity entity) { GameObject newEntry = Instantiate(scoreEntryPrefab, scoreRoot, false); ScoreboardEntry entry = newEntry.GetComponent <ScoreboardEntry>(); entry.Init(entity); spawnedEntries.Add(entry); }
private void CreateView(ExampleNetworkedEntity entity) { LSLog.LogImportant("print: " + JsonUtility.ToJson(entity)); ColyseusNetworkedEntityView newView = Instantiate(prefab); ExampleManager.Instance.RegisterNetworkedEntityView(entity, newView); newView.gameObject.SetActive(true); }
public void EntityAdded(ExampleNetworkedEntity entity) { foreach (Scoreboard board in scoreboards) { board.CreateScoreEntry(entity); } scoreOnlyBoard?.CreateScoreEntry(entity); }
public void EntityRemoved(ExampleNetworkedEntity entity, ColyseusNetworkedEntityView view) { foreach (Scoreboard board in scoreboards) { board.RemoveView(entity); } scoreOnlyBoard?.RemoveView(entity); }
//Take Serializes changes in the tranform and pass those changes to the server protected virtual void UpdateStateFromView() { previousState = state.Clone(); //Copy Transform to State (round position to fix floating point issues with state compare) state.xPos = (float)System.Math.Round((decimal)transform.localPosition.x, 4); state.yPos = (float)System.Math.Round((decimal)transform.localPosition.y, 4); state.zPos = (float)System.Math.Round((decimal)transform.localPosition.z, 4); state.xRot = transform.localRotation.x; state.yRot = transform.localRotation.y; state.zRot = transform.localRotation.z; state.wRot = transform.localRotation.w; state.xScale = transform.localScale.x; state.yScale = transform.localScale.y; state.zScale = transform.localScale.z; state.xVel = localPositionDelta.x; state.yVel = localPositionDelta.y; state.zVel = localPositionDelta.z; ////No need to update again if last sent state == current view modified state if (localUpdatedState != null) { //TODO: Uses reflection so might be slow, replace with defined compare to improve speed List <ExamplePropertyCompareResult> changesLocal = Compare(localUpdatedState, state); if (changesLocal.Count == 0 || (changesLocal.Count == 1 && changesLocal[0].Name == "timestamp")) { return; } } //TODO: Uses reflection so might be slow, replace with defined compare to improve speed List <ExamplePropertyCompareResult> changes = Compare(previousState, state); //Transform has been update locally, push changes if (changes.Count > 0) { //Create Change Set Array for NetSend object[] changeSet = new object[(changes.Count * 2) + 1]; changeSet[0] = state.id; int saveIndex = 1; for (int i = 0; i < changes.Count; i++) { changeSet[saveIndex] = changes[i].Name; changeSet[saveIndex + 1] = changes[i].NewValue; saveIndex += 2; } localUpdatedState = state.Clone(); ExampleManager.NetSend("entityUpdate", changeSet); } }
private void OnNetworkAdd(ExampleNetworkedEntity entity) { if (ExampleManager.Instance.HasEntityView(entity.id)) { LSLog.LogImportant("View found! For " + entity.id); } else { LSLog.LogImportant("No View found for " + entity.id); CreateView(entity); } }
public void UnregisterNetworkedEntityView(ExampleNetworkedEntity model) { if (string.IsNullOrEmpty(model.id) || _entities.ContainsKey(model.id) == false) { LSLog.LogError("Cannot Find Entity in Room"); return; } ExampleNetworkedEntityView view = _entityViews[model.id]; _entityViews.Remove(model.id); view.SendMessage("OnEntityViewUnregistered", SendMessageOptions.DontRequireReceiver); }
private void OnNetworkAdd(ExampleNetworkedEntity entity) { if (ExampleManager.Instance.HasEntityView(entity.id)) { LSLog.LogImportant("View found! For " + entity.id); scoreboardController.EntityAdded(entity); //Already exists in scene which means it has been initialized } else { LSLog.LogImportant("No View found for " + entity.id); CreateView(entity); } }
public void RemoveView(ExampleNetworkedEntity entity) { ScoreboardEntry entryForView = GetEntryByID(entity.id); if (entryForView != null) { spawnedEntries.Remove(entryForView); Destroy(entryForView.gameObject); } else { LSLog.LogError("Player left game but we do not have a scoreboard entry for them!"); } }
/// <summary> /// The callback for the event when a <see cref="ExampleNetworkedEntity" /> is removed from a room. /// </summary> /// <param name="entity">The entity that was just removed.</param> /// <param name="key">The entity's key</param> private void OnEntityRemoved(string key, ExampleNetworkedEntity entity) { if (_entities.ContainsKey(entity.id)) { _entities.Remove(entity.id); } ColyseusNetworkedEntityView view = null; if (_entityViews.ContainsKey(entity.id)) { view = _entityViews[entity.id]; _entityViews.Remove(entity.id); } onRemoveNetworkEntity?.Invoke(entity, view); }
/// <summary> /// Registers the <see cref="ExampleNetworkedEntityView"/> with the manager for tracking. /// <para>Initializes the <see cref="ExampleNetworkedEntityView"/> if it has not yet been initialized.</para> /// </summary> /// <param name="model"></param> /// <param name="view"></param> public void RegisterNetworkedEntityView(ExampleNetworkedEntity model, ColyseusNetworkedEntityView view) { if (string.IsNullOrEmpty(model.id) || view == null || _entities.ContainsKey(model.id) == false) { LSLog.LogError("Cannot Find Entity in Room"); return; } ExampleNetworkedEntityView entityView = (ExampleNetworkedEntityView)view; if (entityView && !entityView.HasInit) { entityView.InitiView(model); } _entityViews.Add(model.id, (ExampleNetworkedEntityView)view); view.SendMessage("OnEntityViewRegistered", SendMessageOptions.DontRequireReceiver); }
public void Init(ExampleNetworkedEntity entity) { entityRef = entity; PlayerController playerRef = GalleryGameManager.Instance.GetPlayerView(entity.id); if (playerRef != null) { playerName.text = playerRef.userName; } else { playerName.text = entityRef.id; } playerScore.text = "0"; highlight.SetActive(ExampleManager.Instance.CurrentUser != null && string.Equals(ExampleManager.Instance.CurrentUser.id, entityRef.ownerId)); }
/// <summary> /// The callback for the event when a <see cref="ExampleNetworkedEntity" /> is added to a room. /// </summary> /// <param name="entity">The entity that was just added.</param> /// <param name="key">The entity's key</param> private async void OnEntityAdd(string key, ExampleNetworkedEntity entity) { LSLog.LogImportant( $"Entity [{entity.__refId} | {entity.id}] add: x => {entity.xPos}, y => {entity.yPos}, z => {entity.zPos}"); _entities.Add(entity.id, entity); //Creation ID is only Registered with the owner so only owners callback will be triggered if (!string.IsNullOrEmpty(entity.creationId) && _creationCallbacks.ContainsKey(entity.creationId)) { _creationCallbacks[entity.creationId].Invoke(entity); _creationCallbacks.Remove(entity.creationId); } onAddNetworkEntity?.Invoke(entity); if (_entityViews.ContainsKey(entity.id) == false && !string.IsNullOrEmpty(entity.attributes["prefab"])) { await _factory.CreateFromPrefab(entity); } }
/// <summary> /// Creates a GameObject using the <see cref="ExampleNetworkedEntityView"/>'s prefab. /// <para>Requires that the entity has a "prefab" attribute defined.</para> /// </summary> /// <param name="entity"></param> public async Task CreateFromPrefab(ExampleNetworkedEntity entity) { LSLog.LogError($"Factory - Create From Prefab - {entity.id}"); ResourceRequest asyncItem = Resources.LoadAsync <ExampleNetworkedEntityView>(entity.attributes["prefab"]); while (asyncItem.isDone == false) { await Task.Yield(); } ExampleNetworkedEntityView view = UnityEngine.Object.Instantiate((ExampleNetworkedEntityView)asyncItem.asset); if (view == null) { LSLog.LogError("Instantiated Object is not of VMENetworkedEntityView Type"); asyncItem = null; return; } RegisterNetworkedEntityView(entity, view); }
IEnumerator WaitingEntityAdd(ExampleNetworkedEntity entity) { PlayerController newView = Instantiate(prefab); ExampleManager.Instance.RegisterNetworkedEntityView(entity, newView); newView.gameObject.SetActive(true); float seconds = 0; float delayAmt = 1.0f; //Wait until we have the view's username to add it's scoreboard entry while (string.IsNullOrEmpty(newView.userName)) { yield return(new WaitForSeconds(delayAmt)); seconds += delayAmt; if (seconds >= 30) //If 30 seconds go by and we don't have a userName, should still continue { newView.userName = "******"; } } scoreboardController.EntityAdded(entity); }
private void CreateView(ExampleNetworkedEntity entity) { StartCoroutine(WaitingEntityAdd(entity)); }
private void OnNetworkRemove(ExampleNetworkedEntity entity, ColyseusNetworkedEntityView view) { RemoveView(view); scoreboardController.EntityRemoved(entity, view); }
/// <summary> /// Registers the <see cref="ColyseusNetworkedEntityView" /> with the manager for tracking. /// <para>Initializes the <see cref="ColyseusNetworkedEntityView" /> if it has not yet been initialized.</para> /// </summary> /// <param name="model"></param> /// <param name="view"></param> public void RegisterNetworkedEntityView(ExampleNetworkedEntity model, ColyseusNetworkedEntityView view) { _networkedEntityFactory.RegisterNetworkedEntityView(model, view); }
private void OnNetworkRemove(ExampleNetworkedEntity entity, ColyseusNetworkedEntityView view) { RemoveView(view); }
/// <summary> /// Creates a GameObject using the <see cref="ColyseusNetworkedEntityView" />'s prefab. /// <para>Requires that the entity has a "prefab" attribute defined.</para> /// </summary> /// <param name="entity"></param> private static async void CreateFromPrefab(ExampleNetworkedEntity entity) { await Instance._networkedEntityFactory.CreateFromPrefab(entity); }