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

Подъехал новый билд:ТЫК

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

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


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

Пожалуйста, скрой простыни кода под спойлер!
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);
        }

    }
}
__________________
Проект "Deathbring World - Rangers" и его финансовая поддержка:
https://boosty.to/deathbringrangers

Я на - TWITCH
Канал на YouTube
(Offline)
 
Ответить с цитированием