/// <summary> /// Sets value of an attribute. Note that the out value is a copy of the struct, so modifying it /// does not modify the original attribute /// </summary> /// <param name="attribute">Attribute to set</param> /// <param name="modifierType">How to modify the attribute</param> /// <param name="value">Copy of newly modified attribute</param> /// <returns>True, if attribute was found.</returns> public bool UpdateAttributeModifiers(AttributeScriptableObject attribute, AttributeModifier modifier, out AttributeValue value) { // If dictionary is stale, rebuild it var attributeCache = GetAttributeCache(); // We use a cache to store the index of the attribute in the list, so we don't // have to iterate through it every time if (attributeCache.TryGetValue(attribute, out var index)) { // Get a copy of the attribute value struct value = AttributeValues[index]; value.Modifier = value.Modifier.Combine(modifier); // Structs are copied by value, so the modified attribute needs to be reassigned to the array AttributeValues[index] = value; return(true); } // No matching attribute found value = new AttributeValue(); return(false); }