首页 > 解决方案 > 如何创建 Unity3d Cinemachine 3rd 人移动滑动相机?

问题描述

我创建了一个第三人称 freelook 相机和一个玩家控制器,该控制器从新的输入系统动作地图中获取输入,它来自左摇杆游戏手柄,跳跃并可以看;感谢 youtube 教程。当我围绕我的玩家旋转并且玩家朝着相机的方向移动时,相机工作得很好。在我的手机上构建和播放后,我意识到有一个问题,只要用户不停止按下屏幕,相机就不会停止旋转。我不希望这样,因为用户玩游戏的次数越多,它就开始变得烦人。我希望用户在将相机拖到玩家周围时按住相机并旋转它(就像在手机游戏 genshin Impact 中一样)。我不知道它的正确术语,但我认为它是一个滑动的第三人称相机。有人可以告诉我它是如何完成的吗?

#region Variables
[SerializeField]
private float playerSpeed = 2.0f;
[SerializeField]
private float jumpHeight = 1.0f;
[SerializeField]
private float gravityValue = -9.81f;
[SerializeField]
private float rotationSpeed = 0.1f;
private float rotationVelocity;

private Transform cameraMain;
private Transform child;
private Player playerInput;
private CharacterController controller;
private Vector3 playerVelocity;
private bool groundedPlayer;
#endregion

#region Main Methods
private void Awake()
{
    playerInput = new Player();
    controller = GetComponent<CharacterController>();
}

private void OnEnable()
{
    playerInput.Enable();
}

private void OnDisable()
{
    playerInput.Disable();
}


private void Start()
{
    cameraMain = Camera.main.transform;
    child = transform.GetChild(0).transform;
}

void Update()
{
    groundedPlayer = controller.isGrounded;
    if (groundedPlayer && playerVelocity.y < 0)
    {
        playerVelocity.y = 0f;
    }

    Vector2 movementInput = playerInput.PlayerMain.Move.ReadValue<Vector2>();
    //Vector3 move = new Vector3(movementInput.x, 0f, movementInput.y);
    Vector3 move = (cameraMain.forward * movementInput.y + cameraMain.right * movementInput.x);
    move.y = 0f;
    //controller.Move(move * Time.deltaTime * playerSpeed);

    if (move != Vector3.zero)
    {
        float targetAngle = Mathf.Atan2(move.x, move.z) * Mathf.Rad2Deg;
        float angle = Mathf.SmoothDampAngle(child.eulerAngles.y, targetAngle, ref rotationVelocity, rotationSpeed);
        child.rotation = Quaternion.Euler(0f, angle, 0f);
        controller.Move(move * Time.deltaTime * playerSpeed);
    }

    // Changes the height position of the player..
    if (playerInput.PlayerMain.Jump.triggered && groundedPlayer)
    {
        playerVelocity.y += Mathf.Sqrt(jumpHeight * -3.0f * gravityValue);
    }

    playerVelocity.y += gravityValue * Time.deltaTime;
    controller.Move(playerVelocity * Time.deltaTime);

    
}

以上是最近从 youtube 教程中学到的播放器控制器代码。下面是游戏手柄的输入动作图和游戏对象: 在此处输入图像描述

在此处输入图像描述

标签: c#unity3dswipetouchscreencinemachine

解决方案


您可以在新的输入管理器中使用触摸屏(delta)简单地修复它,并在拖动图像的 onstick 功能中管理输入。


推荐阅读