Тема: I.D.S. MONSTERS
Показать сообщение отдельно
Старый 21.02.2020, 05:32   #39
Crystal
Терабайт исходников
 
Аватар для Crystal
 
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений
(для 5,374 пользователей)
Ответ: I.D.S. MONSTERS

Третья билдуха: ТЫК

Теперь у меня полноценная 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;




    }


}


В коде могут присутствовать не мешающие мусорные элементы,
пол седьмого утра, мне спать пора, а не остатки прошлых
версий управления камерой подчищать )
__________________
Проект "Deathbring World - Rangers" и его финансовая поддержка:
https://boosty.to/deathbringrangers

Я на - TWITCH
Канал на YouTube

Последний раз редактировалось Crystal, 21.02.2020 в 14:04.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Crystal за это полезное сообщение:
Arton (21.02.2020), St_AnGer (21.02.2020)