Я пытался реализовать систему управления камерой, подобную Roblox, в единстве, но благодаря встроенному в CinemachineFreeLook сценарию InputProvider, который связан с действиями моей системы ввода, камера перемещается всякий раз, когда я просто перемещаю мышь, и не требует правой мыши кнопку, которую нужно удерживать.
Я хочу, чтобы всякий раз, когда я удерживаю правую кнопку мыши, мышь фиксировалась на месте, и перемещение мыши при удерживании правой кнопки мыши вращало камеру вокруг игрока. Я настроил орбиты в камере FreeLook.
У поставщика ввода Cinemachine есть возможность включить автоматический ввод. Если он включен, сценарий Cinemachines имеет приоритет и контролирует движение камеры всякий раз, когда я выполняю действие, связанное с поставщиком ввода. Я подключил действие просмотра к сценарию поставщика ввода, который выглядит следующим образом:
Система ввода
Поэтому первое, что я попробовал, — это отключить AutoEnableInputs, чтобы можно было редактировать движение камеры. с моим собственным сценарием, но поскольку он основан на обновлении значений оси из сценария InputProvider, он не работает, поскольку эти значения осей обновляются на основе входных данных в InputProvider (которые я отключил). Единственное, что, я думаю, сработает, это либо подойти к этому совершенно по-другому, либо, может быть, я мог бы получить некоторую помощь с моим скриптом CameraController:
Код: Выделить всё
public class CameraController : MonoBehaviour
{
/* [SerializeField] */
/* private float orbitSpeed = 2f; */
private CinemachineInputProvider inputProvider;
public PlayerInputActions playerControls;
private InputAction deltaAction;
private InputAction dragAction;
private Vector2 deltaInput = Vector2.zero;
private bool isDragging = false;
private void Awake()
{
playerControls = new PlayerInputActions();
inputProvider = GetComponent();
deltaAction = playerControls.Player.Look;
dragAction = playerControls.Player.Drag;
}
private void OnEnable()
{
deltaAction.Enable();
dragAction.Enable();
dragAction.performed += OnDrag;
dragAction.canceled += OnDrag;
deltaAction.performed += OnDelta;
}
private void OnDisable()
{
deltaAction.Disable();
dragAction.Disable();
}
private void OnDrag(InputAction.CallbackContext context)
{
isDragging = !isDragging;
}
private void OnDelta(InputAction.CallbackContext context)
{
deltaInput = context.ReadValue();
}
// Update is called once per frame
void Update()
{
float x = inputProvider.GetAxisValue(0);
float y = inputProvider.GetAxisValue(1);
float z = inputProvider.GetAxisValue(2);
if ((x != 0 || y != 0) && isDragging)
{
OrbitPlayer(x, y);
}
}
/* public Vector2 OrbitDirection(float x, float y)
{
Vector2 direction = Vector2.zero;
return direction;
} */
public void OrbitPlayer(float x, float y)
{
Debug.Log("Orbiting");
}
}
I have tried looking everywhere for some answers but usually it was either using the old input manager or wasn't applicible in my context. Thanks for reading
Источник: https://stackoverflow.com/questions/781 ... ging-mouse