Прежде всего, я новичок в этом, поэтому любые советы будут безумно полезны. У меня есть код, который делает в основном все, что мне нужно. Я просто не могу понять, как заставить его работать правильно. Основная идея заключается в том, что экран делится по сценарию (ширина делится на 3, а средняя часть используется для разделения y (высоты) на 2 части (если вы нажмите на правую сторону, он перемещается по оси x, и если вы нажимаете на левой стороне экрана, он перемещается влево по оси x). Мне нужно сделать так, чтобы вращение работало только при касании одним пальцем. ось x / z работает, когда два пальца нажаты (удержание), а масштабирование работает, когда пальцы защемлены.Основная проблема заключается в том, что я не могу отличить их один от другого, например, даже если я использую два пальца, вращение одного пальца Я все еще работаю, и я не знаю, как это остановить. Любая помощь действительно ценится, и я извиняюсь Если это трудно понять, я изо всех сил пытался объяснить это.
Для движения двумя пальцами я пытался сделать так (touch2.phase == TouchPhase.stationary), но это не сработало.
CODE `using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class cameramovementsv3 : MonoBehaviour
{
// MOVEMENT
public float speed = 2f;
public float MIN_X;
public float MAX_X;
public float MIN_Y;
public float MAX_Y;
//private bool DirectionTouch;
int desiredWidth = Screen.width / 3;
// ROTATION
public float Rspeed;
private Vector3 firstpoint;
private Vector3 secondpoint;
public float xAngle = 0.0f;
public float yAngle = 0.0f;
public float xAngTemp = 0.0f;
public float yAngTemp = 0.0f;
public static bool multiTouchEnabled;
public GameObject otherObject;
//PINCHANDZOOM
public float perspectiveZoomSpeed = 0.5f; // The rate of change of the field of view in perspective mode.
public float orthoZoomSpeed = 0.5f; // The rate of change of the orthographic size in orthographic mode.
public Camera cam;
// Start is called before the first frame update
void Start()
{
firstpoint = new Vector3(0, 0, 0);
secondpoint = new Vector3(0, 0, 0);
xAngle = 0.0f;
yAngle = 0.0f;
transform.rotation = Quaternion.Euler(yAngle, xAngle, 0.0f);
}
// Update is called once per frame
void Update()
{
var movement = Vector3.zero;
Touch touch1 = Input.touches[0];
Touch touch2 = Input.touches[1];
if (Input.touchCount == 2)
{
}
foreach (Touch touch in Input.touches)
{
if (touch2.position.x < desiredWidth) // deviding the screen
{
Vector3 delta = Input.touches[1].deltaPosition;
movement.x--;
transform.Translate(movement * speed * Time.deltaTime, Space.Self);
transform.position = new Vector3(
Mathf.Clamp(transform.position.x, MIN_X, MAX_X),
Mathf.Clamp(transform.position.y, MIN_Y, MAX_Y));
}
if (touch2.position.x >= 2 * desiredWidth)
{
Vector3 delta = Input.touches[1].deltaPosition;
movement.x++;
transform.Translate(movement * speed * Time.deltaTime, Space.Self);
transform.position = new Vector3(
Mathf.Clamp(transform.position.x, MIN_X, MAX_X),
Mathf.Clamp(transform.position.y, MIN_Y, MAX_Y));
}
if (touch2.position.x >= desiredWidth && touch2.position.x < 2 * desiredWidth)
{
if (touch2.position.y > Screen.height / 2)
{
Vector3 delta = Input.touches[1].deltaPosition;
movement.y++;
transform.Translate(movement * speed * Time.deltaTime, Space.Self);
transform.position = new Vector3(
Mathf.Clamp(transform.position.x, MIN_X, MAX_X),
Mathf.Clamp(transform.position.y, MIN_Y, MAX_Y));
}
}
if (touch2.position.x >= desiredWidth && touch2.position.x < 2 * desiredWidth)
{
if (touch2.position.y < Screen.height / 2)
{
Vector3 delta = Input.touches[1].deltaPosition;
movement.y--;
transform.Translate(movement * speed * Time.deltaTime, Space.Self);
transform.position = new Vector3(
Mathf.Clamp(transform.position.x, MIN_X, MAX_X),
Mathf.Clamp(transform.position.y, MIN_Y, MAX_Y));
}
}
else if (touch1.phase == TouchPhase.Moved || touch2.phase == TouchPhase.Moved)
{
// Find the position in the previous frame of each touch.
Vector2 touchZeroPrevPos = touch1.position - touch1.deltaPosition;
Vector2 touchOnePrevPos = touch2.position - touch2.deltaPosition;
// Find the magnitude of the vector (the distance) between the touches in each frame.
float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude;
float touchDeltaMag = (touch1.position - touch2.position).magnitude;
// Find the difference in the distances between each frame.
float deltaMagnitudeDiff = prevTouchDeltaMag - touchDeltaMag;
// If the camera is orthographic...
if (GetComponent<Camera>().orthographic)
{
// ... change the orthographic size based on the change in distance between the touches.
GetComponent<Camera>().orthographicSize += deltaMagnitudeDiff * orthoZoomSpeed;
// Make sure the orthographic size never drops below zero.
GetComponent<Camera>().orthographicSize = Mathf.Max(GetComponent<Camera>().orthographicSize, 0.1f);
}
else
{
// Otherwise change the field of view based on the change in distance between the touches.
GetComponent<Camera>().fieldOfView += deltaMagnitudeDiff * perspectiveZoomSpeed;
// Clamp the field of view to make sure it's between 0 and 180.
GetComponent<Camera>().fieldOfView = Mathf.Clamp(GetComponent<Camera>().fieldOfView, 20f, 60f);
}
}
}
if (Input.touchCount > 0)
{
if (Input.GetTouch(0).phase == TouchPhase.Began)
{
firstpoint = Input.GetTouch(0).position;
xAngTemp = xAngle;
yAngTemp = yAngle;
}
if (Input.GetTouch(0).phase == TouchPhase.Moved)
{
secondpoint = Input.GetTouch(0).position;
yAngle = yAngTemp - (secondpoint.y - firstpoint.y) * 90.0f / Screen.height;
if (yAngle < 360)
yAngle += 360;
if (yAngle > 360)
yAngle -= 360;
if (yAngle > 90 && yAngle < 270)
xAngle = xAngTemp - (secondpoint.x - firstpoint.x) * 180.0f / Screen.width;
else
xAngle = xAngTemp + (secondpoint.x - firstpoint.x) * 180.0f / Screen.width;
if (xAngle < 0)
xAngle += 360;
if (xAngle > 360)
xAngle -= 360;
transform.rotation = Quaternion.Euler(yAngle, xAngle, 0.0f);
}
}
}
}