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
进行屏幕操作。
此外,在 Update
或 LateUpdate
操作中将它们乘以 Time.deltaTime
非常有趣,这样运动就与帧速率无关。
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
进行屏幕操作。
此外,在 Update
或 LateUpdate
操作中将它们乘以 Time.deltaTime
非常有趣,这样运动就与帧速率无关。