Третья билдуха:
ТЫК
Теперь у меня полноценная RTS камера.
Умеет и бегать как ранее во все стороны, также отдаляться-приближаться,
но теперь она ещё умеет вращаться влево и вправо при зажатом
колесе мыши.
Я уже говорил, что при моей прошлой вполне удачной системе ориентирования
камеры в границах игровой карты невозможен её поворот,
так как вся ориентация слетает к херам.
Это была нормальная версия, но она подойдёт только для
игры, где камеру поворачивать не надо, а я решил,
что поворачивать будем!
То что вы сейчас видите, это уже пятая версия ориентации камеры.
Пришлось помучиться изобретая новые способы, и воюя
с одним внезапным багом юнити которого не должно быть,
но это баг самой логики в связке "transform.Translate" с "Time.deltaTime"
при движении по оси "Z". Грубо говоря, при одинаковом условии,
когда объекту запрещено двигаться по этим двум осям "X и Z",
по Z он всё-таки двигается на один такт "Time.deltaTime",
после чего условие начинает соблюдаться, однако этот баг
мою систему уничтожал просто, пришлось вместо двигания
камеры её телепортировать, и вот там уже не меняя условий
, ни строчки кода, всё с перемещением по Z отлично.
Можете сами баг проверить, заменив телепортацию камеры, на
её толкание в сторону.
Строку:
CamPapa.transform.position = new Vector3(SusaninVector.x, CamPapaCoordinate.y, SusaninVector.z);
Меняете её в блоке отвечающем за движение камеры вправо на:
CamPapa.transform.Translate(Vector3.right * CamTranslateSpeed * Time.deltaTime);
Двигаетесь во все стороны, всё норм, но это пока вы не повернёте
камеру на 90 градусов, и не поедете по Z оси, там то и сработает
баг где 1 раз не выполнится условие нахождения в площади уровня:
if (SusaninPositionX > 0.01f && SusaninPositionX < CamMooveRangeX && SusaninPositionZ > 0.01f && SusaninPositionZ < CamMooveRangeZ)
Баг этот юнитишный из меня все нервы вытряс, хорошо что я додумался
заменить образно говоря толкание на телепортацию, и сразу с
осью Z проблема отпала.
Короче, как работает теперь вся логика движения камеры и его
ограничения площадью уровня?
Появился ещё один пивот "Susanin", он телепортируется под камеру,
далее двигается туда, куда мы хотели бы сместить камеру,
определяется находится ли сусанин в площади игрового уровня.
Если в площадь попал (она сейчас 20 на 20) то телепортируем
на его координаты камеру, если не попал, значит нехрен
туда камеру двигать, и мы ничего не делаем.
Работает под любым углом поворота камеры.
Код:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CamController : MonoBehaviour
{
public GameObject CamPapa; // Пивот к которому привязана камера
public Camera Camera; //Камера конечно
public int CamTranslateSpeed = 10; // Скорость движения камеры
public float CamRemoveStep = 1.5f; // Шаг отдаления камеры
public int CamDegreeRemove = 5; // Переменная со стартовым шагом, отсчёт идёт от 5 до 10, т.е. мы можем сделать максимум 5 шагов отдаляющих камеру, и после до 5 приближающих.
public float CamMooveRangeX = 20f; // Область перемещения камеры по оси "x" соответствующая ширине игровой карты .
public float CamMooveRangeZ = 20f; // Область перемещения камеры по оси "x" соответствующая длине игровой карты .
public float CamPositionX; // Текущие координаты CamPapa по оси "x".
public float CamPositionZ; // Текущие координаты CamPapa по оси "z".
public Vector3 CamPapaCoordinate; //Резервная переменная для запроса вектора из трёх координат положения CamPapa.
public GameObject Susanin; // Разведчик, бежит вперёд камеры, узнаёт можно ли туда камеру двигать.
public float SusaninPositionX; // Текущие координаты Susanin по оси "x".
public float SusaninPositionZ; // Текущие координаты Susanin по оси "z".
public Vector3 SusaninVector; // x,y,z кординаты Susanin
public float CamPapaXRotationSpeed = 10f;
public float MouseXRotation;
public int CamPapaXRotationDetector = 0;
void Update()
{
CamPositionX = CamPapa.transform.position.x;
CamPositionZ = CamPapa.transform.position.z;
CamPapaCoordinate = CamPapa.transform.position;
// Поворот камеры
if (Input.GetMouseButton(2))
{
CamPapaXRotationDetector = 1;
MouseXRotation = Input.GetAxis("Mouse X");
CamPapa.transform.Rotate(0, Input.GetAxis("Mouse X") * CamPapaXRotationSpeed, 0);
Susanin.transform.Rotate(0, Input.GetAxis("Mouse X") * CamPapaXRotationSpeed, 0);
}
else
{
CamPapaXRotationDetector = 0;
}
//-------------------------------------------------------------------------------------------------------------------
if (CamPapaXRotationDetector == 0)
{
if (Input.mousePosition.x >= Screen.width - 5.3f)
{
CamPapaCoordinate = CamPapa.transform.position;
Susanin.transform.position = new Vector3(CamPapaCoordinate.x, CamPapaCoordinate.y, CamPapaCoordinate.z);
Susanin.transform.Translate(Vector3.right * CamTranslateSpeed * Time.deltaTime);
SusaninPositionX = Susanin.transform.position.x;
SusaninPositionZ = Susanin.transform.position.z;
SusaninVector = Susanin.transform.position;
if (SusaninPositionX > 0.01f && SusaninPositionX < CamMooveRangeX && SusaninPositionZ > 0.01f && SusaninPositionZ < CamMooveRangeZ)
{
CamPapa.transform.position = new Vector3(SusaninVector.x, CamPapaCoordinate.y, SusaninVector.z);
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------
if (Input.mousePosition.x <= 0.1f)
{
CamPapaCoordinate = CamPapa.transform.position;
Susanin.transform.position = new Vector3(CamPapaCoordinate.x, CamPapaCoordinate.y, CamPapaCoordinate.z);
Susanin.transform.Translate(Vector3.left * CamTranslateSpeed * Time.deltaTime);
SusaninPositionX = Susanin.transform.position.x;
SusaninPositionZ = Susanin.transform.position.z;
SusaninVector = Susanin.transform.position;
if (SusaninPositionX > 0.01f && SusaninPositionX < CamMooveRangeX && SusaninPositionZ > 0.01f && SusaninPositionZ < CamMooveRangeZ)
{
CamPapa.transform.position = new Vector3(SusaninVector.x, CamPapaCoordinate.y, SusaninVector.z);
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------
if (Input.mousePosition.y >= Screen.height - 2.3f)
{
CamPapaCoordinate = CamPapa.transform.position;
Susanin.transform.position = new Vector3(CamPapaCoordinate.x, CamPapaCoordinate.y, CamPapaCoordinate.z);
Susanin.transform.Translate(Vector3.forward * CamTranslateSpeed * Time.deltaTime);
SusaninPositionX = Susanin.transform.position.x;
SusaninPositionZ = Susanin.transform.position.z;
SusaninVector = Susanin.transform.position;
if (SusaninPositionX > 0.01f && SusaninPositionX < CamMooveRangeX && SusaninPositionZ > 0.01f && SusaninPositionZ < CamMooveRangeZ)
{
CamPapa.transform.position = new Vector3(SusaninVector.x, CamPapaCoordinate.y, SusaninVector.z);
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------
if (Input.mousePosition.y <= 0.1f)
{
CamPapaCoordinate = CamPapa.transform.position;
Susanin.transform.position = new Vector3(CamPapaCoordinate.x, CamPapaCoordinate.y, CamPapaCoordinate.z);
Susanin.transform.Translate(Vector3.back * CamTranslateSpeed * Time.deltaTime);
SusaninPositionX = Susanin.transform.position.x;
SusaninPositionZ = Susanin.transform.position.z;
SusaninVector = Susanin.transform.position;
if (SusaninPositionX > 0.01f && SusaninPositionX < CamMooveRangeX && SusaninPositionZ > 0.01f && SusaninPositionZ < CamMooveRangeZ)
{
CamPapa.transform.position = new Vector3(SusaninVector.x, CamPapaCoordinate.y, SusaninVector.z);
}
}
//-------------------------------------------------------------------------------------------------------------------
}
//-------------------------------------------------------------------------------------------------------------------
//Отдаление и приближение колесом мыши
if (Input.mouseScrollDelta.y > 0 && CamDegreeRemove < 10)
{
Camera.transform.position = new Vector3(Camera.transform.position.x, Camera.transform.position.y + CamRemoveStep, Camera.transform.position.z);
Camera.transform.Translate(Vector3.back * CamRemoveStep);
CamDegreeRemove = CamDegreeRemove + 1;
}
if (Input.mouseScrollDelta.y < 0 && CamDegreeRemove > 5)
{
Camera.transform.position = new Vector3(Camera.transform.position.x, Camera.transform.position.y - CamRemoveStep, Camera.transform.position.z);
Camera.transform.Translate(Vector3.forward * CamRemoveStep);
CamDegreeRemove = CamDegreeRemove - 1;
}
if (CamDegreeRemove > 10) CamDegreeRemove = 10;
if (CamDegreeRemove < 5) CamDegreeRemove = 5;
}
}
В коде могут присутствовать не мешающие мусорные элементы,
пол седьмого утра, мне спать пора, а не остатки прошлых
версий управления камерой подчищать )