Changelog
All notable changes to this package will be documented in this file.
[2.0.0] - 2022-06-14
This new major version focuses on consistency and extensibility. As such, all the public APIs has been reviewed and refactored to make them easier to understand and use and harder to misuse. We are also exposing a lot of the internals so that users can create low-level visitors.
This release also marks a change in how we generate property bags for IL2CPP platforms. Previously, we were using IL Post Processors to generate property bags; we have now switched to using Source Generators. In order to ensure that the impact on compilation and domain reload are as minimal as possible, code generation now requires an assembly to be tagged with the GeneratePropertyBagsForAssembly attribute.
Changed
- Updated minimum Unity version to
2021.3. - Updated
com.unity.test-framework.performanceto version2.8.0. - Removed dependency on
com.unity.nuget.mono-cecil. Changed the property bag generation from IL Post Processors to Source Generators. Assemblies now have to opt-in code generation by tagging the assembly with the
[GeneraPropertyBagsForAssembly]attribute.Breaking change
PropertyBagandPropertyhave been refactored for consistency and to provide more extensibility.IPropertyBag<T>.GetPropertiesnow returns aPropertyCollection<T>instead of anIEnumerable<IProperty<T>>. ThePropertyCollection<T>struct can be used to enumerate properties with no allocations in common cases.- Added a
IPropertyBag<T>.GetPropertiesoverload that does not require an instance. This overload can only support cached properties. - Added
PropertyBag.GetPropertyBag(Type)andPropertyBag.GetPropertyBag<T>()API methods. - Added a
PropertyBag.Existsmethod for checking if a property bag exists for a given type. - Added a
PropertyBag.CreateInstancemethod which allows type construction through an explicit delegate, property bag implementation or activator. IProperty<T>.TrySetValuehas been renamed toIProperty<T>.SetValue.IProperty.Visit<TValue>(PropertyVisitor, TValue)has been removed. UsePropertyContainer.Accept(IPropertyBagVisitor, TContainer)instead.
Breaking change Visitors have been refactored for consistency and to provide more extensibility.
- Added all visitor interfaces to the public API (
IPropertyBagVisitor,IPropertyVisitoretc). These can be used to write lower level and more specialized visitors. - Added a
PropertyBag.AccepWithSpecializedVisitorhelper method to dispatch to the correct visitation overload. - Visitation adapters (
IExcludeandIVisit) now pass a context object (respectivelyExcludeContextandVisitContext) instead of theIProperty. Unity.Properties.VisitStatushas been removed. Visitation adapters now requires an explicit call toContinueVisitation(equivalent ofVisitStatus.Unhandled) orContinueVisitationWithoutAdapters(equivalent ofVisitStatus.Handled) in order continue visitation.
- Added all visitor interfaces to the public API (
Breaking change The
PropertyContainerhas been refactored to increase consistency and user-friendliness.PropertyContainer.Visithas been renamed toPropertyContainer.Acceptand the parameter order has changed.- Added a
PropertyContainer.TryAcceptoverload taking aPropertyPath. - Added a
PropertyContainer.IsPathValidoverload taking astring. - Added a
VisitParametersparameter to allPropertyContainer.Acceptoverloads. PropertyContainer.GetProperty(ref object, PropertyPath)andPropertyContainer.TryGetProperty(ref object, PropertyPath)have been removed. The generic overload should now be used.PropertyContainer.GetValue<T>(ref object, string),PropertyContainer.GetValue<T>(ref object, PropertyPath),PropertyContainer.TryGetValue<T>(ref object, string, out T)andPropertyContainer.TryGetValue<T>(ref object, PropertyPath, out T)have been removed. The generic overload should now be used.PropertyContainer.SetValue<T>(ref object, string),PropertyContainer.SetValue<T>(ref object, PropertyPath, T),PropertyContainer.TrySetValue<T>(ref object, string, T)andPropertyContainer.TrySetValue<T>(ref object, PropertyPath, T)have been removed. The generic overload should now be used.PropertyContainer.IsPathValid(ref object, PropertyPath)has been removed. The generic overload should now be used.- Fixed
PropertyContainer.IsPathValidthrowing an exception when anullvalue is visited on the given path. VisitExceptionTypehas been renamed toVisitExceptionKindVisitErrorCodehas been renamed toVisitReturnCode.
Breaking change
TypeConversionhas been refactored to avoid stack overflows when trying to convert very large structs.TypeConversion.ConvertandTypeConversion.TryConvertmethods must now pass the source parameter as aref.TypeConversion.ConvertDelegatehas been renamed toTypeConversion.TypeConverternow passes the source parameters byref.TypeConversionprimitive converters now perform a direct C# cast instead of clamping.
Breaking change
PropertyPathwas heavily refactored and is now an immutable struct.PropertyPath.PartsCounthas been renamed toPropertyPath.Length.PropertyPath.Emptyhas been renamed toPropertyPath.IsEmpty.PropertyPath.PopParthas been renamed toPropertyPath.Popand was changed from an instance method to a static method.PropertyPath.AppendPathoverloads has been renamed toPropertyPath.Combineand were changed from instance to static methods.PropertyPath.AppendPart,PropertyPath.AppendName,PropertyPath.AppendIndex,PropertyPath.AppendKeyandPropertyPath.AppendPropertywere changed from instance to static methods.PropertyPath.Parthas been renamed toPropertyPathPart.PropertyPath.PartTypehas been renamed toPropertyPathPartKind.
Breaking change
TypeConstructionhas been merged intoUnity.Properties.TypeUtilityand is now partly available at runtime.TypeConstruction.UnsetExplicitConstructionMethodandTypeConstruction.TryUnsetExplicitConstructionMethodhas been removed.GetAllConstructableTypeshas been removed. It is now available through thecom.unity.properties.uipackage.CanBeConstructedFromDerivedTypehas been removed. It is now available through thecom.unity.properties.uipackage.- Fixed type conversion issues for
Nullabletypes.
Breaking change
TypeUtilityhas been moved fromUnity.Properties.EditortoUnity.Propertiesand is now available at runtime.Breaking change The
GeneratePropertyBagsInEditorAttributehas been removed.Breaking change The
AOThelpers have been removed in Unity 2022.1 and newer versions.
Added
- Added a
PathVisitorbase class allowing to run the visitor at a specificPropertyPath. - Added a
ConcreteTypeVisitorbase class allowing to receive a strongly-typed callback for a given container instance. - Added a
TypeTraitsutility class.
Removed
- Removed the global conversion between
Vector2andvector2Int. - Removed the global conversion between
Vector3andvector3Int. - Removed the
AnimationCurveandKeyFrametypes from the default property bags. - Removed internal usage of the
UNITY_DOTSRUNTIMEdefine.
Fixed
- Fixed an issue where converting from
objectto aUnityEngine.Objectwould cause a stack overflow.
[1.8.3] - 2022-02-01
Fixed
- Changed internal usage of the
UNITY_DOTSPLAYERdefine toUNITY_DOTSRUNTIME.
[1.8.2] - 2022-01-24
Fixed
- Fix nullable enum types for Unity
2021.2and up.
[1.8.0] - 2022-01-17
Changed
- Update Unity to version '2020.3'.
[1.7.2] - 2022-01-17
Fixed
- Fix
BadImageFormatExceptionwhen running Unity.Properties.CodeGen.
[1.7.1] - 2021-08-05
Fixed
TypeConversionprimitive converters now perform a direct C# cast instead of clamping.
[1.7.0] - 2021-02-26
Added
- Added overloads to
TypeConversion.ConvertandTypeConversion.TryConvertto pass the source as arefto avoid creating copies during conversion.
[1.6.0] - 2020-10-07
Changed
- Updated minimum Unity version to
2020.1. - Update
com.unity.test-framework.performanceto version2.3.1-preview.
Fixed
- CodeGen: Fixed cross assembly base type references.
[1.5.0] - 2020-08-21
Changed
- Enabled minimal support for
NET_DOTS.Property,PropertyBagandPropertyContainer.Visitare now available.
[1.4.3] - 2020-08-04
Fixed
- Fixed error logged during visitation when nested visitation contains the same property path.
- CodeGen: Fixed exception thrown when trying to generate property bags for anonymous types.
[1.4.2] - 2020-08-04
Fixed
- Fixed issues where a test would fail when using IL2CPP.
Added
- Added a built-in property bag for
System.Version.
[1.4.1] - 2020-07-31
Fixed
- Fixed issues where removing an element from an array would not preserve subsequent elements.
[1.4.0] - 2020-07-30
Fixed
- Fixed error logged during visitation when nested visitation contains the same property path.
- Fixed
PropertyVisitor.VisitCollectionnot being invoked fornullcollection types.
Changed
- Update
com.unity.nuget.mono-cecilto version0.1.6-preview.2.
[1.3.1] - 2020-06-11
Fixed
TypeUtility.GetRootTypewill now returnnullwhen provided an interface type.- Fixed exception thrown when trying to generate property bags for multidimensional array types. Multidimensional arrays are not supported.
- CodeGen: Fixed exception thrown when trying to generate property bags for multidimensional array types. Multidimensional arrays are not supported.
- CodeGen: Fixed cross assembly type references for C# properties.
- CodeGen: Fixed issue when initializing attributes for private members of base types.
[1.3.0] - 2020-05-13
Added
- Added a utility class around
System.Type.
Fixed
PropertyContainer.SetValuewill not throwAccessViolationExceptionwhen trying to set aread-onlyproperty.- CodeGen: Fixed invalid IL produced by open generic root types.
[1.2.0] - 2020-04-03
Fixed
- CodeGen: Fixed arrays of arrays.
- CodeGen: Fixed types with generic bases.
Added
- CodeGen: Add
GeneratePropertyBagsInEditorAttributewhich can be used to enable Editor time codegen per assembly.
[1.1.1] - 2020-03-20
Fixed
- Fixed an issue where the
PropertyVisitor.IsExcludedoverride was only being called when adapters were registered.
[1.1.0] - 2020-03-11
Fixed
- Fixed list elements incorrectly being considered as
readonlyif the list wasreadonly. - Fixed codegen not correctly registering property bags for array types.
[1.0.0] - 2020-03-02
Changed
- Breaking change Complete API overhaul, see the package documentation for details.
[0.10.3] - 2019-11-08
Fixed
- AOT Fix: Allows for registering container types with the internal generic virtual calls in Properties
[0.10.2] - 2019-11-07
Changed
- Missing type identifier key meta data in
PropertyContainer.Constructis no longer considered an error, but is still reported in result logs.
Fixed
- Calling
PropertyContainer.Transferwhen destination container have properties without setters will no longer throws.
[0.10.1] - 2019-10-29
Added
- Added a helper class to drive code generation in order to support AOT platforms.
[0.10.0] - 2019-10-25
Changed
- Breaking change
PropertyContainer.ConstructandPropertyContainer.Transferwill now return a disposableVisitResultcontaining logs, errors and exceptions that occurred during visitation.
[0.9.2] - 2019-10-21
Added
- Added support for renamed fields using
UnityEngine.Serialization.FormerlySerializedAsAttributein the transfer visitor.
[0.9.1] - 2019-10-18
Added
- Added
PropertyContainer.ConstructAPI call. This method can be used to initialize a tree using the default constructor for any uninitialized types. - Added support for instantiating
UnityEngine.ScriptableObjectderived types using theTypeConstructionutility.
Changed
PropertyContainer.Transferwill now visit the source instead of the destination when transfering.
[0.9.0] - 2019-10-06
Added
- Added
TypeConstruction.TryConstruct[...]variants for instantiating types without throwing exceptions. - Support for property drawers.
Fixed
- Attributes on a collection will now be correctly propagated to its elements.
Changed
- Connectors are now registered on the
BaseField<T>directly instead of the explicit types (i.e.IntegerField), which will help with user defined types. - Added
PropertyContainer.Visitoverload withref TVisitor. - Breaking change Changed all
IPropertyBag{T}.Acceptmethods to pass theTVisitorby ref.
[0.8.1] - 2019-09-25
Fixed
- Public fields and properties from base class will now again be reflected correctly.
[0.8.0] - 2019-09-24
Added
- Added a
TypeConstructionutility to allow the creation of new instances. - Minimal unity version has been updated to 2019.3.
- Added
PropertyElementto help with generic, property-backed UI inspectors
Fixed
- Fixed all
PropertyContainer.Try[...]methods to not throw exceptions when visiting nested types. - Fixed property bag reflection duplicates when base class contains an internal field or property.
[0.7.2] - 2019-09-12
Changed
- Exposed a default way to manually visit collection items, through
VisitCollectionElementCallback<TContainer>
Added
- Added
PropertyContainer.TryGetValueAtPathandPropertyContainer.TrySetValueAtPath, which will try to set a value for a givenPropertyPath. - Added
PropertyContainer.TryGetCountAtPathandPropertyContainer.TrySetCountAtPath, which will try to set the count of a collection for a givenPropertyPath. - Added
PropertyContainer.VisitAtPathandPropertyContainer.TryVisitAtPath, which will do a partial visitation for a givenPropertyPath.
[0.7.1] - 2019-08-29
Fixed
- Narrowing conversions between supported enum types will not throw an
InvalidCastExceptionanymore.
[0.7.0] - 2019-08-23
Fixed
- Conversion to all supported underlying type of enums should now be supported.
- Type conversion should now work on derived types.
Added
- Added
PropertyContainer.GetValueAtPathandPropertyContainer.SetValueAtPath, which will set a value for a givenPropertyPath. - Added construction of a
PropertyPathfrom a string (i.e.Path.To.The.List[1].Value).
Changed
- Breaking change
IPropertyGetterandICollectionPropertyGetterare now passed by ref during visitation.
[0.6.4] - 2019-08-15
Fixed
- Fixed property bag reflection for base class with private properties.
- Disabled generation of properties for reflected pointer fields in order to avoid casting errors.
[0.6.3] - 2019-08-06
Fixed
- Fixed
System.GuidpropertiesIsContainervalue to returnfalse. - Fixed property bag reflection for base class with private fields.
- Fixed property bag reflection for private properties.
[0.6.2] - 2019-07-29
Fixed
- Fixed property bag resolution for boxed and interface types.
[0.6.1] - 2019-07-25
Fixed
- Fixed the reflection property generator to correclty handle
IList<T>,List<T>andT[]collection types. - Fixed
ArgumentNullExceptionwhen visiting a null container.
[0.6.0] - 2019-07-19
Added
- Added
[Property]attribute which can be used on fields or C# properties. The attribute will force the reflection generator to include the member.
Changed
PropertyBagResolver.RegisterProviderhas been removed and replaced with access to a staticReflectedPropertyBagProvider.Unity.Properties.Reflectionassembly has been removed and merged withUnity.Properties.
Fixed
TypeConverterno longer warns if the source and destination types are the same.- TypeConversion of enum types will now convert based on the value and not the index.
- PropertyContainer.Transfer now ensures destination type is a reference type when not passed by ref.
- Fix generated properties for
List<string>incorrectly treating strings as container types. UnmanagedPropertycan now be generated forchartypes during reflection.
[0.5.0] - 2019-04-29
Changed
- Complete refactor of the Properties package.