[Player][Input] Switch to generic input consumption interface. Version package json file

This commit is contained in:
Michal Pikulski
2025-09-01 15:04:15 +02:00
parent 90782f0fb0
commit 1a5126a259
7 changed files with 743 additions and 52 deletions

View File

@@ -0,0 +1,55 @@
{
"version": 1,
"name": "PlayerTouchActions",
"maps": [
{
"name": "DefaultActionMap",
"id": "53d55b3c-f7c2-4706-a857-c615ecb16ff7",
"actions": [
{
"name": "TouchPosition",
"type": "Value",
"id": "f615672c-a395-4335-826c-d14ae764c4b5",
"expectedControlType": "Vector2",
"processors": "",
"interactions": "",
"initialStateCheck": true
},
{
"name": "TouchPress",
"type": "Button",
"id": "a77a5b0d-26e8-4b6c-b23b-828c50b3108f",
"expectedControlType": "",
"processors": "",
"interactions": "",
"initialStateCheck": false
}
],
"bindings": [
{
"name": "",
"id": "94ea85eb-4b37-460d-8b4d-518d80e63349",
"path": "<Touchscreen>/position",
"interactions": "",
"processors": "",
"groups": "",
"action": "TouchPosition",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "f3dcd77f-15e5-4621-af67-001e6b08e3e6",
"path": "<Touchscreen>/Press",
"interactions": "",
"processors": "",
"groups": "",
"action": "TouchPress",
"isComposite": false,
"isPartOfComposite": false
}
]
}
],
"controlSchemes": []
}

View File

@@ -119,6 +119,80 @@ NavMeshSettings:
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &954512633
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 954512636}
- component: {fileID: 954512635}
- component: {fileID: 954512634}
m_Layer: 0
m_Name: InputManager
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &954512634
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 954512633}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 62899f850307741f2a39c98a8b639597, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Actions: {fileID: -944628639613478452, guid: 8c9d13383e51cd0459cddd33020db763, type: 3}
m_NotificationBehavior: 3
m_DeviceLostEvent:
m_PersistentCalls:
m_Calls: []
m_DeviceRegainedEvent:
m_PersistentCalls:
m_Calls: []
m_ControlsChangedEvent:
m_PersistentCalls:
m_Calls: []
m_ActionEvents: []
m_NeverAutoSwitchControlSchemes: 0
m_DefaultControlScheme:
m_DefaultActionMap: DefaultActionMap
m_SplitScreenIndex: -1
m_Camera: {fileID: 0}
--- !u!114 &954512635
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 954512633}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: eaca18daca6d4bfd8026afb6dd5f8c61, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!4 &954512636
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 954512633}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1728894744
GameObject:
m_ObjectHideFlags: 0
@@ -22103,3 +22177,4 @@ SceneRoots:
- {fileID: 1741016590}
- {fileID: 1728894746}
- {fileID: 8865498003578620591}
- {fileID: 954512636}

View File

@@ -0,0 +1,8 @@
using UnityEngine;
public interface ITouchInputConsumer
{
void OnTouchPress(Vector2 screenPosition);
void OnTouchPosition(Vector2 screenPosition);
}

View File

@@ -0,0 +1,76 @@
using UnityEngine;
using UnityEngine.InputSystem;
using System;
public class InputManager : MonoBehaviour
{
public static InputManager Instance { get; private set; }
private PlayerInput playerInput;
private InputAction touchPressAction;
private InputAction touchPositionAction;
private ITouchInputConsumer defaultConsumer;
void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
playerInput = GetComponent<PlayerInput>();
if (playerInput == null)
{
Debug.LogError("InputManager requires a PlayerInput component attached to the same GameObject.");
return;
}
// Find actions by name in the assigned action map
touchPressAction = playerInput.actions.FindAction("TouchPress", false);
touchPositionAction = playerInput.actions.FindAction("TouchPosition", false);
}
void OnEnable()
{
if (touchPressAction != null)
touchPressAction.performed += OnTouchPressPerformed;
if (touchPositionAction != null)
touchPositionAction.performed += OnTouchPositionPerformed;
}
void OnDisable()
{
if (touchPressAction != null)
touchPressAction.performed -= OnTouchPressPerformed;
if (touchPositionAction != null)
touchPositionAction.performed -= OnTouchPositionPerformed;
}
public void SetDefaultConsumer(ITouchInputConsumer consumer)
{
defaultConsumer = consumer;
}
private void OnTouchPressPerformed(InputAction.CallbackContext ctx)
{
// For button actions, you may want to use InputValue or just handle the event
// If you need position, you can read it from touchPositionAction
Vector3 _screenPos = Camera.main.ScreenToWorldPoint(touchPositionAction.ReadValue<Vector2>());
Vector2 screenPos = new Vector2(_screenPos.x, _screenPos.y);
if (!TryDelegateToInteractable(screenPos))
defaultConsumer?.OnTouchPress(screenPos);
}
private void OnTouchPositionPerformed(InputAction.CallbackContext ctx)
{
Vector2 pos = ctx.ReadValue<Vector2>();
defaultConsumer?.OnTouchPosition(pos);
}
private bool TryDelegateToInteractable(Vector2 screenPos)
{
// TODO: Raycast logic to find ITouchInputConsumer at screenPos
// For now, always return false (no interactable found)
return false;
}
}

View File

@@ -5,7 +5,7 @@ using UnityEngine.InputSystem;
// Basic touch/mouse movement controller suitable for top-down 2D or 3D overworld
// Attach to the player GameObject. Works with or without Rigidbody/Rigidbody2D.
public class PlayerTouchController : MonoBehaviour
public class PlayerTouchController : MonoBehaviour, ITouchInputConsumer
{
public float moveSpeed = 5f;
public float stopDistance = 0.1f;
@@ -32,64 +32,40 @@ public class PlayerTouchController : MonoBehaviour
hasTarget = false;
}
void Update()
void OnEnable()
{
InputManager.Instance?.SetDefaultConsumer(this);
}
// Remove Update and HandleInput
public void OnTouchPress(Vector2 worldPosition)
{
Debug.Log($"PlayerTouchController.OnTouchPress received worldPosition: {worldPosition}");
SetTargetPosition(worldPosition);
}
public void OnTouchPosition(Vector2 screenPosition)
{
Debug.Log($"PlayerTouchController.OnTouchPosition called with screenPosition: {screenPosition}");
// Optionally handle drag/move here
}
void SetTargetPosition(Vector2 worldPosition)
{
Debug.Log($"PlayerTouchController.SetTargetPosition: worldPosition={worldPosition}");
targetPosition = new Vector3(worldPosition.x, worldPosition.y, transform.position.z);
hasTarget = true;
}
void FixedUpdate()
{
HandleInput();
if (hasTarget)
{
MoveTowardsTarget();
}
}
void HandleInput()
{
#if ENABLE_INPUT_SYSTEM
// Using the new Unity Input System (InputSystem package) only.
// Touch input (mobile)
if (Touchscreen.current != null && Touchscreen.current.touches.Count > 0)
{
var touch = Touchscreen.current.touches[0];
// press indicates the touch is down; use position even while moved/held
if (touch.press != null && touch.press.isPressed)
{
Vector2 pos = touch.position.ReadValue();
SetTargetFromScreenPoint(new Vector3(pos.x, pos.y, 0f));
return;
}
}
// Mouse support (Editor/PC)
if (Mouse.current != null && Mouse.current.leftButton != null && Mouse.current.leftButton.isPressed)
{
Vector2 mpos = Mouse.current.position.ReadValue();
SetTargetFromScreenPoint(new Vector3(mpos.x, mpos.y, 0f));
}
#else
// Input System package not yet enabled/installed. Provide a helpful runtime message.
// This branch ensures the script compiles until the package is installed and Player Settings are set.
if (Application.isPlaying)
{
Debug.LogError("PlayerTouchController: New Input System is not enabled. Install 'com.unity.inputsystem' and set Active Input Handling to 'Input System Package' (or Both) in Player Settings, then restart the Editor.");
}
#endif
}
void SetTargetFromScreenPoint(Vector3 screenPoint)
{
Camera cam = Camera.main;
if (cam == null)
{
Debug.LogWarning("PlayerTouchController: No Camera.main found.");
return;
}
// Convert screen point to world point at the player's depth
Vector3 worldPoint = cam.ScreenToWorldPoint(new Vector3(screenPoint.x, screenPoint.y, cam.WorldToScreenPoint(transform.position).z));
// For 2D top-down games using orthographic camera, z will be player's z already.
targetPosition = worldPoint;
hasTarget = true;
}
void MoveTowardsTarget()
{
// Keep original y (or z for 2D) depending on scene setup. We assume the player moves on the plane defined by its current transform.