Unity Scriptable Object Assigned value not updated in runtime

52 Views Asked by At

I'm using a scriptable object as my units database, and each unit has it's own UnitStats script to load stats from the database in Start() method. It works all fine until today when I make changes to variables in the scriptable data, the variables loaded in UnitStats script are unchanged. For example, the original maxHP in scriptable data is 100, I run, UnitStats load maxHP = 100, then I change maxHP to 110 in the scriptable data, I run, UnitStats maxHP is still 100.

I tried saving the project, committing changes to Unity version control, restarting Unity, maxHP in the scriptable object remains 110 but the loaded value in UnitStats is still 100.

Here's my UnitStats script:

using System.Collections.Generic;
using UnityEngine;


public class UnitStats : MonoBehaviour
{
    [HideInInspector]
    public string unitName;
    [HideInInspector]
    public float attackRange;
    [HideInInspector]
    public float movementSpeed;
    [HideInInspector]
    public int maxHP;
    [HideInInspector]
    public int currentHP;
    [HideInInspector]
    public string type;
    [HideInInspector]
    public float attackInterval; 
    [HideInInspector]
    public int priority;
    [HideInInspector]
    public int dpa;
    //[HideInInspector]
    public int searchRange;
    [SerializeField] UnitDatabaseSO unitDatabase;
    [SerializeField] int ID;
    public Dictionary<GameObject, int> abilities;
    private UnitData unitData;
    [HideInInspector]
    public bool loaded;
    [HideInInspector]
    public float damageTime;
    [HideInInspector]
    public bool ranged;
    [HideInInspector]
    public float buildTime;
    [HideInInspector]
    public Sprite spriteIcon;
    [HideInInspector]
    public int visionRange;
    [HideInInspector]
    public int bloodDrop;
    [HideInInspector]
    public int bloodCost;
    [HideInInspector]
    public string description;
    [HideInInspector]
    public bool isWorker;
    [HideInInspector]
    public int MaxBloodPool;
    [HideInInspector]
    public int bloodAmount;
    [HideInInspector]
    public float height;

    void Start(){
        if(!loaded){
            unitData = unitDatabase.objectsData[ID];
            unitName = unitData.Name;
            attackRange = unitData.AttackRange;
            movementSpeed = unitData.MovementSpeed;
            maxHP = unitData.maxHP;
            currentHP = maxHP;
            type = unitData.Type;
            attackInterval = unitData.AttackInerval;
            priority = unitData.Priority;
            dpa = unitData.DPH;
            searchRange = unitData.SearchRange;
            damageTime = unitData.DamageTime;
            ranged = unitData.ranged;
            spriteIcon = unitData.SpriteIcon;
            buildTime = unitData.buildTime;
            visionRange = unitData.VisionRange;
            bloodDrop = unitData.BloodDrop;
            bloodCost = unitData.BloodCost;
            description = unitData.Description;
            isWorker = unitData.IsWorker;
            MaxBloodPool = unitData.MaxBloodPool;
            bloodAmount = 0;
            height = unitData.height;
            loaded = true;
        }
        HPBarManager.instance.CreateHPBar(transform, currentHP/maxHP);
    }

    public void AssignID(int ID){
        this.ID = ID;
    }
    public void ReceiveDmg(GameObject source, int damage){
        currentHP -= damage;
        if(currentHP <= 0){
            GetComponent<UnitStateMachine>().TransitState(UnitStateMachine.Unitstate.Dead);
            return;
        }
        HPBarManager.instance.UpdateHPBar(transform, currentHP/maxHP);
    }


    public void GainHP(int heal){
        if(currentHP + heal >= maxHP){
            currentHP = maxHP;
        }else{
            currentHP += heal;
        }
        HPBarManager.instance.UpdateHPBar(transform, currentHP/maxHP);
    }

    public bool IsDead(){
        return currentHP <= 0;
    }

    public int GetID(){
        return ID;
    }
}
0

There are 0 best solutions below