Как в unity3d для android сделать повороты камеры на сенсорном управлении?
вот тут у меня ест скрипт на управление и повороты, но он работает не корректно. Когда поворачиваю камеру, игрок к которому прикреплена камера, поворачивается вместе с камерой, и даже когда вниз смотрю игрок переворачивается и меняет местоположение гравитации.
Вот сам скрипт:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Joystic_controller : MonoBehaviour
{
public float speedMove; // Скорость персонажа
public float jumpPower; // Сила прыжка
public Button jump;
public float gravityForse; // Гравитация
private Vector3 moveVector; // Направление движения персонажа
private CharacterController ch_controller; // Ссылка на компонент CharacterController
public Joystick joy; // Ссылка на джойстик
public Transform cameraTransform; // Ссылка на камеру
public float cameraSensitivity; // Чувствительность поворота камеры
public float moveInputDeadZone; //
int rightFingerId; // Переменная для пальца
float halfScreenWidth; // Переменная для того что бы узнать размер экранна, что бы разделить его попалам
private Vector2 lookInput; // направление перемещения камеры
private float cameraPitch; // Переменная для камеры
public Transform player; // Ссылка на персонажа
void Start()
{
ch_controller = GetComponent<CharacterController>(); // Подключаем ссылку в старте с помощью GetComponent
rightFingerId = -1; // при старте, наша переменная отвечающая за палец будет равна -1
halfScreenWidth = Screen.width / 2; // Делим наш экран на пополам
moveInputDeadZone = Mathf.Pow(Screen.height / moveInputDeadZone, 2);
}
private void FixedUpdate()
{
MovePlayer();
GamingGravity();
if (rightFingerId != -1)
{
LookAround();
}
}
void Update()
{
GetJump();
GetTouchInput();
}
private void GetTouchInput() // Метод для отслеживания пальца
{
int i = 0;
for (i = 0; i < Input.touchCount; i++)
{
Touch t = Input.GetTouch(i);
switch (t.phase) // Для проверки фазы каждого кассания
{
case TouchPhase.Began: // Этот метод будет срабатывать каждый раз когда мы каснёмся экрана
if (t.position.x > halfScreenWidth && rightFingerId == -1) // Если наш палец находится на половине и rightFingerId == -1 то..
{
rightFingerId = t.fingerId; // Начинаем отслеживать наш палец
}
break;
case TouchPhase.Ended:
case TouchPhase.Canceled:
if (t.fingerId == rightFingerId)
{
rightFingerId = -1; // Тут мы прекратили отслеживать наш палец
}
break;
case TouchPhase.Moved: // Метод когда палец перемещается по экрану
if (t.fingerId == rightFingerId)
{
lookInput = t.deltaPosition * cameraSensitivity * Time.deltaTime; // Тут мы получаем информацию для lookInput
}
break;
case TouchPhase.Stationary: // Метод касания экрана без движения
if (t.fingerId == rightFingerId)
{
lookInput = Vector2.zero; // Вектор обнуляем
}
break;
}
}
}
private void LookAround() // Создаём метод для вращения камеры
{
cameraPitch = Mathf.Clamp(cameraPitch - lookInput.y, -90f, 90f); // Вращаем камеру по вертекали с указаным диапозоном -90f, 90f для того что бы не перекручивать камеру
cameraTransform.localRotation = Quaternion.Euler(cameraPitch,0,0);
transform.Rotate(cameraTransform.up, lookInput.x); // Вращаем камеру по горизонтали
}
private void MovePlayer() // Метод в котором будем перемещать персонажа
{
moveVector = Vector3.zero; // Обнуляем вектор направления движения (это нужно что бы не было случайных ошибок)
moveVector.x = joy.Horizontal; // Передвигаем персонажа по оси X и Перехватываем хначение по горизонтали
moveVector.z = joy.Vertical; // Перехватываем хначение по вертикали
gravityForse = -1f;
moveVector.y = gravityForse; // для того что бы на ось Y действовала гравитация
moveVector = transform.right * moveVector.x + transform.forward * moveVector.z + transform.up * moveVector.y; // Делаем так что бы наш персонаж поворачивался зп камерой
ch_controller.Move(moveVector * speedMove * Time.deltaTime); // Для того что бы наш персонаж перемещался
}
private void GamingGravity() // Метод для гравитации
{
if (!ch_controller.isGrounded) // Если мы не на земле
{
gravityForse -= 10f * Time.deltaTime; // Переменная отвечающая за гравитацию уменьшается
}
else
gravityForse -= gravityForse ; // Иначе, если мы на земле, возвращаем гравитацию в исходное положение
}
public Button GetJump()
{
return jump;
}
public void onClickJump(Button jump) // Метод для кнопки прыжка
{
if (ch_controller.isGrounded) // Если мы находимся на земле то...
gravityForse = jumpPower; // Переменная отвечающая за прыжок будет равна силе прыжка
}
}