c# - 如何创建 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);
}
解决方案
您可以在新的输入管理器中使用触摸屏(delta)简单地修复它,并在拖动图像的 onstick 功能中管理输入。