forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Постмор (http://forum.boolean.name/forumdisplay.php?f=160)
-   -   I.D.S. MONSTERS (http://forum.boolean.name/showthread.php?t=20763)

mauNgerS 19.02.2020 13:20

Ответ: I.D.S. MONSTERS
 
Супер беглый взгляд:
- можно не пускать луч каждый кадр, а только при нажатой кнопке
- можно постоянно использующиеся переменные завести 1 раз в start/awake
- вместо new Vector3() можно завести вектор шлюху и перезаписывать в нём значения

ABTOMAT 19.02.2020 13:38

Ответ: I.D.S. MONSTERS
 
Цитата:

PHP код:

//Определяем координаты персонажа
                    
ChelCoordinate Chel.transform.position Time.deltaTime


Тут Дельта Тайм нинужен, в лог потом выводятся неверные данные.
В остальном не вижу причин, по которым может дёргаться.
Может, FPS просто скачет? Хотя какой должен быть комп чтобы скакало.

Crystal 19.02.2020 17:34

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от mauNgerS (Сообщение 317032)
Супер беглый взгляд:
- можно не пускать луч каждый кадр, а только при нажатой кнопке
- можно постоянно использующиеся переменные завести 1 раз в start/awake
- вместо new Vector3() можно завести вектор шлюху и перезаписывать в нём значения

Проорал ) Вектор шлюха )
Когда до оптимизации говнокода дойдёт, вспомню о совете.
Сам знаешь, код написан для того, чтобы постоянно его переписывать.

Луч пускается постоянно для отрисовки в окне сцены, чтобы я видел куда он падает.

Цитата:

Сообщение от ABTOMAT (Сообщение 317033)
Тут Дельта Тайм нинужен, в лог потом выводятся неверные данные.
В остальном не вижу причин, по которым может дёргаться.
Может, FPS просто скачет? Хотя какой должен быть комп чтобы скакало.

Да дельта тайм не нужен, это мусорный участок кода, я ожидал что заметишь, впадлу было стереть.

Оказалось дёргалось только в окне Game в Unity,
в билде было на тот момент всё нормально.
Перезагрузил комп, теперь и в юнити не дёргается.

Скоро ещё понадобятся тестеры, я пишу управление камерой а ля RTS.
Сегодня уже наверно билд с кодом выложу.

Crystal 19.02.2020 20:15

Ответ: I.D.S. MONSTERS
 
Итак следующий билд.
RTS камера относительно готова.
Скачать ТЫК.

У камеры появился родительский пивот, который я двигаю "CamPapa".
Что умеет камера:
1. Двигаться в восьми направлениях, когда курсор доходит до края экрана.
2. Отдаляться и возвращаться обратно по пяти шагам колесом мышки.
3. Ориентироваться на местности по длине и ширине игрового уровня,
останавливая своё движение доходя до края.
(Размер игрового уровня сейчас равен размеру плейна).

Что камера не умеет:
Не умеет поворачиваться по осям. Во первых это функция
сомнительной нужности для геймдизайна моего проекта.
Во вторых, в данный момент если повернуть камеру,
то её ориентация в координатах игрового уровня
слетит к херам, превратившись из квадрата в неведомую
геометрическую фигуру. Чтобы поворачивать камеру,
придётся расчитывать ориентацию с учётом угла поворота
камеры, а это вам уже не 10 на 10 умножить так сказать,
придётся голову напрячь, возможно и реализую если потребуется.

Ограничение движения камеры коллизией с кубом, который натянут на уровень - не предлагать! слишком просто.

Говнокод управления камерой:


Код:

public class CamController : MonoBehaviour
{

    public GameObject CamPapa; // Пивот к которому привязана камера
    public int CamTranslateSpeed = 10; // Скорость движения камеры
    public float CamRemoveStep = 1.5f; // Шаг отдаления камеры
    public int CamDegreeRemove = 5; // Переменная со стартовым шагом, отсчёт идёт от 5 до 10, т.е. мы можем сделать максимум 5 шагов отдаляющих камеру, и после до 5 приближающих.
    public float CamMooveRangeX = 10f; // Область перемещения камеры по оси "x" соответствующая ширине игровой карты .
    public float CamMooveRangeZ = 10f; // Область перемещения камеры по оси "z" соответствующая длине игровой карты .
    public float CamPositionX; // Текущие координаты CamPapa по оси "x".
    public float CamPositionZ; // Текущие координаты CamPapa по оси "z".
    public Vector3 CamPapaCoordinate; //Резервная переменная для запроса вектора из трёх координат положения CamPapa.

    void Update()
    {

        //Проверка положения мыши в районе правого края экрана


        if (Input.mousePosition.x >= Screen.width - 5.3f)
        {
            CamPositionX = CamPapa.transform.position.x;

            //Если "x" координаты CamPapa меньше ширины игровой карты мы двигаем камеру вправо
            if (CamPositionX < CamMooveRangeX)
            {
            CamPapa.transform.Translate(Vector3.right * CamTranslateSpeed * Time.deltaTime);
            }
        }

        //Проверка положения мыши в районе левого края экрана
        if (Input.mousePosition.x <= 0.1f)
        {
            CamPositionX = CamPapa.transform.position.x;

            //Если "x" координаты CamPapa дальше начальной координаты игровой карты мы двигаем камеру влево
            if (CamPositionX > 0.01f)
            {
                CamPapa.transform.Translate(Vector3.left * CamTranslateSpeed * Time.deltaTime);
            }
        }

        //Проверка положения мыши в районе верхнего края экрана

        if (Input.mousePosition.y >= Screen.height - 2.3f)
        {
            CamPositionZ = CamPapa.transform.position.z;

            //Если "z" координаты CamPapa меньше длины игровой карты мы двигаем камеру вперёд

            if (CamPositionZ < CamMooveRangeZ)
            {
                CamPapa.transform.Translate(Vector3.forward * CamTranslateSpeed * Time.deltaTime);
            }
        }

        //Проверка положения мыши в районе нижнего края экрана

        if (Input.mousePosition.y <= 0.1f)
        {
            CamPositionZ = CamPapa.transform.position.z;

            //Если "z" координаты CamPapa дальше начальной координаты длины игровой карты мы двигаем камеру назад

            if (CamPositionZ > 0.01f)
            {
                CamPapa.transform.Translate(Vector3.back * CamTranslateSpeed * Time.deltaTime);
            }
        }
        //Отдаление и приближение колесом мыши

        if (Input.mouseScrollDelta.y > 0 && CamDegreeRemove < 10)
        {
            CamPapa.transform.position = new Vector3(CamPapa.transform.position.x, CamPapa.transform.position.y + CamRemoveStep, CamPapa.transform.position.z);
            CamPapa.transform.Translate(Vector3.back * CamRemoveStep);
            CamDegreeRemove = CamDegreeRemove + 1;
        }

        if (Input.mouseScrollDelta.y < 0 && CamDegreeRemove > 5)
        {
            CamPapa.transform.position = new Vector3(CamPapa.transform.position.x, CamPapa.transform.position.y - CamRemoveStep, CamPapa.transform.position.z);
            CamPapa.transform.Translate(Vector3.forward * CamRemoveStep);
            CamDegreeRemove = CamDegreeRemove - 1;
        }

        if (CamDegreeRemove > 10) CamDegreeRemove = 10;
        if (CamDegreeRemove < 5) CamDegreeRemove = 5;






    }
}


ABTOMAT 19.02.2020 20:56

Ответ: I.D.S. MONSTERS
 
Всё робит, музыка играет.
Продолжай, прямо как в старые-добрые времена, когда на Булку выкладывали билды кто что делает (когда кто-то что-то делол).

Arton 20.02.2020 00:01

Ответ: I.D.S. MONSTERS
 
Работает, музыка играет.
Хочется что бы в будущем можно было кликнуть за границы карты и что бы персонаж пошёл в ту сторону до края карты.
Впрочем это может помешать, если случайным кликом потопаешь к врагу.

Можно как-то отключить у юнити запросы в интернет?
Каждый билд с кубиком стучится непонятно куда.
Наверное статистику с мира понитке собирают.

OBS почему-то долго начинает захват после запуска программы.


P. S. Хм-м... Возможно в будущем Булке понадобится возможность загружать видео вместо gif, или тег [video]. Впрочем тег и сейчас не помешает. Так, мысли в слух.

Crystal 20.02.2020 01:54

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Arton (Сообщение 317037)
Работает, музыка играет.
Хочется что бы в будущем можно было кликнуть за границы карты и что бы персонаж пошёл в ту сторону до края карты.
Впрочем это может помешать, если случайным кликом потопаешь к врагу.

Можно как-то отключить у юнити запросы в интернет?
Каждый билд с кубиком стучится непонятно куда.
Наверное статистику с мира понитке собирают.

Хз куда он там стучится, может из-за того, что билд со статусом девелопмент.
В окне компилятора во вкладках ничего про отправку чего-либо куда-либо.
Наверно фирма шпионит за тем, как халявщики юзают их софт (я на бесплатной версии).

Про кликание за предел карты - реализовать могу, смысла не вижу.
В управлении персонажем намеренно будет отсутствовать ПП
(хоть он уже и есть встроенный в Unity).

Randomize 20.02.2020 14:11

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Crystal (Сообщение 317038)
Хз куда он там стучится, может из-за того, что билд со статусом девелопмент.

Проверь включена ли аналитика:
https://docs.unity3d.com/Manual/Unit...ticsSetup.html

Кроме того дев билды тоже открывают порт, но только для обмена данными с отладчиком - не опасно.

Crystal 21.02.2020 05:32

Ответ: 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;




    }


}



В коде могут присутствовать не мешающие мусорные элементы,
пол седьмого утра, мне спать пора, а не остатки прошлых
версий управления камерой подчищать )

Arton 21.02.2020 06:22

Ответ: I.D.S. MONSTERS
 
Ох, а можно правую кнопку мыши для вращения? Колёсико жёсткое у меня и глючит :(

Баг выход за границы:
Если во время движения кубика кликнуть за границу поля, кубик отправится туда и остановившись будет глючено крутится на месте.
При условие что куб не двигается, за границы его отправить нельзя.

Цитата:

Сообщение от Crystal (Сообщение 317042)
Появился ещё один пивот "Susanin", он телепортируется под камеру,
далее двигается туда, куда мы хотели бы сместить камеру,
определяется находится ли сусанин в площади игрового уровня.

Э-э, так я не понял камеру сейчас двигать можно или нельзя?
Мне тоже спать пора :-)
Про проблемы с камерой честно говоря не понял...

Пожалуйста, скрой простыни кода под спойлер!

Crystal 21.02.2020 09:45

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Arton (Сообщение 317043)
Ох, а можно правую кнопку мыши для вращения? Колёсико жёсткое у меня и глючит :(

Баг выход за границы:
Если во время движения кубика кликнуть за границу поля, кубик отправится туда и остановившись будет глючено крутится на месте.
При условие что куб не двигается, за границы его отправить нельзя.


Э-э, так я не понял камеру сейчас двигать можно или нельзя?
Мне тоже спать пора :-)
Про проблемы с камерой честно говоря не понял...

Пожалуйста, скрой простыни кода под спойлер!


Лол, у меня колесо тоже глючит, правую кнопку сделаю спешл фо ю
разово в четвёртом билде.

Баг подкрался от туда, откуда не ждали. Решил на скорую руку
красоту навести, и сделать космос для билда из плейна,
а переименовать его забыл. Собственно у нас сейчас два
плейна в билде, вот куб с ума и сходит, решается заменой
имени ) Он же по имени объекта в который луч попал событие
запускает, где в точку пика прыгает навигатор, а за ним
летит куб.

Камеру двигать можно, как в реал тайм стратегии, касаясь
ею краёв экрана, двигать можно в 8 направлениях.
Границы перемещения камеры выставлены размерами
игрового уровня, а игровой уровень это у нас бежевый
плейн. У камеры есть невидимая нога, которая стоит впереди
неё, если она коснулась края игрового поля, то дальнейшее
движение (за его пределы) невозможно, специально
выставленное ограничение.

Проблем с камерой нет, есть проблемы с Unity, он вопреки
прописанной логики при особом обстоятельстве разово
выполняет действие, которое не должен выполнять вообще,
и баг этот я обошёл.

Тега спойлер на булке нет, в оффтоп пихать не хочу по тому, что не оффтоп.

В общем сейчас сделаю сборку под правую кнопку мыши
и без выхода кубика в космос.

Crystal 21.02.2020 14:03

Ответ: I.D.S. MONSTERS
 
Подъехал новый билд:ТЫК

Цитата:

Сообщение от Arton (Сообщение 317043)
Ох, а можно правую кнопку мыши для вращения? Колёсико жёсткое у меня и глючит :(

Баг выход за границы:
Если во время движения кубика кликнуть за границу поля, кубик отправится туда и остановившись будет глючено крутится на месте.
При условие что куб не двигается, за границы его отправить нельзя.


Э-э, так я не понял камеру сейчас двигать можно или нельзя?
Мне тоже спать пора :-)
Про проблемы с камерой честно говоря не понял...

Пожалуйста, скрой простыни кода под спойлер!

1. В этот билд вращение камерой добавлено и на правую клавишу для тебя.

2. Баг был комплексный, не только второй плейн, но и недоработка кода.
Теперь переменная запоминающая в чей коллайдер мы ткнули
после проверки на нужный нам коллайдер заменяет в себе
имя коллайдера на слово "NiHuYa". Это было одной из проблем.
Следующая проблема была в том, что меня интересовали только
координаты падения луча на коллайдер, и персонаж двигался
к ним, теперь же у нас появились координаты навигатора,
и персонаж движется к ним, а не к координатам пика.
В общем 4 правки в коде.

3. Камера двигается в восьми направлениях касанием края экрана
мышкой. Движение камеры ограничено размерами игрового уровня,
она не может выйти за его пределы. У камеры есть невидимая нога,
и именно координаты этой ноги в площади игрового уровня
контролируются. Сама камера от своей ноги отодвинута немного назад.
А при повороте вращается именно нога, а не камера, она его
дочерний объект.

В общем тестите, буду благодарен за выявление новых багов.

Как просил, всё-таки большие коды теперь будут в оффтопе.
Код исправленной системы управления персонажем:



Код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PersController : MonoBehaviour
{
    public Camera Camera; //Камера конечно
    public GameObject plane; //Плоскость в которую будем лучом стрелять
    public GameObject Chel; // Персонаж
    public Vector3 ChelCoordinate; //Сюда записываем координаты персонажа
    public Vector3 NavigatorCoordinate; //Сюда записываем координаты навигатора
    public GameObject Navigator; // Маячок с координатами для следования персонажа
    public Vector3 RaycastPickCoordinates; //Конечные координаты падения луча в рейкасте на коллайдер
    public string RaycastObjNow; // Текстовая переменная, содержит имя объекта коллайдер которого попал под луч
    public float DistCheltoNavigator; //Дистанция между персонажем и навигатором
    public int PersMooveSystem = 0; //Система направления и движения персонажа
    public int PersSpeed = 4; //Скорость движения персонажа


    void Update()
    {

        //Сам луч, начинается от позиции камеры и направлен в сторону мыши
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        //Структура луча, нужна для получения информации из Raycast
        RaycastHit PickRay;

        //Пускаем луч
        Physics.Raycast(ray, out PickRay);

        //Если нажата ЛКМ
        if (Input.GetMouseButtonDown(0))
        {

     

            //Если запустили луч
            if (Physics.Raycast(ray, out PickRay))
            {
                //Получаем координаты пика на коллайдере
                RaycastPickCoordinates = new Vector3(PickRay.point.x, PickRay.point.y, PickRay.point.z);
                //Выводим координаты в дебаггер
                Debug.Log("Координаты падения луча на какой-либо коллайдер игрового объекта" + RaycastPickCoordinates);


                //Пишем в RaycastObjNow и дебаггер конкретно во что воткнулся луч
                RaycastObjNow = PickRay.collider.name;
                Debug.Log("Пишем в RaycastObjNow имя коллайдера попавшего в рейкаст:" + RaycastObjNow);


                //Если луч попал в плейн
                if (RaycastObjNow == "Plane")
                {
                    //Обнуляем RaycastObjNow
                    RaycastObjNow = "NiHuYa";
                    Debug.Log("Имя в RaycastObjNow: " + RaycastObjNow);
                    Debug.Log("Тыкнули в плейн, и двигаем Navigator!");
                    //Перемещаем навигатор персонажа в точку пика на данном коллайдере
                    Navigator.transform.position = new Vector3(PickRay.point.x, PickRay.point.y, PickRay.point.z);

                    //Определяем координаты персонажа
                    ChelCoordinate = Chel.transform.position;
                    Debug.Log("Координаты персонажа: " + ChelCoordinate);

                    //Определяем дистанцию между персонажем и навигатором
                    DistCheltoNavigator = Vector3.Distance(Chel.transform.position, RaycastPickCoordinates);
                    Debug.Log("Дистанция между Navigator и Персонажем: " + DistCheltoNavigator);

                    //Если дистанция между персонажем и навигатором больше определённой величины
                    if (DistCheltoNavigator >= 0.51f)

                    {
                        //Активируем систему направления и движения персонажа
                        PersMooveSystem = 1;

                        if (PersMooveSystem > 1)
                        {
                            PersMooveSystem = 1;
                        }

                        Debug.Log("Активирована система направления и движения персонажа");

                    }

                   

                }


                //Если луч попал в коллайдер игрового объекта
                if (PickRay.collider.gameObject)
                {
                    //Пишем в дебаггере название объекта, в который попал луч
                    Debug.Log("Луч попал в коллайдер игрового объекта: " + PickRay.collider.name);


                }


            }


        }

        //Визуализируем луч в окне сцены
        Debug.DrawLine(ray.origin, PickRay.point, Color.red);

        //Проверка активации системы перемещения персонажа
        if (PersMooveSystem >= 1)
        {

            //Прерывалка движения по клавишам стрелочкам

            if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.RightArrow))
            {
                PersMooveSystem = 0;
           
            }

            //Записываем координаты навигатора
            NavigatorCoordinate = Navigator.transform.position;
            //Создаём навигационный вектор позиции на который будем поворачивать персонажа, он состоит из вектора координат положения навигатора по "x" и "z", сохраня в "y" вектора координату "y" позиции персонажа
            Vector3 NavigatorPosition = new Vector3(NavigatorCoordinate.x, Chel.transform.position.y, NavigatorCoordinate.z);
            //Поворачиваем персонажа на позицию навигатора по "x" и "z" сохраняя "y" координату персонажа.
            Chel.transform.LookAt(NavigatorPosition);


         

            //Определяем дистанцию между персонажем и навигатором
            DistCheltoNavigator = Vector3.Distance(Chel.transform.position, NavigatorCoordinate);

            //Проверяем дистанцию между персонажем и навигатором
            if (DistCheltoNavigator < 0.51f)
            {
                //Отключаем систему направления и движения персонажа
                PersMooveSystem = 0;

                Debug.Log("Отключена система направления и движения персонажа");
            }

            // Двигаем персонажа вперёд соблюдая такты времени
            Chel.transform.Translate(Vector3.forward * Time.deltaTime * PersSpeed);

            Debug.Log("Активность системы направления и движения персонажа:" + PersMooveSystem);
        }

    }
}


Crystal 22.02.2020 19:47

Ответ: I.D.S. MONSTERS
 
Принимаю ваши советы, идеи и предложения по отрисовке
сетки игрового поля, по которой мы будем двигать монстров (а ля HoMM).

В блитце я создавал меш , квадраты отрисовывал полигонами повершинно (2 трианглы на квадрат),
с отступом от соседних квадратов. Короче сетка из цельного меша
была, а выделение ячейки делал перекрашиванием вершин.

В юнити как лучше реализовать визуализацию сетки?
Интересует самый дешёвый способ. Меш например был
дешёв, так как он один цельный объект, а не куча линий
рисуемых. Я также могу меш и тут создать, фигануть
его поверх плейна, и установить прозрачность процентов на 40.

Или прям по плейну текстурой рисовать?

P.s. Сетка будет не гексоганальная, так-как её использование в 3D игрухе бред полный,
такая годится только для изометрических игр с поворотом уровня на 45 градусов.
(И то бессмысленна, так как вместо восьми направлений движения оставляет нам 6.
Её используют вроде только для экономии 25% спрайтов на экране, и усложняют этим путь объекта.
Тут сетка будет как в неклассических героях, из квадратов.

ABTOMAT 23.02.2020 17:14

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Crystal (Сообщение 317047)
Принимаю ваши советы, идеи и предложения по отрисовке
сетки игрового поля, по которой мы будем двигать монстров (а ля HoMM).

В блитце я создавал меш , квадраты отрисовывал полигонами повершинно (2 трианглы на квадрат),
с отступом от соседних квадратов. Короче сетка из цельного меша
была, а выделение ячейки делал перекрашиванием вершин.

В юнити как лучше реализовать визуализацию сетки?
Интересует самый дешёвый способ. Меш например был
дешёв, так как он один цельный объект, а не куча линий
рисуемых. Я также могу меш и тут создать, фигануть
его поверх плейна, и установить прозрачность процентов на 40.

Или прям по плейну текстурой рисовать?

P.s. Сетка будет не гексоганальная, так-как её использование в 3D игрухе бред полный,
такая годится только для изометрических игр с поворотом уровня на 45 градусов.
(И то бессмысленна, так как вместо восьми направлений движения оставляет нам 6.
Её используют вроде только для экономии 25% спрайтов на экране, и усложняют этим путь объекта.
Тут сетка будет как в неклассических героях, из квадратов.

В сегодняшних реалиях можно не экономить и тупо каждую клетку отдельным мешем делать.
Если очень хочешь запариться с генерацией сетки, то в Юнити тоже так можно, да (есть туторы и т.д.).
Можешь также сделать плейн и на него клетчатую текстуру. А если какую-то клетку надо выделить, то тогда полигональный квадратик туда подсовывать.

Crystal 23.02.2020 21:58

Ответ: I.D.S. MONSTERS
 
Вложений: 1
Цитата:

Сообщение от ABTOMAT (Сообщение 317048)
В сегодняшних реалиях можно не экономить и тупо каждую клетку отдельным мешем делать.
Если очень хочешь запариться с генерацией сетки, то в Юнити тоже так можно, да (есть туторы и т.д.).
Можешь также сделать плейн и на него клетчатую текстуру. А если какую-то клетку надо выделить, то тогда полигональный квадратик туда подсовывать.

В данный момент уже сделана такая текстура клетки, и затайлена на плейн.
Этот плейн будем юзать для пика лучом, чтобы просчитать координаты клетки.
Скрин ниже.

Ну и переход в боевую сцену запилен, пока по пробелу.

Я пока не решил чем отрисовывать выделенные квадраты,
можно конечно отдельными плейнами, но разумнее всё-таки
это сделать единым мешем, и присваивать текстуру или цвет
нужным вершинам.

P.s. Я щас со стима установил HoMM 7, посмотрю как там у них выглядит это дело.

P.p.s. Кому интересно, как я это делал на блитце, код:


Код:

Graphics3D 1024,768,32,2
SetBuffer BackBuffer()

Global God = CreateCamera()
MoveEntity God, 5,10,5
RotateEntity God,90,0,0

Global P = CreatePlane()
EntityColor P,200,100,100

Global bermud = CreateMesh()
PositionEntity bermud,0,0,-0.4
EntityFX bermud,2
EntityPickMode bermud,2
Global Surface = CreateSurface(bermud)

Const prohod = 0, stena = 1

Global bermudX#=10
Global bermudZ#=10

Global XK#
Global ZK#

Global Close,Closed,Open

Dim massive(bermudX#,bermudZ#)
Dim massive2(bermudX#,bermudZ#)

For x = 0 To bermudX#-1
For y = 0 To bermudZ#-1

CreateBermud(x,y)

Next
Next

Function CreateBermud(q#,e#)

vertex_1 = AddVertex (Surface, -0.4+q#,0.5,0+e#, 1 ,0)
vertex_2 = AddVertex (Surface, 0.4+q#,0.5,0+e#, 1 ,0)
vertex_3 = AddVertex (Surface, -0.4+q#,0.5,0.8+e#, 0.5,1)
vertex_4 = AddVertex (Surface, 0.4+q#,0.5,0.8+e#, 0.5,1)

massive(q#,e#) = AddTriangle (Surface,vertex_1,vertex_3,vertex_2)
massive2(q#,e#) = AddTriangle (Surface,vertex_3,vertex_4,vertex_2)

End Function



While Not KeyHit(1)

If KeyDown(200) Then MoveEntity God,0,0,-1
If KeyDown(208) Then MoveEntity God,0,0,1

BermudControl()

XK#=Floor(Int(PickedX()))
ZK#=Floor(Int(PickedZ()))

UpdateWorld
RenderWorld
Text 0,10,"PickedX: "+Int(PickedX())
Text 0,30,"PickedZ: "+Int(PickedZ())

Text 0,50,"XK# "+Int(XK#)
Text 0,70,"ZK# "+Int(ZK#)

Flip

Wend
End

Function BermudControl()

CameraPick(God,MouseX(),MouseY())
If PickedEntity()=bermud And MouseHit(1) Then

v1#=Int(ZK#*4)+Int(+XK#*Int(bermudZ#)*4)
v2#=Int(v1+1)
v3#=Int(v2+1)
v4#=Int(v3+1)

If massive(bermudX#,bermudZ#) = prohod Then  Closed = 1
If massive(Int(PickedX()),Int(PickedZ())) = stena Then Open = 1

If Closed = 1 And Close = 0 Then
massive(Int(PickedX()),Int(PickedZ())) = stena
Closed = 0
Close = 1
VertexColor Surface,v1#,100,200,400
VertexColor Surface,v2#,100,200,400
VertexColor Surface,v3#,100,200,400
VertexColor Surface,v4#,100,200,400
End If


If Open = 1 Then
massive(Int(PickedX()),Int(PickedZ())) = prohod
Open = 0
Close = 0
VertexColor Surface,v1#,255,255,155
VertexColor Surface,v2#,255,255,155
VertexColor Surface,v3#,255,255,155
VertexColor Surface,v4#,255,255,155
End If

If Close = 1 Then Close = 0

End If

End Function

Я к ней потом на хорсе А* прикрутил, и PhysX, получился механически старкрафт 2 ))
Но блитц штука тупая как и хорс под блитцем, 25 фпс было с 50 юнитами ищущими путь.


Часовой пояс GMT +4, время: 07:45.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot