![](images/chestnut/misc/left.gif) |
Постмор Истории успешного завершения проекта.
Разрабы рассказывают, как к успеху шли. |
19.02.2020, 13:20
|
#31
|
Разработчик
Регистрация: 10.10.2008
Сообщений: 501
Написано 258 полезных сообщений (для 670 пользователей)
|
Ответ: I.D.S. MONSTERS
Супер беглый взгляд:
- можно не пускать луч каждый кадр, а только при нажатой кнопке
- можно постоянно использующиеся переменные завести 1 раз в start/awake
- вместо new Vector3() можно завести вектор шлюху и перезаписывать в нём значения
__________________
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо mauNgerS за это полезное сообщение:
|
|
19.02.2020, 13:38
|
#32
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: I.D.S. MONSTERS
//Определяем координаты персонажа ChelCoordinate = Chel.transform.position * Time.deltaTime;
|
Тут Дельта Тайм нинужен, в лог потом выводятся неверные данные.
В остальном не вижу причин, по которым может дёргаться.
Может, FPS просто скачет? Хотя какой должен быть комп чтобы скакало.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
19.02.2020, 17:34
|
#33
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от mauNgerS
Супер беглый взгляд:
- можно не пускать луч каждый кадр, а только при нажатой кнопке
- можно постоянно использующиеся переменные завести 1 раз в start/awake
- вместо new Vector3() можно завести вектор шлюху и перезаписывать в нём значения
|
Проорал ) Вектор шлюха )
Когда до оптимизации говнокода дойдёт, вспомню о совете.
Сам знаешь, код написан для того, чтобы постоянно его переписывать.
Луч пускается постоянно для отрисовки в окне сцены, чтобы я видел куда он падает.
Сообщение от ABTOMAT
Тут Дельта Тайм нинужен, в лог потом выводятся неверные данные.
В остальном не вижу причин, по которым может дёргаться.
Может, FPS просто скачет? Хотя какой должен быть комп чтобы скакало.
|
Да дельта тайм не нужен, это мусорный участок кода, я ожидал что заметишь, впадлу было стереть.
Оказалось дёргалось только в окне Game в Unity,
в билде было на тот момент всё нормально.
Перезагрузил комп, теперь и в юнити не дёргается.
Скоро ещё понадобятся тестеры, я пишу управление камерой а ля RTS.
Сегодня уже наверно билд с кодом выложу.
Последний раз редактировалось Crystal, 19.02.2020 в 18:43.
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо Crystal за это полезное сообщение:
|
|
19.02.2020, 20:15
|
#34
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Итак следующий билд.
RTS камера относительно готова.
Скачать ТЫК.
У камеры появился родительский пивот, который я двигаю "CamPapa".
Что умеет камера:
1. Двигаться в восьми направлениях, когда курсор доходит до края экрана.
2. Отдаляться и возвращаться обратно по пяти шагам колесом мышки.
3. Ориентироваться на местности по длине и ширине игрового уровня,
останавливая своё движение доходя до края.
(Размер игрового уровня сейчас равен размеру плейна).
Что камера не умеет:
Не умеет поворачиваться по осям. Во первых это функция
сомнительной нужности для геймдизайна моего проекта.
Во вторых, в данный момент если повернуть камеру,
то её ориентация в координатах игрового уровня
слетит к херам, превратившись из квадрата в неведомую
геометрическую фигуру. Чтобы поворачивать камеру,
придётся расчитывать ориентацию с учётом угла поворота
камеры, а это вам уже не 10 на 10 умножить так сказать,
придётся голову напрячь, возможно и реализую если потребуется.
Ограничение движения камеры коллизией с кубом, который натянут на уровень - не предлагать! слишком просто.
Говнокод управления камерой:
![](images/chestnut/misc/code_html.gif)
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;
}
}
Последний раз редактировалось Crystal, 21.02.2020 в 14:05.
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо Crystal за это полезное сообщение:
|
|
19.02.2020, 20:56
|
#35
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: I.D.S. MONSTERS
Всё робит, музыка играет.
Продолжай, прямо как в старые-добрые времена, когда на Булку выкладывали билды кто что делает (когда кто-то что-то делол).
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
|
|
20.02.2020, 00:01
|
#36
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,021
Написано 2,312 полезных сообщений (для 5,349 пользователей)
|
Ответ: I.D.S. MONSTERS
Работает, музыка играет.
Хочется что бы в будущем можно было кликнуть за границы карты и что бы персонаж пошёл в ту сторону до края карты.
Впрочем это может помешать, если случайным кликом потопаешь к врагу.
Можно как-то отключить у юнити запросы в интернет?
Каждый билд с кубиком стучится непонятно куда.
Наверное статистику с мира понитке собирают.
OBS почему-то долго начинает захват после запуска программы.
P. S. Хм-м... Возможно в будущем Булке понадобится возможность загружать видео вместо gif, или тег [video]. Впрочем тег и сейчас не помешает. Так, мысли в слух.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
20.02.2020, 01:54
|
#37
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от Arton
Работает, музыка играет.
Хочется что бы в будущем можно было кликнуть за границы карты и что бы персонаж пошёл в ту сторону до края карты.
Впрочем это может помешать, если случайным кликом потопаешь к врагу.
Можно как-то отключить у юнити запросы в интернет?
Каждый билд с кубиком стучится непонятно куда.
Наверное статистику с мира понитке собирают.
|
Хз куда он там стучится, может из-за того, что билд со статусом девелопмент.
В окне компилятора во вкладках ничего про отправку чего-либо куда-либо.
Наверно фирма шпионит за тем, как халявщики юзают их софт (я на бесплатной версии).
Про кликание за предел карты - реализовать могу, смысла не вижу.
В управлении персонажем намеренно будет отсутствовать ПП
(хоть он уже и есть встроенный в Unity).
|
(Offline)
|
|
20.02.2020, 14:11
|
#38
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,358
Написано 2,472 полезных сообщений (для 6,854 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от Crystal
Хз куда он там стучится, может из-за того, что билд со статусом девелопмент.
|
Проверь включена ли аналитика:
https://docs.unity3d.com/Manual/Unit...ticsSetup.html
Кроме того дев билды тоже открывают порт, но только для обмена данными с отладчиком - не опасно.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.02.2020, 05:32
|
#39
|
Терабайт исходников
Регистрация: 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) то телепортируем
на его координаты камеру, если не попал, значит нехрен
туда камеру двигать, и мы ничего не делаем.
Работает под любым углом поворота камеры.
Код:
![](images/chestnut/misc/code_html.gif)
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;
}
}
В коде могут присутствовать не мешающие мусорные элементы,
пол седьмого утра, мне спать пора, а не остатки прошлых
версий управления камерой подчищать )
Последний раз редактировалось Crystal, 21.02.2020 в 14:04.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Crystal за это полезное сообщение:
|
|
21.02.2020, 06:22
|
#40
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,021
Написано 2,312 полезных сообщений (для 5,349 пользователей)
|
Ответ: I.D.S. MONSTERS
Ох, а можно правую кнопку мыши для вращения? Колёсико жёсткое у меня и глючит
Баг выход за границы:
Если во время движения кубика кликнуть за границу поля, кубик отправится туда и остановившись будет глючено крутится на месте.
При условие что куб не двигается, за границы его отправить нельзя.
Сообщение от Crystal
Появился ещё один пивот "Susanin", он телепортируется под камеру,
далее двигается туда, куда мы хотели бы сместить камеру,
определяется находится ли сусанин в площади игрового уровня.
|
Э-э, так я не понял камеру сейчас двигать можно или нельзя?
Мне тоже спать пора
Про проблемы с камерой честно говоря не понял...
Пожалуйста, скрой простыни кода под спойлер!
|
(Offline)
|
|
21.02.2020, 09:45
|
#41
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от Arton
Ох, а можно правую кнопку мыши для вращения? Колёсико жёсткое у меня и глючит
Баг выход за границы:
Если во время движения кубика кликнуть за границу поля, кубик отправится туда и остановившись будет глючено крутится на месте.
При условие что куб не двигается, за границы его отправить нельзя.
Э-э, так я не понял камеру сейчас двигать можно или нельзя?
Мне тоже спать пора
Про проблемы с камерой честно говоря не понял...
Пожалуйста, скрой простыни кода под спойлер!
|
Лол, у меня колесо тоже глючит, правую кнопку сделаю спешл фо ю
разово в четвёртом билде.
Баг подкрался от туда, откуда не ждали. Решил на скорую руку
красоту навести, и сделать космос для билда из плейна,
а переименовать его забыл. Собственно у нас сейчас два
плейна в билде, вот куб с ума и сходит, решается заменой
имени ) Он же по имени объекта в который луч попал событие
запускает, где в точку пика прыгает навигатор, а за ним
летит куб.
Камеру двигать можно, как в реал тайм стратегии, касаясь
ею краёв экрана, двигать можно в 8 направлениях.
Границы перемещения камеры выставлены размерами
игрового уровня, а игровой уровень это у нас бежевый
плейн. У камеры есть невидимая нога, которая стоит впереди
неё, если она коснулась края игрового поля, то дальнейшее
движение (за его пределы) невозможно, специально
выставленное ограничение.
Проблем с камерой нет, есть проблемы с Unity, он вопреки
прописанной логики при особом обстоятельстве разово
выполняет действие, которое не должен выполнять вообще,
и баг этот я обошёл.
Тега спойлер на булке нет, в оффтоп пихать не хочу по тому, что не оффтоп.
В общем сейчас сделаю сборку под правую кнопку мыши
и без выхода кубика в космос.
Последний раз редактировалось Crystal, 21.02.2020 в 14:09.
|
(Offline)
|
|
21.02.2020, 14:03
|
#42
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Подъехал новый билд: ТЫК
Сообщение от Arton
Ох, а можно правую кнопку мыши для вращения? Колёсико жёсткое у меня и глючит
Баг выход за границы:
Если во время движения кубика кликнуть за границу поля, кубик отправится туда и остановившись будет глючено крутится на месте.
При условие что куб не двигается, за границы его отправить нельзя.
Э-э, так я не понял камеру сейчас двигать можно или нельзя?
Мне тоже спать пора
Про проблемы с камерой честно говоря не понял...
Пожалуйста, скрой простыни кода под спойлер!
|
1. В этот билд вращение камерой добавлено и на правую клавишу для тебя.
2. Баг был комплексный, не только второй плейн, но и недоработка кода.
Теперь переменная запоминающая в чей коллайдер мы ткнули
после проверки на нужный нам коллайдер заменяет в себе
имя коллайдера на слово "NiHuYa". Это было одной из проблем.
Следующая проблема была в том, что меня интересовали только
координаты падения луча на коллайдер, и персонаж двигался
к ним, теперь же у нас появились координаты навигатора,
и персонаж движется к ним, а не к координатам пика.
В общем 4 правки в коде.
3. Камера двигается в восьми направлениях касанием края экрана
мышкой. Движение камеры ограничено размерами игрового уровня,
она не может выйти за его пределы. У камеры есть невидимая нога,
и именно координаты этой ноги в площади игрового уровня
контролируются. Сама камера от своей ноги отодвинута немного назад.
А при повороте вращается именно нога, а не камера, она его
дочерний объект.
В общем тестите, буду благодарен за выявление новых багов.
Как просил, всё-таки большие коды теперь будут в оффтопе.
Код исправленной системы управления персонажем:
![](images/chestnut/misc/code_html.gif)
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);
}
}
}
|
(Offline)
|
|
22.02.2020, 19:47
|
#43
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Принимаю ваши советы, идеи и предложения по отрисовке
сетки игрового поля, по которой мы будем двигать монстров (а ля HoMM).
В блитце я создавал меш , квадраты отрисовывал полигонами повершинно (2 трианглы на квадрат),
с отступом от соседних квадратов. Короче сетка из цельного меша
была, а выделение ячейки делал перекрашиванием вершин.
В юнити как лучше реализовать визуализацию сетки?
Интересует самый дешёвый способ. Меш например был
дешёв, так как он один цельный объект, а не куча линий
рисуемых. Я также могу меш и тут создать, фигануть
его поверх плейна, и установить прозрачность процентов на 40.
Или прям по плейну текстурой рисовать?
P.s. Сетка будет не гексоганальная, так-как её использование в 3D игрухе бред полный,
такая годится только для изометрических игр с поворотом уровня на 45 градусов.
(И то бессмысленна, так как вместо восьми направлений движения оставляет нам 6.
Её используют вроде только для экономии 25% спрайтов на экране, и усложняют этим путь объекта.
Тут сетка будет как в неклассических героях, из квадратов.
|
(Offline)
|
|
23.02.2020, 17:14
|
#44
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: I.D.S. MONSTERS
![](images/chestnut/misc/citation.gif)
Сообщение от Crystal
Принимаю ваши советы, идеи и предложения по отрисовке
сетки игрового поля, по которой мы будем двигать монстров (а ля HoMM).
В блитце я создавал меш , квадраты отрисовывал полигонами повершинно (2 трианглы на квадрат),
с отступом от соседних квадратов. Короче сетка из цельного меша
была, а выделение ячейки делал перекрашиванием вершин.
В юнити как лучше реализовать визуализацию сетки?
Интересует самый дешёвый способ. Меш например был
дешёв, так как он один цельный объект, а не куча линий
рисуемых. Я также могу меш и тут создать, фигануть
его поверх плейна, и установить прозрачность процентов на 40.
Или прям по плейну текстурой рисовать?
P.s. Сетка будет не гексоганальная, так-как её использование в 3D игрухе бред полный,
такая годится только для изометрических игр с поворотом уровня на 45 градусов.
(И то бессмысленна, так как вместо восьми направлений движения оставляет нам 6.
Её используют вроде только для экономии 25% спрайтов на экране, и усложняют этим путь объекта.
Тут сетка будет как в неклассических героях, из квадратов.
|
В сегодняшних реалиях можно не экономить и тупо каждую клетку отдельным мешем делать.
Если очень хочешь запариться с генерацией сетки, то в Юнити тоже так можно, да (есть туторы и т.д.).
Можешь также сделать плейн и на него клетчатую текстуру. А если какую-то клетку надо выделить, то тогда полигональный квадратик туда подсовывать.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
23.02.2020, 21:58
|
#45
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от ABTOMAT
В сегодняшних реалиях можно не экономить и тупо каждую клетку отдельным мешем делать.
Если очень хочешь запариться с генерацией сетки, то в Юнити тоже так можно, да (есть туторы и т.д.).
Можешь также сделать плейн и на него клетчатую текстуру. А если какую-то клетку надо выделить, то тогда полигональный квадратик туда подсовывать.
|
В данный момент уже сделана такая текстура клетки, и затайлена на плейн.
Этот плейн будем юзать для пика лучом, чтобы просчитать координаты клетки.
Скрин ниже.
Ну и переход в боевую сцену запилен, пока по пробелу.
Я пока не решил чем отрисовывать выделенные квадраты,
можно конечно отдельными плейнами, но разумнее всё-таки
это сделать единым мешем, и присваивать текстуру или цвет
нужным вершинам.
P.s. Я щас со стима установил HoMM 7, посмотрю как там у них выглядит это дело.
P.p.s. Кому интересно, как я это делал на блитце, код:
![](images/chestnut/misc/code_html.gif)
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 юнитами ищущими путь.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:00.
|