示例#1
0
    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);
    }
示例#3
0
    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);
    }
示例#6
0
    //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);
        }
    }
示例#7
0
 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);
     }
 }
示例#8
0
    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);
    }
示例#12
0
    /// <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);
        }
    }
示例#15
0
    /// <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);
 }
示例#20
0
 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);
 }