Save && Load

// Save Data 저장을 위한 변수
[Serializable]
    public class EnforceData
    {
        public bool activeRestraint;
        public float increaseRestraintTime;
        public bool divinePenetrate;
        public bool divineAtkRange;
        public bool divinePoisonAdditionalDamage;
        public int divinePoisonAdditionalDamageCount;
        public bool darkSlowAdditionalDamage;
        public bool darkBleedAdditionalDamage;
        public int darkIncreaseAtkSpeed;
        public bool darkProjectilePenetration;
        public int water2IncreaseDamage;
        public bool water2BleedAdditionalRestraint;
        public int water2IncreaseSlowTime;
        public bool water2BackAttack;
        public bool water2AdditionalProjectile;
        public bool physicAdditionalWeapon;
        public bool physicIncreaseWeaponScale;
        public bool physicSlowAdditionalDamage;
        public float increasePhysicAtkSpeed;
        public bool physicIncreaseDamage;
        public float increasePhysicsDamage;
        public bool waterBurnAdditionalDamage;
        public bool waterRestraintIncreaseDamage;
        public bool waterIncreaseSlowPower;
        public float increaseWaterDamage;
        public bool waterSideAttack;
        public bool poisonDoubleAtk;
        public bool poisonRestraintAdditionalDamage;
        public bool poisonInstantKill;
        public bool poisonIncreaseAtkRange;
        public bool activatePoison;
        public int poisonOverlapping;
        public bool fireBleedingAdditionalDamage;
        public int fireIncreaseDamage;
        public bool firePoisonAdditionalStun;
        public bool fireIncreaseAtkRange;
        public bool fireDeleteBurnIncreaseDamage;
        public int physics2AdditionalBleedingLayer;
        public bool physics2ActivateBleed;
        public int physics2AdditionalAtkSpeed;
        public bool physics2AdditionalProjectile;
        public bool physics2ProjectilePenetration;
        public int addRowCount;
        public int slowCount;
        public bool diagonalMovement;
        public bool recoveryCastle;
        public float castleMaxHp;
        public int highLevelCharacterCount;
        public int selectedCount;
        public int expPercentage;
        public int permanentIncreaseMovementCount;
        public bool match5Upgrade;
        public float increaseAtkDamage;
        public float increaseAtkRate;
        public int rewardMoveCount;
        public bool addGold; 
        public int addGoldCount;
        public List<int> characterGroupLevelUpIndexes;

    }
public void SaveEnforceData()
        {
            var data = new EnforceData
            {
                activeRestraint = activeRestraint,
                increaseRestraintTime = increaseRestraintTime,
                divinePenetrate = divinePenetrate,
                divineAtkRange = divineAtkRange,
                divinePoisonAdditionalDamage = divinePoisonAdditionalDamage,
                divinePoisonAdditionalDamageCount = 
                divinePoisonAdditionalDamageCount,
                darkSlowAdditionalDamage = darkSlowAdditionalDamage,
                darkBleedAdditionalDamage = darkBleedAdditionalDamage,
                darkIncreaseAtkSpeed = darkIncreaseAtkSpeed,
                darkProjectilePenetration = darkProjectilePenetration,
                water2IncreaseDamage = water2IncreaseDamage,
                water2BleedAdditionalRestraint = water2BleedAdditionalRestraint,
                water2IncreaseSlowTime = water2IncreaseSlowTime,
                water2BackAttack = water2BackAttack,
                water2AdditionalProjectile = water2AdditionalProjectile,
                physicAdditionalWeapon = physicAdditionalWeapon,
                physicIncreaseWeaponScale = physicIncreaseWeaponScale,
                physicSlowAdditionalDamage = physicSlowAdditionalDamage,
                increasePhysicAtkSpeed = increasePhysicAtkSpeed,
                physicIncreaseDamage = physicIncreaseDamage,
                increasePhysicsDamage = increasePhysicsDamage,
                waterBurnAdditionalDamage = waterBurnAdditionalDamage,
                waterRestraintIncreaseDamage = waterRestraintIncreaseDamage,
                waterIncreaseSlowPower = waterIncreaseSlowPower,
                increaseWaterDamage = increaseWaterDamage,
                waterSideAttack = waterSideAttack,
                poisonDoubleAtk = poisonDoubleAtk,
                poisonRestraintAdditionalDamage = 
                poisonRestraintAdditionalDamage,
                poisonInstantKill = poisonInstantKill,
                poisonIncreaseAtkRange = poisonIncreaseAtkRange,
                activatePoison = activatePoison,
                poisonOverlapping = poisonOverlapping,
                fireBleedingAdditionalDamage = fireBleedingAdditionalDamage,
                fireIncreaseDamage = fireIncreaseDamage,
                firePoisonAdditionalStun = firePoisonAdditionalStun,
                fireIncreaseAtkRange = fireIncreaseAtkRange,
                fireDeleteBurnIncreaseDamage = fireDeleteBurnIncreaseDamage,
                physics2AdditionalBleedingLayer = 
                physics2AdditionalBleedingLayer,
                physics2ActivateBleed = physics2ActivateBleed,
                physics2AdditionalAtkSpeed = physics2AdditionalAtkSpeed,
                physics2AdditionalProjectile = physics2AdditionalProjectile,
                physics2ProjectilePenetration = physics2ProjectilePenetration,
                addRowCount = addRowCount,
                slowCount = slowCount,
                diagonalMovement = diagonalMovement,
                recoveryCastle = recoveryCastle,
                castleMaxHp = castleMaxHp,
                highLevelCharacterCount = highLevelCharacterCount,
                selectedCount = selectedCount,
                expPercentage = expPercentage,
                permanentIncreaseMovementCount = permanentIncreaseMovementCount,
                match5Upgrade = match5Upgrade,
                increaseAtkDamage = increaseAtkDamage,
                increaseAtkRate = increaseAtkRate,
                rewardMoveCount = rewardMoveCount,
                addGold = addGold, 
                addGoldCount = addGoldCount,
                characterGroupLevelUpIndexes = 
                characterGroupLevelUpIndexes.ToList()
            };
            var json = JsonUtility.ToJson(data);
            PlayerPrefs.SetString("EnforceData", json);
        }

        public void LoadEnforceData()
        {
            if (!PlayerPrefs.HasKey("EnforceData")) return;
            var json = PlayerPrefs.GetString("EnforceData");
            var data = JsonUtility.FromJson<EnforceData>(json);
            activeRestraint = data.activeRestraint;
            increaseRestraintTime = data.increaseRestraintTime;
            divinePenetrate = data.divinePenetrate;
            divineAtkRange = data.divineAtkRange;
            divinePoisonAdditionalDamage = data.divinePoisonAdditionalDamage;
            divinePoisonAdditionalDamageCount = 
            data.divinePoisonAdditionalDamageCount;
            darkSlowAdditionalDamage = data.darkSlowAdditionalDamage;
            darkBleedAdditionalDamage = data.darkBleedAdditionalDamage;
            darkIncreaseAtkSpeed = data.darkIncreaseAtkSpeed;
            darkProjectilePenetration = data.darkProjectilePenetration;
            water2IncreaseDamage = data.water2IncreaseDamage;
            water2BleedAdditionalRestraint = data.water2BleedAdditionalRestraint;
            water2IncreaseSlowTime = data.water2IncreaseSlowTime;
            water2BackAttack = data.water2BackAttack;
            water2AdditionalProjectile = data.water2AdditionalProjectile;
            physicAdditionalWeapon = data.physicAdditionalWeapon;
            physicIncreaseWeaponScale = data.physicIncreaseWeaponScale;
            physicSlowAdditionalDamage = data.physicSlowAdditionalDamage;
            increasePhysicAtkSpeed = data.increasePhysicAtkSpeed;
            physicIncreaseDamage = data.physicIncreaseDamage;
            increasePhysicsDamage = data.increasePhysicsDamage;
            waterBurnAdditionalDamage = data.waterBurnAdditionalDamage;
            waterRestraintIncreaseDamage = data.waterRestraintIncreaseDamage;
            waterIncreaseSlowPower = data.waterIncreaseSlowPower;
            increaseWaterDamage = data.increaseWaterDamage;
            waterSideAttack = data.waterSideAttack;
            poisonDoubleAtk = data.poisonDoubleAtk;
            poisonRestraintAdditionalDamage = 
            data.poisonRestraintAdditionalDamage;
            poisonInstantKill = data.poisonInstantKill;
            poisonIncreaseAtkRange = data.poisonIncreaseAtkRange;
            activatePoison = data.activatePoison;
            poisonOverlapping = data.poisonOverlapping;
            fireBleedingAdditionalDamage = data.fireBleedingAdditionalDamage;
            fireIncreaseDamage = data.fireIncreaseDamage;
            firePoisonAdditionalStun = data.firePoisonAdditionalStun;
            fireIncreaseAtkRange = data.fireIncreaseAtkRange;
            fireDeleteBurnIncreaseDamage = data.fireDeleteBurnIncreaseDamage;
            physics2AdditionalBleedingLayer = 
            data.physics2AdditionalBleedingLayer;
            physics2ActivateBleed = data.physics2ActivateBleed;
            physics2AdditionalAtkSpeed = data.physics2AdditionalAtkSpeed;
            physics2AdditionalProjectile = data.physics2AdditionalProjectile;
            physics2ProjectilePenetration = data.physics2ProjectilePenetration;
            addRowCount = data.addRowCount;
            slowCount = data.slowCount;
            diagonalMovement = data.diagonalMovement;
            recoveryCastle = data.recoveryCastle;
            castleMaxHp = data.castleMaxHp;
            highLevelCharacterCount = data.highLevelCharacterCount;
            selectedCount = data.selectedCount;
            expPercentage = data.expPercentage;
            permanentIncreaseMovementCount = data.permanentIncreaseMovementCount;
            match5Upgrade = data.match5Upgrade;
            increaseAtkDamage = data.increaseAtkDamage;
            increaseAtkRate = data.increaseAtkRate;
            rewardMoveCount = data.rewardMoveCount;
            addGold = data.addGold;
            addGoldCount = data.addGoldCount;
            characterGroupLevelUpIndexes = new HashSet<int>
            (data.characterGroupLevelUpIndexes);
        }                                  
    }

Data 변수와 기존 강화효과 버프를 할당하여 이를 JSON으로 String 변형 후 Load 할떄는 역으로 string값을 분해할당하여 이를 기존 Bool 및 변수에 할당하여 불러오기

아래 형식으로 저장된다.

// 강화효과 
{
"dark3FifthAttackBoost":false,
"dark3BleedAttack":false,
"dark3PoisonDamageBoost":false,
"dark3ShackledExplosion":false,
"dark3BleedDurationBoost":false,
"dark3DamageBoost":false,
"dark3RateBoost":0.0,
"darkFifthAttackDamageBoost":true,
"darkAttackSpeedBoost":0.0,
"darkAttackPowerBoost":0.0,
"darkKnockBackChance":false,
"darkStatusAilmentDamageBoost":false,
"darkRangeIncrease":false,
......
"permanentGroupIndex":[],"skillInstances":[]}