Esempio n. 1
0
        /**
         * @brief Returns true if the given layers can collide.
         *
         * @param layerA Layer of the first object
         * @param layerB Layer of the second object
         **/
        public static bool CollisionEnabled(int layerA, int layerB)
        {
            FrameSyncConfig tsConfig = FrameSyncManager.Config;

            if (tsConfig == null)
            {
                return(true);
            }

            return(!tsConfig.GetIgnoreLayerCollision(layerA, layerB));
        }
Esempio n. 2
0
        void Awake()
        {
            FrameSyncConfig currentConfig = ActiveConfig;

            lockedTimeStep = currentConfig.lockedTimeStep;

            StateTracker.Init(currentConfig.rollbackWindow);

            // TODO: 随机数种子在这里指定,需要修改为由 Server 统一指定
            FPRandom.Init();

            if (currentConfig.physics2DEnabled || currentConfig.physics3DEnabled)
            {
                PhysicsManager.New(currentConfig);
                PhysicsManager.instance.LockedTimeStep = lockedTimeStep;
                PhysicsManager.instance.Init();
            }

            StateTracker.AddTracking(this, "time");
        }
Esempio n. 3
0
        private static void CreateFrameSyncConfigAsset()
        {
            FrameSyncConfig asset = ScriptableObject.CreateInstance <FrameSyncConfig>();

            string path = AssetDatabase.GetAssetPath(Selection.activeObject);

            if (path == "")
            {
                path = "Assets";
            }
            else if (Path.GetExtension(path) != "")
            {
                path = path.Replace(Path.GetFileName(AssetDatabase.GetAssetPath(Selection.activeObject)), "");
            }

            string assetPathAndName = AssetDatabase.GenerateUniqueAssetPath(path + "/FrameSyncConfig.asset");

            AssetDatabase.CreateAsset(asset, assetPathAndName);

            AssetDatabase.SaveAssets();
            EditorUtility.FocusProjectWindow();
            Selection.activeObject = asset;
        }
Esempio n. 4
0
        void Start()
        {
            instance = this;
            Application.runInBackground = true;

            ICommunicator communicator = null;

//            if (!PhotonNetwork.connected || !PhotonNetwork.inRoom) {
//                Debug.LogWarning("You are not connected to Photon. FrameSync will start in offline mode.");
//            } else {
//                communicator = new PhotonFrameSyncCommunicator(PhotonNetwork.networkingPeer);
//            }


//             if (NetMgr.Instance.srvConn.status == Connection.Status.None)
//             {
//                 Debug.LogWarning("You are not connected to Server. FrameSync will start in offline mode.");
//             }
//             else
//             {
//                 communicator = new RealSyncCommunicator();
//             }

            FrameSyncConfig activeConfig = ActiveConfig;

            lockstep = AbstractLockstep.NewInstance(
                lockedTimeStep.AsFloat(),
                communicator,
                PhysicsManager.instance,
                activeConfig.syncWindow,
                activeConfig.panicWindow,
                activeConfig.rollbackWindow,
                OnGameStarted,
                OnGamePaused,
                OnGameUnPaused,
                OnGameEnded,
                OnPlayerDisconnection,
                OnStepUpdate,
                GetLocalData,
                ProvideInputData
                );

            if (ReplayRecord.replayMode == ReplayMode.LOAD_REPLAY)
            {
                //               ReplayPicker.replayToLoad.Load();

                ReplayRecord replayRecord = ReplayRecord.replayToLoad;
                if (replayRecord == null)
                {
                    Debug.LogError("Replay Record can't be loaded");
                    gameObject.SetActive(false);
                    return;
                }
                else
                {
                    lockstep.ReplayRecord = replayRecord;
                }
            }

            if (activeConfig.showStats)
            {
                this.gameObject.AddComponent <FrameSyncStats>().Lockstep = lockstep;
            }

            scheduler = new CoroutineScheduler(lockstep);

            if (ReplayRecord.replayMode != ReplayMode.LOAD_REPLAY)
            {
                if (communicator == null)
                {
                    lockstep.AddPlayer(0, "Local_Player", true);
                }
                else
                {
                    //                    List<PhotonPlayer> players = new List<PhotonPlayer>(PhotonNetwork.playerList);
                    //                    players.Sort(UnityUtils.playerComparer);
                    //
                    //                    for (int index = 0, length = players.Count; index < length; index++) {
                    //                        PhotonPlayer p = players[index];
                    //                        lockstep.AddPlayer((byte) p.ID, p.NickName, p.IsLocal);
                    //                    }

//                     for (int i = 0; i < GameData.Instance.RoomPlayers.Count; i++)
//                     {
//                         KBEngine.Avatar player = GameData.Instance.RoomPlayers[i];
//                         lockstep.AddPlayer((byte)(i + 1), player.id.ToString(), player.isPlayer());
//                     }
                }
            }

            FrameSyncBehaviour[] behavioursArray = FindObjectsOfType <FrameSyncBehaviour>();
            for (int index = 0, length = behavioursArray.Length; index < length; index++)
            {
                generalBehaviours.Add(NewManagedBehavior(behavioursArray[index]));
            }

            initBehaviors();
            initGeneralBehaviors(generalBehaviours, false);

            PhysicsManager.instance.OnRemoveBody(OnRemovedRigidBody);

            startState = StartState.BEHAVIOR_INITIALIZED;
        }
Esempio n. 5
0
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            FrameSyncConfig settings = (FrameSyncConfig)target;

            Undo.RecordObject(settings, "Edit FrameSyncConfig");

            EditorGUILayout.LabelField("General", EditorStyles.boldLabel);
            EditorGUI.indentLevel++;

            settings.syncWindow = EditorGUILayout.IntField("Sync Window", settings.syncWindow);
            if (settings.syncWindow < 0)
            {
                settings.syncWindow = 0;
            }

            settings.rollbackWindow = EditorGUILayout.IntField("Rollback Window", settings.rollbackWindow);
            if (settings.rollbackWindow < 0)
            {
                settings.rollbackWindow = 0;
            }

            settings.panicWindow = EditorGUILayout.IntField("Panic Window", settings.panicWindow);
            if (settings.panicWindow < 0)
            {
                settings.panicWindow = 0;
            }

            settings.lockedTimeStep = EditorGUILayout.FloatField("Locked Time Step", settings.lockedTimeStep.AsFloat());
            if (settings.lockedTimeStep < 0)
            {
                settings.lockedTimeStep = 0;
            }

            settings.showStats = EditorGUILayout.Toggle("Show Stats", settings.showStats);

            EditorGUI.indentLevel--;

            GUILayout.Space(10);

            settings.physics2DEnabled = EditorGUILayout.BeginToggleGroup("2D Physics", settings.physics2DEnabled);

            if (settings.physics2DEnabled)
            {
                settings.physics3DEnabled = false;

                EditorGUI.indentLevel++;

                Vector2 gField2D = EditorGUILayout.Vector2Field("Gravity", settings.gravity2D.ToVector());
                settings.gravity2D.x = gField2D.x;
                settings.gravity2D.y = gField2D.y;

                settings.speculativeContacts2D = EditorGUILayout.Toggle("Speculative Contacts", settings.speculativeContacts2D);

                physics2DCollisionFoldout = EditorGUILayout.Foldout(physics2DCollisionFoldout, "Layer Collision Matrix");
                if (physics2DCollisionFoldout)
                {
                    DrawLayerMatrix(settings.physics2DIgnoreMatrix);
                }

                EditorGUI.indentLevel--;
            }

            EditorGUILayout.EndToggleGroup();

            settings.physics3DEnabled = EditorGUILayout.BeginToggleGroup("3D Physics", settings.physics3DEnabled);

            if (settings.physics3DEnabled)
            {
                settings.physics2DEnabled = false;

                EditorGUI.indentLevel++;

                Vector3 gField3D = EditorGUILayout.Vector3Field("Gravity", settings.gravity3D.ToVector());
                settings.gravity3D.x = gField3D.x;
                settings.gravity3D.y = gField3D.y;
                settings.gravity3D.z = gField3D.z;

                settings.speculativeContacts3D = EditorGUILayout.Toggle("Speculative Contacts", settings.speculativeContacts3D);

                physics3DCollisionFoldout = EditorGUILayout.Foldout(physics3DCollisionFoldout, "Layer Collision Matrix");
                if (physics3DCollisionFoldout)
                {
                    DrawLayerMatrix(settings.physics3DIgnoreMatrix);
                }

                EditorGUI.indentLevel--;
            }

            EditorGUILayout.EndToggleGroup();

            serializedObject.ApplyModifiedProperties();

            GUILayout.Space(20);

            if (GUILayout.Button("Highlight Settings"))
            {
                EditorGUIUtility.PingObject(target);
            }

            if (GUI.changed)
            {
                EditorUtility.SetDirty(target);
            }
        }