コード例 #1
0
        /**
         * Combs the scene for data to store, combines it into a SingleLevelData variable, and adds it to the SingleLevelData List, allLevelData.
         */
        public void StoreCurrentLevelData()
        {
            List <TransformData> thisLevelTransforms = PopulateTransformData();
            List <ScriptData>    thisLevelScripts    = PopulateScriptData();

            SingleLevelData thisLevelData = new SingleLevelData();

            thisLevelData.sceneNumber = UnityVersionHandler.GetCurrentSceneNumber();

            thisLevelData.activeLists = KickStarter.actionListManager.GetSaveData();

            if (KickStarter.sceneSettings)
            {
                if (KickStarter.sceneSettings.navMesh && KickStarter.sceneSettings.navMesh.GetComponent <ConstantID>())
                {
                    thisLevelData.navMesh = Serializer.GetConstantID(KickStarter.sceneSettings.navMesh.gameObject);
                }
                if (KickStarter.sceneSettings.defaultPlayerStart && KickStarter.sceneSettings.defaultPlayerStart.GetComponent <ConstantID>())
                {
                    thisLevelData.playerStart = Serializer.GetConstantID(KickStarter.sceneSettings.defaultPlayerStart.gameObject);
                }
                if (KickStarter.sceneSettings.sortingMap && KickStarter.sceneSettings.sortingMap.GetComponent <ConstantID>())
                {
                    thisLevelData.sortingMap = Serializer.GetConstantID(KickStarter.sceneSettings.sortingMap.gameObject);
                }
                if (KickStarter.sceneSettings.cutsceneOnLoad && KickStarter.sceneSettings.cutsceneOnLoad.GetComponent <ConstantID>())
                {
                    thisLevelData.onLoadCutscene = Serializer.GetConstantID(KickStarter.sceneSettings.cutsceneOnLoad.gameObject);
                }
                if (KickStarter.sceneSettings.cutsceneOnStart && KickStarter.sceneSettings.cutsceneOnStart.GetComponent <ConstantID>())
                {
                    thisLevelData.onStartCutscene = Serializer.GetConstantID(KickStarter.sceneSettings.cutsceneOnStart.gameObject);
                }
                if (KickStarter.sceneSettings.tintMap && KickStarter.sceneSettings.tintMap.GetComponent <ConstantID>())
                {
                    thisLevelData.tintMap = Serializer.GetConstantID(KickStarter.sceneSettings.tintMap.gameObject);
                }
            }

            thisLevelData.localVariablesData = SaveSystem.CreateVariablesData(KickStarter.localVariables.localVars, false, VariableLocation.Local);
            thisLevelData.allTransformData   = thisLevelTransforms;
            thisLevelData.allScriptData      = thisLevelScripts;

            bool found = false;

            for (int i = 0; i < allLevelData.Count; i++)
            {
                if (allLevelData[i].sceneNumber == UnityVersionHandler.GetCurrentSceneNumber())
                {
                    allLevelData[i] = thisLevelData;
                    found           = true;
                    break;
                }
            }

            if (!found)
            {
                allLevelData.Add(thisLevelData);
            }
        }
コード例 #2
0
        /**
         * <summary>Updates a VisibilityData class with its own variables that need saving.</summary>
         * <param name = "visibilityData">The original VisibilityData class</param>
         * <returns>The updated VisibilityData class</returns>
         */
        public VisibilityData SaveData(VisibilityData visibilityData)
        {
            visibilityData.useDefaultTintMap = useDefaultTintMap;
            visibilityData.tintIntensity     = targetIntensity;

            visibilityData.tintMapID = 0;
            if (!useDefaultTintMap && tintMap != null && tintMap.gameObject != null)
            {
                visibilityData.tintMapID = Serializer.GetConstantID(tintMap.gameObject);
            }

            return(visibilityData);
        }
コード例 #3
0
        /**
         * <summary>Updates a PlayerData class with its own variables that need saving.</summary>
         * <param name = "playerData">The original PlayerData class</param>
         * <returns>The updated PlayerData class</returns>
         */
        public PlayerData SavePlayerData(PlayerData playerData)
        {
            playerData.playerID = ID;

            playerData.playerLocX = transform.position.x;
            playerData.playerLocY = transform.position.y;
            playerData.playerLocZ = transform.position.z;
            playerData.playerRotY = TransformRotation.eulerAngles.y;

            playerData.playerWalkSpeed = walkSpeedScale;
            playerData.playerRunSpeed  = runSpeedScale;

            // Animation clips
            if (animationEngine == AnimationEngine.Sprites2DToolkit || animationEngine == AnimationEngine.SpritesUnity)
            {
                playerData.playerIdleAnim = idleAnimSprite;
                playerData.playerWalkAnim = walkAnimSprite;
                playerData.playerRunAnim  = runAnimSprite;
                playerData.playerTalkAnim = talkAnimSprite;
            }
            else if (animationEngine == AnimationEngine.Legacy)
            {
                playerData.playerIdleAnim = AssetLoader.GetAssetInstanceID(idleAnim);
                playerData.playerWalkAnim = AssetLoader.GetAssetInstanceID(walkAnim);
                playerData.playerRunAnim  = AssetLoader.GetAssetInstanceID(runAnim);
                playerData.playerTalkAnim = AssetLoader.GetAssetInstanceID(talkAnim);
            }
            else if (animationEngine == AnimationEngine.Mecanim)
            {
                playerData.playerWalkAnim = moveSpeedParameter;
                playerData.playerTalkAnim = talkParameter;
                playerData.playerRunAnim  = turnParameter;
            }

            // Sound
            playerData.playerWalkSound = AssetLoader.GetAssetInstanceID(walkSound);
            playerData.playerRunSound  = AssetLoader.GetAssetInstanceID(runSound);

            // Portrait graphic
            playerData.playerPortraitGraphic = AssetLoader.GetAssetInstanceID(portraitIcon.texture);

            // Speech label
            playerData.playerSpeechLabel   = GetName();
            playerData.playerDisplayLineID = displayLineID;

            // Rendering
            playerData.playerLockDirection = lockDirection;
            playerData.playerLockScale     = lockScale;
            if (spriteChild && spriteChild.GetComponent <FollowSortingMap>())
            {
                playerData.playerLockSorting = spriteChild.GetComponent <FollowSortingMap>().lockSorting;
            }
            else if (GetComponent <FollowSortingMap>())
            {
                playerData.playerLockSorting = GetComponent <FollowSortingMap>().lockSorting;
            }
            else
            {
                playerData.playerLockSorting = false;
            }
            playerData.playerSpriteDirection = spriteDirection;
            playerData.playerSpriteScale     = spriteScale;
            if (spriteChild && spriteChild.GetComponent <Renderer>())
            {
                playerData.playerSortingOrder = spriteChild.GetComponent <Renderer>().sortingOrder;
                playerData.playerSortingLayer = spriteChild.GetComponent <Renderer>().sortingLayerName;
            }
            else if (GetComponent <Renderer>())
            {
                playerData.playerSortingOrder = GetComponent <Renderer>().sortingOrder;
                playerData.playerSortingLayer = GetComponent <Renderer>().sortingLayerName;
            }

            playerData.playerActivePath     = 0;
            playerData.lastPlayerActivePath = 0;
            if (GetPath())
            {
                playerData.playerTargetNode  = GetTargetNode();
                playerData.playerPrevNode    = GetPrevNode();
                playerData.playerIsRunning   = isRunning;
                playerData.playerPathAffectY = activePath.affectY;

                if (GetComponent <Paths>() && GetPath() == GetComponent <Paths>())
                {
                    playerData.playerPathData   = Serializer.CreatePathData(GetComponent <Paths>());
                    playerData.playerLockedPath = false;
                }
                else
                {
                    playerData.playerPathData   = "";
                    playerData.playerActivePath = Serializer.GetConstantID(GetPath().gameObject);
                    playerData.playerLockedPath = lockedPath;
                }
            }

            if (GetLastPath())
            {
                playerData.lastPlayerTargetNode = GetLastTargetNode();
                playerData.lastPlayerPrevNode   = GetLastPrevNode();
                playerData.lastPlayerActivePath = Serializer.GetConstantID(GetLastPath().gameObject);
            }

            playerData.playerIgnoreGravity = ignoreGravity;

            // Head target
            playerData.playerLockHotspotHeadTurning = lockHotspotHeadTurning;
            if (headFacing == HeadFacing.Manual && headTurnTarget != null)
            {
                playerData.isHeadTurning = true;
                playerData.headTargetID  = Serializer.GetConstantID(headTurnTarget);
                if (playerData.headTargetID == 0)
                {
                    ACDebug.LogWarning("The Player's head-turning target Transform, " + headTurnTarget + ", was not saved because it has no Constant ID");
                }
                playerData.headTargetX = headTurnTargetOffset.x;
                playerData.headTargetY = headTurnTargetOffset.y;
                playerData.headTargetZ = headTurnTargetOffset.z;
            }
            else
            {
                playerData.isHeadTurning = false;
                playerData.headTargetID  = 0;
                playerData.headTargetX   = 0f;
                playerData.headTargetY   = 0f;
                playerData.headTargetZ   = 0f;
            }

            if (GetComponentInChildren <FollowSortingMap>() != null)
            {
                FollowSortingMap followSortingMap = GetComponentInChildren <FollowSortingMap>();
                playerData.followSortingMap = followSortingMap.followSortingMap;
                if (!playerData.followSortingMap && followSortingMap.GetSortingMap() != null)
                {
                    if (followSortingMap.GetSortingMap().GetComponent <ConstantID>() != null)
                    {
                        playerData.customSortingMapID = followSortingMap.GetSortingMap().GetComponent <ConstantID>().constantID;
                    }
                    else
                    {
                        ACDebug.LogWarning("The Player's SortingMap, " + followSortingMap.GetSortingMap().name + ", was not saved because it has no Constant ID");
                        playerData.customSortingMapID = 0;
                    }
                }
                else
                {
                    playerData.customSortingMapID = 0;
                }
            }
            else
            {
                playerData.followSortingMap   = false;
                playerData.customSortingMapID = 0;
            }

            return(playerData);
        }
コード例 #4
0
        private void SendSceneToData(SubScene subScene = null)
        {
            SceneSettings  sceneSettings  = (subScene == null) ? KickStarter.sceneSettings : subScene.SceneSettings;
            LocalVariables localVariables = (subScene == null) ? KickStarter.localVariables : subScene.LocalVariables;

            List <TransformData> thisLevelTransforms = PopulateTransformData(subScene);
            List <ScriptData>    thisLevelScripts    = PopulateScriptData(subScene);

            SingleLevelData thisLevelData = new SingleLevelData();

            thisLevelData.sceneNumber = (subScene == null) ? UnityVersionHandler.GetCurrentSceneNumber() : subScene.SceneInfo.number;

            thisLevelData.activeLists = KickStarter.actionListManager.GetSaveData(subScene);

            if (sceneSettings != null)
            {
                if (sceneSettings.navMesh && sceneSettings.navMesh.GetComponent <ConstantID>())
                {
                    thisLevelData.navMesh = Serializer.GetConstantID(sceneSettings.navMesh.gameObject);
                }
                if (sceneSettings.defaultPlayerStart && sceneSettings.defaultPlayerStart.GetComponent <ConstantID>())
                {
                    thisLevelData.playerStart = Serializer.GetConstantID(sceneSettings.defaultPlayerStart.gameObject);
                }
                if (sceneSettings.sortingMap && sceneSettings.sortingMap.GetComponent <ConstantID>())
                {
                    thisLevelData.sortingMap = Serializer.GetConstantID(sceneSettings.sortingMap.gameObject);
                }
                if (sceneSettings.cutsceneOnLoad && sceneSettings.cutsceneOnLoad.GetComponent <ConstantID>())
                {
                    thisLevelData.onLoadCutscene = Serializer.GetConstantID(sceneSettings.cutsceneOnLoad.gameObject);
                }
                if (sceneSettings.cutsceneOnStart && sceneSettings.cutsceneOnStart.GetComponent <ConstantID>())
                {
                    thisLevelData.onStartCutscene = Serializer.GetConstantID(sceneSettings.cutsceneOnStart.gameObject);
                }
                if (sceneSettings.tintMap && sceneSettings.tintMap.GetComponent <ConstantID>())
                {
                    thisLevelData.tintMap = Serializer.GetConstantID(sceneSettings.tintMap.gameObject);
                }
            }

            thisLevelData.localVariablesData = SaveSystem.CreateVariablesData(localVariables.localVars, false, VariableLocation.Local);
            thisLevelData.allTransformData   = thisLevelTransforms;
            thisLevelData.allScriptData      = thisLevelScripts;

            bool found = false;

            for (int i = 0; i < allLevelData.Count; i++)
            {
                if (allLevelData[i].sceneNumber == thisLevelData.sceneNumber)
                {
                    allLevelData[i] = thisLevelData;
                    found           = true;
                    break;
                }
            }

            if (!found)
            {
                allLevelData.Add(thisLevelData);
            }
        }
コード例 #5
0
ファイル: NPC.cs プロジェクト: linuslc/Phobophobia
        /**
         * <summary>Updates a NPCData class with its own variables that need saving.</summary>
         * <param name = "npcData">The original NPCData class</param>
         * <returns>The updated NPCData class</returns>
         */
        public NPCData SaveData(NPCData npcData)
        {
            npcData.RotX = TransformRotation.eulerAngles.x;
            npcData.RotY = TransformRotation.eulerAngles.y;
            npcData.RotZ = TransformRotation.eulerAngles.z;

            npcData.inCustomCharState = (charState == CharState.Custom && GetAnimator() != null && GetAnimator().GetComponent <RememberAnimator>());

            if (animationEngine == AnimationEngine.Sprites2DToolkit || animationEngine == AnimationEngine.SpritesUnity)
            {
                npcData.idleAnim = idleAnimSprite;
                npcData.walkAnim = walkAnimSprite;
                npcData.talkAnim = talkAnimSprite;
                npcData.runAnim  = runAnimSprite;
            }
            else if (animationEngine == AnimationEngine.Legacy)
            {
                npcData.idleAnim = AssetLoader.GetAssetInstanceID(idleAnim);
                npcData.walkAnim = AssetLoader.GetAssetInstanceID(walkAnim);
                npcData.runAnim  = AssetLoader.GetAssetInstanceID(runAnim);
                npcData.talkAnim = AssetLoader.GetAssetInstanceID(talkAnim);
            }
            else if (animationEngine == AnimationEngine.Mecanim)
            {
                npcData.walkAnim = moveSpeedParameter;
                npcData.talkAnim = talkParameter;
                npcData.runAnim  = turnParameter;
            }

            npcData.walkSound = AssetLoader.GetAssetInstanceID(walkSound);
            npcData.runSound  = AssetLoader.GetAssetInstanceID(runSound);

            npcData.speechLabel     = GetName();
            npcData.displayLineID   = displayLineID;
            npcData.portraitGraphic = AssetLoader.GetAssetInstanceID(portraitIcon.texture);

            npcData.walkSpeed = walkSpeedScale;
            npcData.runSpeed  = runSpeedScale;

            // Rendering
            npcData.lockDirection = lockDirection;
            npcData.lockScale     = lockScale;
            if (spriteChild && spriteChild.GetComponent <FollowSortingMap>())
            {
                npcData.lockSorting = spriteChild.GetComponent <FollowSortingMap>().lockSorting;
            }
            else if (GetComponent <FollowSortingMap>())
            {
                npcData.lockSorting = GetComponent <FollowSortingMap>().lockSorting;
            }
            else
            {
                npcData.lockSorting = false;
            }
            npcData.spriteDirection = spriteDirection;
            npcData.spriteScale     = spriteScale;
            if (spriteChild && spriteChild.GetComponent <Renderer>())
            {
                npcData.sortingOrder = spriteChild.GetComponent <Renderer>().sortingOrder;
                npcData.sortingLayer = spriteChild.GetComponent <Renderer>().sortingLayerName;
            }
            else if (GetComponent <Renderer>())
            {
                npcData.sortingOrder = GetComponent <Renderer>().sortingOrder;
                npcData.sortingLayer = GetComponent <Renderer>().sortingLayerName;
            }

            npcData.pathID     = 0;
            npcData.lastPathID = 0;
            if (GetPath())
            {
                npcData.targetNode  = GetTargetNode();
                npcData.prevNode    = GetPreviousNode();
                npcData.isRunning   = isRunning;
                npcData.pathAffectY = GetPath().affectY;

                if (GetPath() == GetComponent <Paths>())
                {
                    npcData.pathData = Serializer.CreatePathData(GetComponent <Paths>());
                }
                else
                {
                    if (GetPath().GetComponent <ConstantID>())
                    {
                        npcData.pathID = GetPath().GetComponent <ConstantID>().constantID;
                    }
                    else
                    {
                        ACDebug.LogWarning("Want to save path data for " + name + " but path has no ID!", gameObject);
                    }
                }
            }

            if (GetLastPath())
            {
                npcData.lastTargetNode = GetLastTargetNode();
                npcData.lastPrevNode   = GetLastPrevNode();

                if (GetLastPath().GetComponent <ConstantID>())
                {
                    npcData.lastPathID = GetLastPath().GetComponent <ConstantID>().constantID;
                }
                else
                {
                    ACDebug.LogWarning("Want to save previous path data for " + name + " but path has no ID!", gameObject);
                }
            }

            if (followTarget)
            {
                if (!followTargetIsPlayer)
                {
                    if (followTarget.GetComponent <ConstantID>())
                    {
                        npcData.followTargetID        = followTarget.GetComponent <ConstantID>().constantID;
                        npcData.followTargetIsPlayer  = followTargetIsPlayer;
                        npcData.followFrequency       = followFrequency;
                        npcData.followDistance        = followDistance;
                        npcData.followDistanceMax     = followDistanceMax;
                        npcData.followFaceWhenIdle    = followFaceWhenIdle;
                        npcData.followRandomDirection = followRandomDirection;
                    }
                    else
                    {
                        ACDebug.LogWarning("Want to save follow data for " + name + " but " + followTarget.name + " has no ID!", gameObject);
                    }
                }
                else
                {
                    npcData.followTargetID       = 0;
                    npcData.followTargetIsPlayer = followTargetIsPlayer;
                    npcData.followFrequency      = followFrequency;
                    npcData.followDistance       = followDistance;
                    npcData.followDistanceMax    = followDistanceMax;
                    //followFaceWhenIdle = false;
                    npcData.followFaceWhenIdle    = followFaceWhenIdle;
                    npcData.followRandomDirection = followRandomDirection;
                }
            }
            else
            {
                npcData.followTargetID        = 0;
                npcData.followTargetIsPlayer  = false;
                npcData.followFrequency       = 0f;
                npcData.followDistance        = 0f;
                npcData.followDistanceMax     = 0f;
                npcData.followFaceWhenIdle    = false;
                npcData.followRandomDirection = false;
            }

            if (headFacing == HeadFacing.Manual && headTurnTarget != null)
            {
                npcData.isHeadTurning = true;
                npcData.headTargetID  = Serializer.GetConstantID(headTurnTarget);
                if (npcData.headTargetID == 0)
                {
                    ACDebug.LogWarning("The NPC " + gameObject.name + "'s head-turning target Transform, " + headTurnTarget + ", was not saved because it has no Constant ID", gameObject);
                }
                npcData.headTargetX = headTurnTargetOffset.x;
                npcData.headTargetY = headTurnTargetOffset.y;
                npcData.headTargetZ = headTurnTargetOffset.z;
            }
            else
            {
                npcData.isHeadTurning = false;
                npcData.headTargetID  = 0;
                npcData.headTargetX   = 0f;
                npcData.headTargetY   = 0f;
                npcData.headTargetZ   = 0f;
            }

            if (GetComponentInChildren <FollowSortingMap>() != null)
            {
                FollowSortingMap followSortingMap = GetComponentInChildren <FollowSortingMap>();
                npcData.followSortingMap = followSortingMap.followSortingMap;
                if (!npcData.followSortingMap && followSortingMap.GetSortingMap() != null)
                {
                    if (followSortingMap.GetSortingMap().GetComponent <ConstantID>() != null)
                    {
                        npcData.customSortingMapID = followSortingMap.GetSortingMap().GetComponent <ConstantID>().constantID;
                    }
                    else
                    {
                        ACDebug.LogWarning("The NPC " + gameObject.name + "'s SortingMap, " + followSortingMap.GetSortingMap().name + ", was not saved because it has no Constant ID");
                        npcData.customSortingMapID = 0;
                    }
                }
                else
                {
                    npcData.customSortingMapID = 0;
                }
            }
            else
            {
                npcData.followSortingMap   = false;
                npcData.customSortingMapID = 0;
            }

            return(npcData);
        }
コード例 #6
0
ファイル: LevelStorage.cs プロジェクト: Keraunic-Tonic/GJ2021
        private void SaveSceneData(SubScene subScene = null)
        {
            Scene scene = (subScene) ? subScene.gameObject.scene : SceneChanger.CurrentScene;

            SceneSettings  sceneSettings  = (subScene == null) ? KickStarter.sceneSettings : subScene.SceneSettings;
            LocalVariables localVariables = (subScene == null) ? KickStarter.localVariables : subScene.LocalVariables;

            List <TransformData> thisLevelTransforms = PopulateTransformData(scene);
            List <ScriptData>    thisLevelScripts    = PopulateScriptData(scene);

            SingleLevelData thisLevelData = new SingleLevelData();

            thisLevelData.sceneNumber = (subScene == null) ? SceneChanger.CurrentSceneIndex : subScene.SceneIndex;

            thisLevelData.activeLists = KickStarter.actionListManager.GetSaveData(subScene);

            if (sceneSettings)
            {
                if (sceneSettings.navMesh)
                {
                    thisLevelData.navMesh = Serializer.GetConstantID(sceneSettings.navMesh.gameObject, false);
                }
                if (sceneSettings.defaultPlayerStart)
                {
                    thisLevelData.playerStart = Serializer.GetConstantID(sceneSettings.defaultPlayerStart.gameObject, false);
                }
                if (sceneSettings.sortingMap)
                {
                    thisLevelData.sortingMap = Serializer.GetConstantID(sceneSettings.sortingMap.gameObject, false);
                }
                if (sceneSettings.cutsceneOnLoad)
                {
                    thisLevelData.onLoadCutscene = Serializer.GetConstantID(sceneSettings.cutsceneOnLoad.gameObject, false);
                }
                if (sceneSettings.cutsceneOnStart)
                {
                    thisLevelData.onStartCutscene = Serializer.GetConstantID(sceneSettings.cutsceneOnStart.gameObject, false);
                }
                if (sceneSettings.tintMap)
                {
                    thisLevelData.tintMap = Serializer.GetConstantID(sceneSettings.tintMap.gameObject, false);
                }
            }

            if (localVariables)
            {
                thisLevelData.localVariablesData = SaveSystem.CreateVariablesData(localVariables.localVars, false, VariableLocation.Local);
            }
            thisLevelData.allTransformData = thisLevelTransforms;
            thisLevelData.allScriptData    = thisLevelScripts;

            if (allLevelData == null)
            {
                allLevelData = new List <SingleLevelData>();
            }
            for (int i = 0; i < allLevelData.Count; i++)
            {
                if (allLevelData[i].DataMatchesScene(thisLevelData))
                {
                    allLevelData[i] = thisLevelData;
                    return;
                }
            }

            allLevelData.Add(thisLevelData);
        }
コード例 #7
0
        /**
         * <summary>Updates a PlayerData class with its own variables that need saving.</summary>
         * <param name = "playerData">The original PlayerData class</param>
         * <returns>The updated PlayerData class</returns>
         */
        public PlayerData SaveData(PlayerData playerData)
        {
            playerData.playerID = ID;

            playerData.playerLocX = transform.position.x;
            playerData.playerLocY = transform.position.y;
            playerData.playerLocZ = transform.position.z;
            playerData.playerRotY = TransformRotation.eulerAngles.y;

            playerData.inCustomCharState = (charState == CharState.Custom && GetAnimator() != null && GetAnimator().GetComponent <RememberAnimator>());

            playerData.playerWalkSpeed = walkSpeedScale;
            playerData.playerRunSpeed  = runSpeedScale;

            playerData.playerUpLock      = upMovementLocked;
            playerData.playerDownLock    = downMovementLocked;
            playerData.playerLeftlock    = leftMovementLocked;
            playerData.playerRightLock   = rightMovementLocked;
            playerData.playerRunLock     = (int)runningLocked;
            playerData.playerFreeAimLock = freeAimLocked;

            // Animation clips
            playerData = GetAnimEngine().SavePlayerData(playerData, this);

            // Sound
            playerData.playerWalkSound = AssetLoader.GetAssetInstanceID(walkSound);
            playerData.playerRunSound  = AssetLoader.GetAssetInstanceID(runSound);

            // Portrait graphic
            playerData.playerPortraitGraphic = AssetLoader.GetAssetInstanceID(portraitIcon.texture);

            // Speech label
            playerData.playerSpeechLabel   = GetName();
            playerData.playerDisplayLineID = displayLineID;

            // Rendering
            playerData.playerLockDirection = lockDirection;
            playerData.playerLockScale     = lockScale;
            if (spriteChild && spriteChild.GetComponent <FollowSortingMap>())
            {
                playerData.playerLockSorting = spriteChild.GetComponent <FollowSortingMap>().lockSorting;
            }
            else if (GetComponent <FollowSortingMap>())
            {
                playerData.playerLockSorting = GetComponent <FollowSortingMap>().lockSorting;
            }
            else
            {
                playerData.playerLockSorting = false;
            }

            playerData.playerSpriteDirection = GetSpriteDirectionToSave();

            playerData.playerSpriteScale = spriteScale;
            if (spriteChild && spriteChild.GetComponent <Renderer>())
            {
                playerData.playerSortingOrder = spriteChild.GetComponent <Renderer>().sortingOrder;
                playerData.playerSortingLayer = spriteChild.GetComponent <Renderer>().sortingLayerName;
            }
            else if (GetComponent <Renderer>())
            {
                playerData.playerSortingOrder = GetComponent <Renderer>().sortingOrder;
                playerData.playerSortingLayer = GetComponent <Renderer>().sortingLayerName;
            }

            playerData.playerActivePath     = 0;
            playerData.lastPlayerActivePath = 0;
            if (GetPath())
            {
                playerData.playerTargetNode  = GetTargetNode();
                playerData.playerPrevNode    = GetPreviousNode();
                playerData.playerIsRunning   = isRunning;
                playerData.playerPathAffectY = activePath.affectY;

                if (GetComponent <Paths>() && GetPath() == GetComponent <Paths>())
                {
                    playerData.playerPathData   = Serializer.CreatePathData(GetComponent <Paths>());
                    playerData.playerLockedPath = false;
                }
                else
                {
                    playerData.playerPathData   = string.Empty;
                    playerData.playerActivePath = Serializer.GetConstantID(GetPath().gameObject);
                    playerData.playerLockedPath = lockedPath;
                }
            }

            if (GetLastPath())
            {
                playerData.lastPlayerTargetNode = GetLastTargetNode();
                playerData.lastPlayerPrevNode   = GetLastPrevNode();
                playerData.lastPlayerActivePath = Serializer.GetConstantID(GetLastPath().gameObject);
            }

            playerData.playerIgnoreGravity = ignoreGravity;

            // Head target
            playerData.playerLockHotspotHeadTurning = lockHotspotHeadTurning;
            if (headFacing == HeadFacing.Manual && headTurnTarget != null)
            {
                playerData.isHeadTurning = true;
                playerData.headTargetID  = Serializer.GetConstantID(headTurnTarget);
                if (playerData.headTargetID == 0)
                {
                    ACDebug.LogWarning("The Player's head-turning target Transform, " + headTurnTarget + ", was not saved because it has no Constant ID", gameObject);
                }
                playerData.headTargetX = headTurnTargetOffset.x;
                playerData.headTargetY = headTurnTargetOffset.y;
                playerData.headTargetZ = headTurnTargetOffset.z;
            }
            else
            {
                playerData.isHeadTurning = false;
                playerData.headTargetID  = 0;
                playerData.headTargetX   = 0f;
                playerData.headTargetY   = 0f;
                playerData.headTargetZ   = 0f;
            }

            FollowSortingMap followSortingMap = GetComponentInChildren <FollowSortingMap>();

            if (followSortingMap != null)
            {
                playerData.followSortingMap = followSortingMap.followSortingMap;
                if (!playerData.followSortingMap && followSortingMap.GetSortingMap() != null)
                {
                    if (followSortingMap.GetSortingMap().GetComponent <ConstantID>() != null)
                    {
                        playerData.customSortingMapID = followSortingMap.GetSortingMap().GetComponent <ConstantID>().constantID;
                    }
                    else
                    {
                        ACDebug.LogWarning("The Player's SortingMap, " + followSortingMap.GetSortingMap().name + ", was not saved because it has no Constant ID", gameObject);
                        playerData.customSortingMapID = 0;
                    }
                }
                else
                {
                    playerData.customSortingMapID = 0;
                }
            }
            else
            {
                playerData.followSortingMap   = false;
                playerData.customSortingMapID = 0;
            }

            // Inactive Player follow
            if (followTarget != null && !IsActivePlayer())
            {
                if (!followTargetIsPlayer)
                {
                    if (followTarget.GetComponent <ConstantID> ())
                    {
                        playerData.followTargetID        = followTarget.GetComponent <ConstantID> ().constantID;
                        playerData.followTargetIsPlayer  = followTargetIsPlayer;
                        playerData.followFrequency       = followFrequency;
                        playerData.followDistance        = followDistance;
                        playerData.followDistanceMax     = followDistanceMax;
                        playerData.followFaceWhenIdle    = followFaceWhenIdle;
                        playerData.followRandomDirection = followRandomDirection;
                    }
                    else
                    {
                        ACDebug.LogWarning("Want to save follow data for " + name + " but " + followTarget.name + " has no ID!", gameObject);
                    }
                }
                else
                {
                    playerData.followTargetID        = 0;
                    playerData.followTargetIsPlayer  = followTargetIsPlayer;
                    playerData.followFrequency       = followFrequency;
                    playerData.followDistance        = followDistance;
                    playerData.followDistanceMax     = followDistanceMax;
                    playerData.followFaceWhenIdle    = followFaceWhenIdle;
                    playerData.followRandomDirection = followRandomDirection;
                }
            }
            else
            {
                playerData.followTargetID        = 0;
                playerData.followTargetIsPlayer  = false;
                playerData.followFrequency       = 0f;
                playerData.followDistance        = 0f;
                playerData.followDistanceMax     = 0f;
                playerData.followFaceWhenIdle    = false;
                playerData.followRandomDirection = false;
            }

            playerData.leftHandIKState  = LeftHandIKController.CreateSaveData();
            playerData.rightHandIKState = RightHandIKController.CreateSaveData();

            playerData.spriteDirectionData = spriteDirectionData.SaveData();

            // Remember scripts
            if (!IsLocalPlayer() && gameObject.activeInHierarchy)
            {
                playerData = KickStarter.levelStorage.SavePlayerData(this, playerData);
            }

            return(playerData);
        }