예제 #1
0
 protected Player AssignPlayer(int _playerID)
 {
     if (KickStarter.settingsManager.playerSwitching == PlayerSwitching.Allow && _playerID >= 0)
     {
         PlayerPrefab playerPrefab = KickStarter.settingsManager.GetPlayerPrefab(_playerID);
         if (playerPrefab != null)
         {
             Player _player = playerPrefab.GetSceneInstance();
             if (_player == null)
             {
                 Debug.LogWarning("Cannot assign Player with ID = " + _playerID + " because they are not currently in the scene.");
             }
             return(_player);
         }
         else
         {
             Debug.LogWarning("No Player prefab found with ID = " + _playerID);
         }
         return(null);
     }
     return(KickStarter.player);
 }
예제 #2
0
        public override void ShowGUI(List <ActionParameter> parameters)
        {
            isPlayer = EditorGUILayout.Toggle("Is player?", isPlayer);
            if (isPlayer)
            {
                if (KickStarter.settingsManager != null && KickStarter.settingsManager.playerSwitching == PlayerSwitching.Allow)
                {
                    playerParameterID = ChooseParameterGUI("Player ID:", parameters, playerParameterID, ParameterType.Integer);
                    if (playerParameterID < 0)
                    {
                        playerID = ChoosePlayerGUI(playerID, true);
                    }
                }

                Player _player = null;

                if (playerParameterID < 0 || KickStarter.settingsManager == null || KickStarter.settingsManager.playerSwitching == PlayerSwitching.DoNotAllow)
                {
                    if (playerID >= 0)
                    {
                        PlayerPrefab playerPrefab = KickStarter.settingsManager.GetPlayerPrefab(playerID);
                        if (playerPrefab != null)
                        {
                            _player = (Application.isPlaying) ? playerPrefab.GetSceneInstance() : playerPrefab.playerOb;
                        }
                    }
                    else
                    {
                        _player = (Application.isPlaying) ? KickStarter.player : AdvGame.GetReferences().settingsManager.GetDefaultPlayer();
                    }
                }

                if (_player != null && _player.GetShapeable())
                {
                    shapeObject = _player.GetShapeable();
                }
                else
                {
                    shapeObject = null;
                    EditorGUILayout.HelpBox("Cannot find player with Shapeable script attached", MessageType.Warning);
                }
            }
            else
            {
                parameterID = ChooseParameterGUI("Object:", parameters, parameterID, ParameterType.GameObject);
                if (parameterID >= 0)
                {
                    constantID  = 0;
                    shapeObject = null;
                }
                else
                {
                    shapeObject = (Shapeable)EditorGUILayout.ObjectField("Object:", shapeObject, typeof(Shapeable), true);

                    constantID  = FieldToID <Shapeable> (shapeObject, constantID);
                    shapeObject = IDToField <Shapeable> (shapeObject, constantID, false);
                }
            }

            if (shapeObject != null && shapeObject.shapeGroups != null)
            {
                shapeGroupID   = ActionBlendShape.ShapeableGroupGUI("Shape group:", shapeObject.shapeGroups, shapeGroupID);
                disableAllKeys = EditorGUILayout.Toggle("Disable all keys?", disableAllKeys);
                if (!disableAllKeys)
                {
                    ShapeGroup _shapeGroup = shapeObject.GetGroup(shapeGroupID);
                    if (_shapeGroup != null)
                    {
                        if (_shapeGroup.shapeKeys != null && _shapeGroup.shapeKeys.Count > 0)
                        {
                            shapeKeyID = ShapeableKeyGUI(_shapeGroup.shapeKeys, shapeKeyID);
                        }
                        else
                        {
                            EditorGUILayout.HelpBox("No shape keys found.", MessageType.Info);
                        }
                    }
                    shapeValue = EditorGUILayout.Slider("New value:", shapeValue, 0f, 100f);
                }
            }
            else
            {
                EditorGUILayout.HelpBox("An object must be assigned before more options can show.", MessageType.Info);
            }

            fadeTime = EditorGUILayout.FloatField("Transition time:", fadeTime);
            if (fadeTime > 0f)
            {
                moveMethod = (MoveMethod)EditorGUILayout.EnumPopup("Move method:", moveMethod);
                if (moveMethod == MoveMethod.CustomCurve)
                {
                    timeCurve = EditorGUILayout.CurveField("Time curve:", timeCurve);
                }
                willWait = EditorGUILayout.Toggle("Wait until finish?", willWait);
            }

            AfterRunningOption();
        }
예제 #3
0
        public override float Run()
        {
            if (KickStarter.settingsManager.playerSwitching == PlayerSwitching.Allow)
            {
                PlayerPrefab newPlayerPrefab = KickStarter.settingsManager.GetPlayerPrefab(playerID);

                if (newPlayerPrefab != null)
                {
                    if (KickStarter.player != null && KickStarter.player.ID == playerID)
                    {
                        Log("Cannot switch Player - already controlling the desired character.");
                        return(0f);
                    }

                    if (newPlayerPrefab.playerOb != null)
                    {
                        KickStarter.playerInteraction.StopMovingToHotspot();
                        KickStarter.saveSystem.SaveCurrentPlayerData();

                        if (takeOldPlayerPosition)
                        {
                            if (KickStarter.player != null)
                            {
                                if (keepInventory)
                                {
                                    KickStarter.saveSystem.AssignItemsToPlayer(KickStarter.runtimeInventory.PlayerInvCollection, playerID);
                                }

                                _Camera oldCamera = KickStarter.mainCamera.attachedCamera;
                                KickStarter.player.RemoveFromScene();

                                // Transfer open sub-scene data since both are in the same scene
                                PlayerData tempPlayerData = new PlayerData();
                                tempPlayerData = KickStarter.sceneChanger.SavePlayerData(tempPlayerData);
                                string     openSubSceneData = tempPlayerData.openSubScenes;
                                PlayerData newPlayerData    = KickStarter.saveSystem.GetPlayerData(playerID);
                                newPlayerData.openSubScenes = openSubSceneData;

                                // Force-set position / scene
                                PlayerData oldPlayerData = KickStarter.saveSystem.GetPlayerData(KickStarter.saveSystem.CurrentPlayerID);
                                newPlayerData.CopyPosition(oldPlayerData);
                                newPlayerData.UpdatePresenceInScene();
                                oldPlayerData.currentScene = -1;

                                Player newPlayer = newPlayerPrefab.GetSceneInstance(true);
                                KickStarter.player = newPlayer;

                                if (KickStarter.player != null)
                                {
                                    KickStarter.player.EndPath();
                                    KickStarter.player.StopFollowing();
                                }

                                // Same camera
                                if (oldCamera != null && KickStarter.mainCamera.attachedCamera != oldCamera)
                                {
                                    oldCamera.MoveCameraInstant();
                                    KickStarter.mainCamera.SetGameCamera(oldCamera);
                                }

                                return(0f);
                            }
                            else
                            {
                                LogWarning("Cannot take the old Player's position because no Player is currently active!");
                            }
                        }
                        else
                        {
                            if (KickStarter.player != null)
                            {
                                if (stopOldMoving || !KickStarter.player.IsPathfinding())
                                {
                                    KickStarter.player.EndPath();
                                }
                            }

                            if (keepInventory)
                            {
                                KickStarter.saveSystem.AssignItemsToPlayer(KickStarter.runtimeInventory.PlayerInvCollection, playerID);
                            }

                            int sceneIndexToLoad = KickStarter.saveSystem.GetPlayerSceneIndex(playerID);
                            if (sceneIndexToLoad < 0)
                            {
                                bool hasData = (KickStarter.saveSystem.GetPlayerData(playerID) != null);
                                if (hasData)
                                {
                                    LogWarning("Cannot switch to Player ID " + playerID + " because their current scene index = " + sceneIndexToLoad);
                                }
                                else
                                {
                                    LogWarning("Cannot switch to Player ID " + playerID + " because no save data was found for them.");
                                }
                                return(0f);
                            }

                            SubScene subScene = KickStarter.sceneChanger.GetSubScene(sceneIndexToLoad);
                            if (subScene == null && SceneChanger.CurrentSceneIndex != sceneIndexToLoad)
                            {
                                // Different scene, and not open as a sub-scene
                                if (KickStarter.player != null)
                                {
                                    KickStarter.player.Halt();
                                }

                                KickStarter.saveSystem.SwitchToPlayerInDifferentScene(playerID, sceneIndexToLoad, assignScreenOverlay);
                                return(0f);
                            }

                            // Same scene

                            // Transfer open sub-scene data since both are in the same scene
                            PlayerData tempPlayerData = new PlayerData();
                            tempPlayerData = KickStarter.sceneChanger.SavePlayerData(tempPlayerData);
                            string     openSubSceneData = tempPlayerData.openSubScenes;
                            PlayerData newPlayerData    = KickStarter.saveSystem.GetPlayerData(playerID);
                            newPlayerData.openSubScenes = openSubSceneData;

                            Player newPlayer = newPlayerPrefab.GetSceneInstance(true);
                            KickStarter.player = newPlayer;

                            if (stopNewMoving && KickStarter.player != null)
                            {
                                KickStarter.player.EndPath();
                                KickStarter.player.StopFollowing();
                            }

                            if (KickStarter.mainCamera.attachedCamera && alwaysSnapCamera)
                            {
                                KickStarter.mainCamera.attachedCamera.MoveCameraInstant();
                            }
                        }
                    }
                    else
                    {
                        LogWarning("Cannot switch to an empty Player - no Player prefab is defined for ID " + playerID + ".");
                    }
                }
                else
                {
                    LogWarning("Cannot switch Player - no Player prefab is defined.");
                }
            }

            return(0f);
        }
예제 #4
0
        /**
         * <summary>Deserialises a string of data, and restores the GameObject to its previous state.</summary>
         * <param name = "stringData">The data, serialised as a string</param>
         */
        public void LoadTransformData(TransformData data)
        {
            if (data == null)
            {
                return;
            }
            savePrevented = data.savePrevented; if (savePrevented)
            {
                return;
            }

            if (data.parentIsPlayer)
            {
                Player player = KickStarter.player;

                if (data.parentPlayerID >= 0)
                {
                    player = null;
                    PlayerPrefab playerPrefab = KickStarter.settingsManager.GetPlayerPrefab(data.parentPlayerID);
                    if (playerPrefab != null)
                    {
                        player = playerPrefab.GetSceneInstance();
                    }
                }

                if (player)
                {
                    if (data.heldHand == Hand.Left)
                    {
                        transform.parent = player.leftHandBone;
                    }
                    else
                    {
                        transform.parent = player.rightHandBone;
                    }
                }
            }
            else if (data.parentID != 0)
            {
                ConstantID parentObject = ConstantID.GetComponent <ConstantID> (data.parentID);

                if (parentObject)
                {
                    if (data.parentIsNPC)
                    {
                        Char _char = parentObject.GetComponent <NPC> ();
                        if (_char && !_char.IsPlayer)
                        {
                            if (data.heldHand == Hand.Left)
                            {
                                transform.parent = _char.leftHandBone;
                            }
                            else
                            {
                                transform.parent = _char.rightHandBone;
                            }
                        }
                    }
                    else
                    {
                        transform.parent = parentObject.gameObject.transform;
                    }
                }
            }
            else if (data.parentID == 0 && saveParent)
            {
                transform.parent = null;
            }

            switch (transformSpace)
            {
            case GlobalLocal.Global:
                transform.position    = new Vector3(data.LocX, data.LocY, data.LocZ);
                transform.eulerAngles = new Vector3(data.RotX, data.RotY, data.RotZ);
                break;

            case GlobalLocal.Local:
                transform.localPosition    = new Vector3(data.LocX, data.LocY, data.LocZ);
                transform.localEulerAngles = new Vector3(data.RotX, data.RotY, data.RotZ);
                break;
            }

            transform.localScale = new Vector3(data.ScaleX, data.ScaleY, data.ScaleZ);
        }
예제 #5
0
        /**
         * Ends all skippable ActionLists.
         * This is triggered when the user presses the "EndCutscene" Input button.
         */
        public void EndCutscene()
        {
            if (!IsInSkippableCutscene())
            {
                return;
            }

            if (AdvGame.GetReferences().settingsManager.blackOutWhenSkipping)
            {
                KickStarter.mainCamera.ForceOverlayForFrames(4);
            }

            KickStarter.eventManager.Call_OnSkipCutscene();

            // Stop all non-looping sound
            Sound[] sounds = FindObjectsOfType(typeof(Sound)) as Sound[];
            foreach (Sound sound in sounds)
            {
                if (sound.GetComponent <AudioSource>())
                {
                    if (sound.soundType != SoundType.Music && !sound.GetComponent <AudioSource>().loop)
                    {
                        sound.Stop();
                    }
                }
            }

            // Set correct Player prefab before skipping
            if (KickStarter.settingsManager.playerSwitching == PlayerSwitching.Allow)
            {
                if (!noPlayerOnStartQueue && playerIDOnStartQueue >= 0)
                {
                    if (KickStarter.player == null || KickStarter.player.ID != playerIDOnStartQueue)
                    {
                        //
                        PlayerPrefab oldPlayerPrefab = KickStarter.settingsManager.GetPlayerPrefab(playerIDOnStartQueue);
                        if (oldPlayerPrefab != null)
                        {
                            if (KickStarter.player != null)
                            {
                                KickStarter.player.Halt();
                            }

                            Player oldPlayer = oldPlayerPrefab.GetSceneInstance();
                            KickStarter.player = oldPlayer;
                        }
                    }
                }
            }

            List <ActiveList> listsToSkip  = new List <ActiveList>();
            List <ActiveList> listsToReset = new List <ActiveList>();

            foreach (ActiveList activeList in activeLists)
            {
                if (!activeList.inSkipQueue && activeList.actionList.IsSkippable())
                {
                    listsToReset.Add(activeList);
                }
                else
                {
                    listsToSkip.Add(activeList);
                }
            }

            foreach (ActiveList activeList in KickStarter.actionListAssetManager.ActiveLists)
            {
                if (!activeList.inSkipQueue && activeList.actionList.IsSkippable())
                {
                    listsToReset.Add(activeList);
                }
                else
                {
                    listsToSkip.Add(activeList);
                }
            }

            foreach (ActiveList listToReset in listsToReset)
            {
                // Kill, but do isolated, to bypass setting GameState etc
                listToReset.Reset(true);
            }

            foreach (ActiveList listToSkip in listsToSkip)
            {
                listToSkip.Skip();
            }
        }
예제 #6
0
        public override void ShowGUI(List <ActionParameter> parameters)
        {
            isPlayer = EditorGUILayout.Toggle("Is Player?", isPlayer);
            if (isPlayer)
            {
                if (KickStarter.settingsManager != null && KickStarter.settingsManager.playerSwitching == PlayerSwitching.Allow)
                {
                    playerParameterID = ChooseParameterGUI("Player ID:", parameters, playerParameterID, ParameterType.Integer);
                    if (playerParameterID < 0)
                    {
                        playerID = ChoosePlayerGUI(playerID, true);
                    }
                }

                if (playerParameterID < 0)
                {
                    if (playerID >= 0)
                    {
                        PlayerPrefab playerPrefab = KickStarter.settingsManager.GetPlayerPrefab(playerID);
                        if (playerPrefab != null)
                        {
                            _char = (Application.isPlaying) ? playerPrefab.GetSceneInstance() : playerPrefab.playerOb;
                        }
                    }
                    else
                    {
                        _char = (Application.isPlaying) ? KickStarter.player : AdvGame.GetReferences().settingsManager.GetDefaultPlayer();
                    }
                }
            }
            else
            {
                _char = (Char)EditorGUILayout.ObjectField("Character:", _char, typeof(Char), true);

                _charID = FieldToID <Char> (_char, _charID);
                _char   = IDToField <Char> (_char, _charID, true);
            }

            if (_char != null)
            {
                if (_char.GetAnimEngine() && _char.GetAnimEngine().ActionCharHoldPossible())
                {
                    if (_char.GetAnimEngine().IKEnabled)
                    {
                        charHoldMethod = (CharHoldMethod)EditorGUILayout.EnumPopup("Hold method:", charHoldMethod);
                        if (charHoldMethod == CharHoldMethod.MoveHandWithIK)
                        {
                            ikHoldMethod = (IKHoldMethod)EditorGUILayout.EnumPopup("IK command:", ikHoldMethod);
                        }
                    }
                    else
                    {
                        charHoldMethod = CharHoldMethod.ParentObjectToHand;
                    }

                    if (charHoldMethod == CharHoldMethod.ParentObjectToHand || ikHoldMethod == IKHoldMethod.SetTarget)
                    {
                        objectToHoldParameterID = Action.ChooseParameterGUI("Object to hold:", parameters, objectToHoldParameterID, ParameterType.GameObject);
                        if (objectToHoldParameterID >= 0)
                        {
                            objectToHoldID = 0;
                            objectToHold   = null;
                        }
                        else
                        {
                            objectToHold = (GameObject)EditorGUILayout.ObjectField("Object to hold:", objectToHold, typeof(GameObject), true);

                            objectToHoldID = FieldToID(objectToHold, objectToHoldID);
                            objectToHold   = IDToField(objectToHold, objectToHoldID, false);
                        }
                    }

                    hand = (Hand)EditorGUILayout.EnumPopup("Hand:", hand);

                    if (charHoldMethod == CharHoldMethod.ParentObjectToHand)
                    {
                        localEulerAnglesParameterID = Action.ChooseParameterGUI("Object local angles:", parameters, localEulerAnglesParameterID, ParameterType.Vector3);
                        if (localEulerAnglesParameterID < 0)
                        {
                            localEulerAngles = EditorGUILayout.Vector3Field("Object local angles:", localEulerAngles);
                        }
                    }
                    else if (charHoldMethod == CharHoldMethod.MoveHandWithIK && ikHoldMethod == IKHoldMethod.SetTarget)
                    {
                        ikTransitionCurve = EditorGUILayout.CurveField("Transition curve:", ikTransitionCurve);
                    }
                }
                else
                {
                    EditorGUILayout.HelpBox("This Action is not compatible with this Character's Animation Engine.", MessageType.Info);
                }
            }
            else
            {
                EditorGUILayout.HelpBox("This Action requires a Character before more options will show.", MessageType.Info);
            }

            AfterRunningOption();
        }