diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
index a29ea4cbbb..68766789e0 100644
--- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
+++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
@@ -29,6 +29,12 @@ namespace osu.Game.Rulesets.Objects.Drawables
         /// </summary>
         public virtual Color4 AccentColour { get; set; } = Color4.Gray;
 
+        // Todo: Rulesets should be overriding the resources instead, but we need to figure out where/when to apply overrides first
+        protected virtual string SampleNamespace => null;
+
+        protected List<SampleChannel> Samples = new List<SampleChannel>();
+        protected virtual IEnumerable<SampleInfo> GetSamples() => HitObject.Samples;
+
         private List<DrawableHitObject> nestedHitObjects;
         public IReadOnlyList<DrawableHitObject> NestedHitObjects => nestedHitObjects;
 
@@ -70,6 +76,35 @@ namespace osu.Game.Rulesets.Objects.Drawables
             HitObject = hitObject;
         }
 
+        [BackgroundDependencyLoader]
+        private void load(AudioManager audio)
+        {
+            var samples = GetSamples();
+            if (samples.Any())
+            {
+                if (HitObject.SampleControlPoint == null)
+                    throw new ArgumentNullException(nameof(HitObject.SampleControlPoint), $"{nameof(HitObject)}s must always have an attached {nameof(HitObject.SampleControlPoint)}."
+                                                                                          + $" This is an indication that {nameof(HitObject.ApplyDefaults)} has not been invoked on {this}.");
+
+                foreach (SampleInfo s in samples)
+                {
+                    SampleInfo localSampleInfo = new SampleInfo
+                    {
+                        Bank = s.Bank ?? HitObject.SampleControlPoint.SampleBank,
+                        Name = s.Name,
+                        Volume = s.Volume > 0 ? s.Volume : HitObject.SampleControlPoint.SampleVolume
+                    };
+
+                    SampleChannel channel = localSampleInfo.GetChannel(audio.Sample, SampleNamespace);
+
+                    if (channel == null)
+                        continue;
+
+                    Samples.Add(channel);
+                }
+            }
+        }
+
         protected override void LoadComplete()
         {
             base.LoadComplete();
@@ -80,6 +115,9 @@ namespace osu.Game.Rulesets.Objects.Drawables
 
                 // apply any custom state overrides
                 ApplyCustomUpdateState?.Invoke(this, state);
+
+                if (State == ArmedState.Hit)
+                    PlaySamples();
             };
 
             State.TriggerChange();
@@ -92,6 +130,8 @@ namespace osu.Game.Rulesets.Objects.Drawables
         /// </summary>
         public event Action<DrawableHitObject, ArmedState> ApplyCustomUpdateState;
 
+        protected void PlaySamples() => Samples.ForEach(s => s?.Play());
+
         protected override void Update()
         {
             base.Update();
@@ -208,58 +248,10 @@ namespace osu.Game.Rulesets.Objects.Drawables
     {
         public new readonly TObject HitObject;
 
-        protected List<SampleChannel> Samples = new List<SampleChannel>();
-        protected virtual IEnumerable<SampleInfo> GetSamples() => HitObject.Samples;
-
-        // Todo: Rulesets should be overriding the resources instead, but we need to figure out where/when to apply overrides first
-        protected virtual string SampleNamespace => null;
-
         protected DrawableHitObject(TObject hitObject)
             : base(hitObject)
         {
             HitObject = hitObject;
         }
-
-        [BackgroundDependencyLoader]
-        private void load(AudioManager audio)
-        {
-            var samples = GetSamples();
-            if (samples.Any())
-            {
-                if (HitObject.SampleControlPoint == null)
-                    throw new ArgumentNullException(nameof(HitObject.SampleControlPoint), $"{nameof(HitObject)}s must always have an attached {nameof(HitObject.SampleControlPoint)}."
-                                                                                          + $" This is an indication that {nameof(HitObject.ApplyDefaults)} has not been invoked on {this}.");
-
-                foreach (SampleInfo s in samples)
-                {
-                    SampleInfo localSampleInfo = new SampleInfo
-                    {
-                        Bank = s.Bank ?? HitObject.SampleControlPoint.SampleBank,
-                        Name = s.Name,
-                        Volume = s.Volume > 0 ? s.Volume : HitObject.SampleControlPoint.SampleVolume
-                    };
-
-                    SampleChannel channel = localSampleInfo.GetChannel(audio.Sample, SampleNamespace);
-
-                    if (channel == null)
-                        continue;
-
-                    Samples.Add(channel);
-                }
-            }
-        }
-
-        protected override void LoadComplete()
-        {
-            base.LoadComplete();
-
-            State.ValueChanged += state =>
-            {
-                if (State == ArmedState.Hit)
-                    PlaySamples();
-            };
-        }
-
-        protected void PlaySamples() => Samples.ForEach(s => s?.Play());
     }
 }