diff --git a/hmm.json b/hmm.json
index 4b2885a87..251c5c499 100644
--- a/hmm.json
+++ b/hmm.json
@@ -54,7 +54,7 @@
       "name": "haxeui-core",
       "type": "git",
       "dir": null,
-      "ref": "5b2d5b8e7e470cf637953e1369c80a1f42016a75",
+      "ref": "8a7846b",
       "url": "https://github.com/haxeui/haxeui-core"
     },
     {
diff --git a/source/funkin/data/event/SongEventSchema.hx b/source/funkin/data/event/SongEventSchema.hx
index 7ebaa5ae1..9591e601e 100644
--- a/source/funkin/data/event/SongEventSchema.hx
+++ b/source/funkin/data/event/SongEventSchema.hx
@@ -6,9 +6,14 @@ import funkin.data.song.SongData.SongEventData;
 import funkin.util.macro.ClassMacro;
 import funkin.play.event.ScriptedSongEvent;
 
-@:forward(name, tittlte, type, keys, min, max, step, defaultValue, iterator)
+@:forward(name, title, type, keys, min, max, step, units, defaultValue, iterator)
 abstract SongEventSchema(SongEventSchemaRaw)
 {
+  /**
+   * These units look better when placed immediately next to the value, rather than after a space.
+   */
+  static final NO_SPACE_UNITS:Array<String> = ['x', '°', '%'];
+
   public function new(?fields:Array<SongEventSchemaField>)
   {
     this = fields;
@@ -42,7 +47,7 @@ abstract SongEventSchema(SongEventSchemaRaw)
     return this[k] = v;
   }
 
-  public function stringifyFieldValue(name:String, value:Dynamic):String
+  public function stringifyFieldValue(name:String, value:Dynamic, addUnits:Bool = true):String
   {
     var field:SongEventSchemaField = getByName(name);
     if (field == null) return 'Unknown';
@@ -52,21 +57,36 @@ abstract SongEventSchema(SongEventSchemaRaw)
       case SongEventFieldType.STRING:
         return Std.string(value);
       case SongEventFieldType.INTEGER:
-        return Std.string(value);
+        var returnValue:String = Std.string(value);
+        if (addUnits) return addUnitsToString(returnValue, field);
+        return returnValue;
       case SongEventFieldType.FLOAT:
-        return Std.string(value);
+        var returnValue:String = Std.string(value);
+        if (addUnits) return addUnitsToString(returnValue, field);
+        return returnValue;
       case SongEventFieldType.BOOL:
         return Std.string(value);
       case SongEventFieldType.ENUM:
+        var valueString:String = Std.string(value);
         for (key in field.keys.keys())
         {
-          if (field.keys.get(key) == value) return key;
+          // Comparing these values as strings because comparing Dynamic variables is jank.
+          if (Std.string(field.keys.get(key)) == valueString) return key;
         }
-        return Std.string(value);
+        return valueString;
       default:
         return 'Unknown';
     }
   }
+
+  function addUnitsToString(value:String, field:SongEventSchemaField)
+  {
+    if (field.units == null || field.units == '') return value;
+
+    var unit:String = field.units;
+
+    return value + (NO_SPACE_UNITS.contains(unit) ? '' : ' ') + '${unit}';
+  }
 }
 
 typedef SongEventSchemaRaw = Array<SongEventSchemaField>;
@@ -115,6 +135,12 @@ typedef SongEventSchemaField =
    */
   ?step:Float,
 
+  /**
+   * Used for INTEGER and FLOAT values.
+   * The units that the value is expressed in (pixels, percent, etc).
+   */
+  ?units:String,
+
   /**
    * An optional default value for the field.
    */
diff --git a/source/funkin/play/event/FocusCameraSongEvent.hx b/source/funkin/play/event/FocusCameraSongEvent.hx
index 83c978ba8..847df4a60 100644
--- a/source/funkin/play/event/FocusCameraSongEvent.hx
+++ b/source/funkin/play/event/FocusCameraSongEvent.hx
@@ -135,10 +135,10 @@ class FocusCameraSongEvent extends SongEvent
     return new SongEventSchema([
       {
         name: "char",
-        title: "Character",
+        title: "Target",
         defaultValue: 0,
         type: SongEventFieldType.ENUM,
-        keys: ["Position" => -1, "Boyfriend" => 0, "Dad" => 1, "Girlfriend" => 2]
+        keys: ["Position" => -1, "Player" => 0, "Opponent" => 1, "Girlfriend" => 2]
       },
       {
         name: "x",
@@ -146,6 +146,7 @@ class FocusCameraSongEvent extends SongEvent
         defaultValue: 0,
         step: 10.0,
         type: SongEventFieldType.FLOAT,
+        units: "px"
       },
       {
         name: "y",
@@ -153,6 +154,7 @@ class FocusCameraSongEvent extends SongEvent
         defaultValue: 0,
         step: 10.0,
         type: SongEventFieldType.FLOAT,
+        units: "px"
       }
     ]);
   }
diff --git a/source/funkin/play/event/SetCameraBopSongEvent.hx b/source/funkin/play/event/SetCameraBopSongEvent.hx
index d0e01346f..a82577a5f 100644
--- a/source/funkin/play/event/SetCameraBopSongEvent.hx
+++ b/source/funkin/play/event/SetCameraBopSongEvent.hx
@@ -78,14 +78,16 @@ class SetCameraBopSongEvent extends SongEvent
         title: 'Intensity',
         defaultValue: 1.0,
         step: 0.1,
-        type: SongEventFieldType.FLOAT
+        type: SongEventFieldType.FLOAT,
+        units: 'x'
       },
       {
         name: 'rate',
-        title: 'Rate (beats/zoom)',
+        title: 'Rate',
         defaultValue: 4,
         step: 1,
         type: SongEventFieldType.INTEGER,
+        units: 'beats/zoom'
       }
     ]);
   }
diff --git a/source/funkin/play/event/ZoomCameraSongEvent.hx b/source/funkin/play/event/ZoomCameraSongEvent.hx
index a35a12e1e..809130499 100644
--- a/source/funkin/play/event/ZoomCameraSongEvent.hx
+++ b/source/funkin/play/event/ZoomCameraSongEvent.hx
@@ -106,14 +106,16 @@ class ZoomCameraSongEvent extends SongEvent
         title: 'Zoom Level',
         defaultValue: 1.0,
         step: 0.1,
-        type: SongEventFieldType.FLOAT
+        type: SongEventFieldType.FLOAT,
+        units: 'x'
       },
       {
         name: 'duration',
-        title: 'Duration (in steps)',
+        title: 'Duration',
         defaultValue: 4.0,
         step: 0.5,
         type: SongEventFieldType.FLOAT,
+        units: 'steps'
       },
       {
         name: 'ease',
diff --git a/source/funkin/ui/debug/charting/toolboxes/ChartEditorEventDataToolbox.hx b/source/funkin/ui/debug/charting/toolboxes/ChartEditorEventDataToolbox.hx
index fbd1562b4..7b163ad3d 100644
--- a/source/funkin/ui/debug/charting/toolboxes/ChartEditorEventDataToolbox.hx
+++ b/source/funkin/ui/debug/charting/toolboxes/ChartEditorEventDataToolbox.hx
@@ -18,6 +18,7 @@ import haxe.ui.core.Component;
 import funkin.data.event.SongEventRegistry;
 import haxe.ui.components.TextField;
 import haxe.ui.containers.Box;
+import haxe.ui.containers.HBox;
 import haxe.ui.containers.Frame;
 import haxe.ui.events.UIEvent;
 import haxe.ui.data.ArrayDataSource;
@@ -214,7 +215,20 @@ class ChartEditorEventDataToolbox extends ChartEditorBaseToolbox
           input.text = field.type;
       }
 
-      target.addComponent(input);
+      // Putting in a box so we can add a unit label easily if there is one.
+      var inputBox:HBox = new HBox();
+      inputBox.addComponent(input);
+
+      // Add a unit label if applicable.
+      if (field.units != null && field.units != "")
+      {
+        var units:Label = new Label();
+        units.text = field.units;
+        units.verticalAlign = "center";
+        inputBox.addComponent(units);
+      }
+
+      target.addComponent(inputBox);
 
       // Update the value of the event data.
       input.onChange = function(event:UIEvent) {