Remove redundancies in similar properties I have a lot of redundancy here, but I am not sure how could I make it look shorter.
namespace Notan
{
    public class EquipmentSystem : ScriptableObject
    {
        public UnityEvent onUpdate = new UnityEvent();

        [SerializeField] private Weapon weapon1;
        public Weapon Weapon1
        {
            get =&gt; weapon1;
            private set
            {
                weapon1 = value;
                onUpdate?.Invoke();
            }
        }

        [SerializeField] private Weapon weapon2;
        public Weapon Weapon2
        {
            get =&gt; weapon2;
            private set
            {
                weapon2 = value;
                onUpdate?.Invoke();
            }
        }

        [SerializeField] private Accessory accessory1;
        public Accessory Accessory1
        {
            get =&gt; accessory1;
            private set
            {
                accessory1 = value;
                onUpdate?.Invoke();
            }
        }

        [SerializeField] private Accessory accessory2;
        public Accessory Accessory2
        {
            get =&gt; accessory2;
            private set
            {
                accessory2 = value;
                onUpdate?.Invoke();
            }
        }

        [SerializeField] private Shield shield;
        public Shield Shield
        {
            get =&gt; shield;
            private set
            {
                shield = value;
                onUpdate?.Invoke();
            }
        }

        [SerializeField] private Armor armor;
        public Armor Armor
        {
            get =&gt; armor;
            private set
            {
                armor = value;
                onUpdate?.Invoke();
            }
        }

    }
}
```
You could make your code less redundant through the use of a custom SourceGenerator. It could work kinda like Fody works for WPF and INotifyPropertyChanged.
Sadly I have no example to provide for the SourceGenerator's implementation because I haven't had time to toy with them yet. Though the idea is to make your SourceGenerator generate the redundant code for you at compile time whenever it detects something that you want to be autogenerated.
You have two options but both are gonna require custom attribute(s) :

Make it work like a white-list : don't autogenerate by default, autogenerate only when property is tagged with your attribute. Your property (or field) would then be reduced to
[MyAutoGenerationAttribute]
public object MyProperty { get; set; }


Make it work like a black-list (like Fody does) : always autogenerate by default, don't autogenerate when property is tagged with your attribute.


I'm not really familiar with Unity but my only concern is that this solution may not be compatible with Unity's shenanigans, especially since SourceGenerators is a fairly new feature.
PS : If optimization matters I recommend you edit your setters so that the event gets raised only when the value of the property changes for real (ex: by wrapping the setter with something like if (myBackingField != value))