Unity,通过滑动(3d)旋转相机的脚本

Unity, script for rotating the camera by swiping (3d)

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CameraScript : MonoBehaviour
{
    [SerializeField] private float sensitivityHor = 9.0f;
    [SerializeField] private float sensitivityVert = 9.0f;
    [SerializeField] private float minimumVert = -45.0f;
    [SerializeField] private float maximumVert = 45.0f;
    private float _rotationX = 0;
    private Rigidbody PlayerRigidbody;
 
    void Start()
    {
        PlayerRigidbody = GetComponent<Rigidbody>();
        if (PlayerRigidbody != null)
        {
            PlayerRigidbody.freezeRotation = true;
        }
    }
 
    void Update()
    {
        _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
        _rotationX = Mathf.Clamp(_rotationX, minimumVert, maximumVert);
        float delta = Input.GetAxis("Mouse X") * sensitivityHor;
        float rotationY = transform.localEulerAngles.y + delta;
        transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);
    }
}

晚上好。我写了一个脚本来通过在屏幕上滑动手指来旋转相机 (它在我的相机上),用一根手指一切正常,但如果你同时用两根手指触摸,应用程序会做出错误反应(突然改变相机旋转)。我如何使用 Input.GetAxis 修复它,或者我可以使用什么来编写多点触控脚本?

您可以只使用第一次触摸来移动,这样如果有第二次没有任何反应,请分别将 Input.GetAxis("Mouse Y") 更改为 Input.GetTouch(0).deltaPosition.y x 和 y。像这样:

if (Input.touchCount > 0) {
    _rotationX -= Input.GetTouch(0).deltaPosition.y * sensitivityVert;
    _rotationX = Mathf.Clamp(_rotationX, minimumVert, maximumVert);
    float delta = Input.GetTouch(0).deltaPosition.x * sensitivityHor;
    float rotationY = transform.localEulerAngles.y + delta;
    transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);
}

代码未调试,因为它只是替换后的代码。 如果处理第一次触摸行为很奇怪,你可以处理中间点的旋转。像这样:

//get the touch middle when the second finger touches
if (Input.GetTouch(1).phase == TouchPhase.Began) {
    touchMiddle = (Input.GetTouch(0).position + 
    Input.GetTouch(1).position) / 2;
    touchDistSqr = (Input.GetTouch(0).position - 
    Input.GetTouch(1).position).sqrMagnitude;
    return;
}
if (Input.touchCount == 2) {
    var deltaMidde = touchMiddle - (Input.GetTouch(0).position + Input.GetTouch(1).position) / 2;
    transform.localEulerAngles = new Vector3(deltaMidde.x, deltaMidde.y, 0);
}

LateUpdate()中的所有代码。 最好需要在 LateUpdate() 中完成相机移动,以使可能已在 Update 内部移动的对象在每一帧中处于其最终状态。按照 documentation 中的建议。 不太相关,但请注意,大多数时候您可以使用 Vector2 而不是 Vector3 进行屏幕操作。

此外,在 UpdateLateUpdate 操作中将它们乘以 Time.deltaTime 非常有趣,这样运动就与帧速率无关。