У меня есть код для моего обработчика ввода:
Код: Выделить всё
[Header("Input Action Asset")]
[SerializeField] private InputActionAsset playerControls;
[Header("Action Map Name References")]
[SerializeField] private string actionMapName = "Gameplay";
private InputAction moveAction;
private InputAction lookAction;
private InputAction jumpAction;
private InputAction sprintAction;
private InputAction interactAction;
private InputAction shootAction;
public Vector2 MoveInput { get; private set; }
public Vector2 LookInput { get; private set; }
public bool JumpTriggered { get; private set; }
public float SprintValue { get; private set; }
public bool InteractTriggered { get; private set; }
public bool ShootTriggered { get; private set; }
public static PlayerInputHandler instance { get; private set; }
private void Awake()
{
if(instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
moveAction = playerControls.FindActionMap(actionMapName).FindAction("Move");
lookAction = playerControls.FindActionMap(actionMapName).FindAction("Look");
jumpAction = playerControls.FindActionMap(actionMapName).FindAction("Jump");
sprintAction = playerControls.FindActionMap(actionMapName).FindAction("Sprint");
interactAction =
playerControls.FindActionMap(actionMapName).FindAction("Interact");
shootAction = playerControls.FindActionMap(actionMapName).FindAction("Shoot");
RegisterInputActions();
}
private void RegisterInputActions()
{
moveAction.performed += context => MoveInput = context.ReadValue();
moveAction.canceled += context => MoveInput = Vector2.zero;
lookAction.performed += context => LookInput = context.ReadValue();
lookAction.canceled += context => LookInput = Vector2.zero;
jumpAction.performed += context => JumpTriggered = true;
jumpAction.canceled += context => JumpTriggered = false;
sprintAction.performed += context => SprintValue = context.ReadValue();
sprintAction.canceled += context => SprintValue = 0f;
interactAction.performed += context => InteractTriggered = true;
interactAction.canceled += context => InteractTriggered = false;
shootAction.performed += context => ShootTriggered = true;
shootAction.canceled += context => ShootTriggered = false;
}
private void OnEnable()
{
moveAction.Enable();
lookAction.Enable();
jumpAction.Enable();
sprintAction.Enable();
interactAction.Enable();
shootAction.Enable();
}
private void OnDisable()
{
moveAction.Disable();
lookAction.Disable();
jumpAction.Disable();
sprintAction.Disable();
interactAction.Disable();
shootAction.Disable();
}
Код: Выделить всё
[SerializeField] private float damage = 10f;
[SerializeField] private float range = 100f;
private PlayerInputHandler inputHandler;
private Camera cam;
void Start()
{
cam = Camera.main;
inputHandler = PlayerInputHandler.instance;
}
// Update is called once per frame
void Update()
{
if(inputHandler.ShootTriggered)
{
shoot();
}
}
private void shoot()
{
RaycastHit hit;
if(Physics.Raycast(cam.transform.position, cam.transform.forward, out hit, range))
{
Debug.Log(hit.transform.name);
Debug.DrawRay(cam.transform.position, cam.transform.forward * range);
Target target = hit.transform.GetComponent();
if(target != null)
{
target.TakeDamage(damage);
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... iple-times
Мобильная версия