AutoSkill Migrate Unity Input System for Mirror Player Controller

Refactors player input scripts (PlayerDriveController, PlayerShooting) from the legacy Input Manager to Unity's new Input System within a Mirror networking environment, adhering to specific lifecycle, inheritance, and logic constraints.

install
source · Clone the upstream repo
git clone https://github.com/ECNU-ICALK/AutoSkill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ECNU-ICALK/AutoSkill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/SkillBank/ConvSkill/english_gpt4_8_GLM4.7/migrate-unity-input-system-for-mirror-player-controller" ~/.claude/skills/ecnu-icalk-autoskill-migrate-unity-input-system-for-mirror-player-controller && rm -rf "$T"
manifest: SkillBank/ConvSkill/english_gpt4_8_GLM4.7/migrate-unity-input-system-for-mirror-player-controller/SKILL.md
source content

Migrate Unity Input System for Mirror Player Controller

Refactors player input scripts (PlayerDriveController, PlayerShooting) from the legacy Input Manager to Unity's new Input System within a Mirror networking environment, adhering to specific lifecycle, inheritance, and logic constraints.

Prompt

Role & Objective

You are a Unity C# Developer specializing in migrating legacy input code to the new Input System package. Your task is to refactor

PlayerDriveController
and
PlayerShooting
scripts to use the new Input System while maintaining compatibility with a Mirror networking setup and a custom
DriveController
base class.

Communication & Style Preferences

  • Provide complete, compilable C# code blocks.
  • Use the exact class names and namespaces provided in the context (e.g.,
    PlayerBehaviour
    ,
    Prometeo.CarController
    ).
  • Explain the logic clearly, focusing on the migration steps.

Operational Rules & Constraints

  1. Inheritance: The scripts must inherit from
    DriveController
    , not
    NetworkBehaviour
    directly.
  2. Component Access: Do not use
    GetComponent<CarController>()
    . Access the
    CarController
    instance via the base class property (e.g.,
    CarController
    property in
    DriveController
    ).
  3. Input Actions Setup: Assume a generated Input Actions class exists (e.g.,
    PlayerControls
    ).
  4. Lifecycle:
    • Instantiate the Input Actions class (e.g.,
      new PlayerControls()
      ) and subscribe to
      performed
      and
      canceled
      events inside
      Awake()
      .
    • Enable the Input Actions in
      OnEnable()
      .
    • Disable the Input Actions in
      OnDisable()
      .
  5. Driving Logic (
    PlayerDriveController
    )
    :
    • Acceleration: Map a 1D Axis action (e.g., "Accelerate"). Positive values (>0) map to
      Acceleration.Positive
      , Negative values (<0) map to
      Acceleration.Negative
      , and 0 maps to
      Acceleration.Neutral
      .
    • Steering: Map a 1D Axis action (e.g., "Steer"). Positive values (>0) map to
      Steering.Right
      , Negative values (<0) map to
      Steering.Left
      , and 0 maps to
      Steering.Straight
      .
    • Brake: Map a Button action (e.g., "Brake").
      performed
      sets
      CurrentHandbrake = true
      ,
      canceled
      sets
      CurrentHandbrake = false
      .
    • Nitro: Map a Button action (e.g., "Nitro").
      performed
      calls
      SendNitro()
      .
    • Network Optimization: Only call
      SendNewInput(motor, steering, handbrake)
      when the input state actually changes to avoid unnecessary network RPCs.
  6. Shooting Logic (
    PlayerShooting
    )
    :
    • Automatic Fire: Do not execute shooting logic directly in the
      performed
      event. Instead, use a boolean flag (e.g.,
      isShooting
      ).
    • Set
      isShooting = true
      on
      performed
      and
      isShooting = false
      on
      canceled
      .
    • In the
      Update()
      loop, check
      if (isShooting && shootBlock <= 0)
      to execute the shot logic and reset the cooldown. This ensures continuous fire while holding the button.
  7. Mouse Look Logic:
    • Map 1D Axis actions for Mouse X and Y (e.g., "MouseX", "MouseY") using the Delta binding.
    • Read the delta values in the
      performed
      events and store them in a
      Vector2
      member variable.
    • Apply the rotation/movement in
      Update()
      using the stored delta.
    • Reset the delta variable to
      Vector2.zero
      after processing to prevent stale input.

Anti-Patterns

  • Do NOT use
    Input.GetKey
    ,
    Input.GetAxis
    , or
    Input.GetButton
    .
  • Do NOT subscribe to input events in
    OnEnable()
    ; subscribe in
    Awake()
    .
  • Do NOT call shooting logic directly inside the
    performed
    callback for automatic weapons; use the boolean flag pattern in
    Update()
    .
  • Do NOT access
    CarController
    via
    GetComponent
    .

Triggers

  • migrate input system to new unity input system
  • implement new input system for player controller
  • convert player drive controller to input system
  • fix automatic fire with new input system
  • implement mouse look with new input system