При разработке для VR на Unity у меня возникла проблема с TeleportArea, а именно, по умолчанию ее можно создать только прямоугольной.
Прямоугольная Телепортная Область Но это довольно неудобно, если на TeleportArea есть статический объект и игрок может в нем застрять.
Эту проблему можно решить и так, но решение будет выглядеть немного неудовлетворительно (ну лично для меня).
Решение, но у нас уже есть 4 TeleportArea Вроде бы проблема решена, но
- Вместо одной TeleportArea у нас их 4
- Такое решение сложно реализовать для большого помещения с большим количеством предметов.
- Это не дерьмо для Terrain
Некорректная работа с Terrain
Готовое решение
Есть готовое решение этой проблемы, но оно, к сожалению, для SteamVr 1.x. https://github.com/Flafla2/Vive-Teleporter , Поэтому я решил решить эту проблему, ведь.
не я один с ней страдал!
Решение этой проблемы
В Unity есть отличный генератор символов NavMesh, который генерирует карту местности для ИИ.
Запеченная NavMesh Почему бы не использовать его для создания TeleportArea. Итак, я сделал набросок скрипта для преобразования NavMesh в Mesh.
Зная, что TeleportArea использует MeshRender и MeshFilter для зоны движения, необходимо было сохранить его в папке проекта для дальнейших манипуляций.NavMeshTriangulation triangles = NavMesh.CalculateTriangulation(); Mesh mesh = new Mesh(); mesh.vertices = triangles.vertices; mesh.triangles = triangles.indices;
public static void SaveMesh(Mesh mesh, string name, bool makeNewInstance, bool optimizeMesh)
{
Mesh meshToSave = (makeNewInstance) ? Instantiate(mesh) : mesh;
if (optimizeMesh)
MeshUtility.Optimize(meshToSave);
AssetDatabase.CreateAsset(meshToSave, "Assets/GeneratedNavMeshes/" + name + ".
asset");
AssetDatabase.SaveAssets();
}
Я разработал этот инструмент как EditorWindow. [CustomEditor(typeof(NaveMeshToMeshGenerator))]
public class NavMeshToMeshEditor : Editor
{
public override void OnInspectorGUI()
{
NaveMeshToMeshGenerator now = (NaveMeshToMeshGenerator) target;
GUILayout.Label("Created by LivelyPuer https://github.com/LivelyPuer ");
now.BakeNaveMesh = GUILayout.Toggle(now.BakeNaveMesh, "Bake NavMesh", EditorStyles.toggle);
if (GUILayout.Button("GenerateMesh"))
{
string curScene = EditorSceneManager.GetActiveScene().
name; if (now.BakeNaveMesh) { NavMeshBuilder.BuildNavMesh(); } NavMeshTriangulation triangles = NavMesh.CalculateTriangulation(); Mesh mesh = new Mesh(); mesh.vertices = triangles.vertices; mesh.triangles = triangles.indices; SaveMesh(mesh, "Mesh" + curScene, true, false); MeshCollider now_Mesh = now.GetComponent<MeshCollider>(); now_Mesh.sharedMesh = mesh; MeshFilter nowMeshFilter = now.GetComponent<MeshFilter>(); nowMeshFilter.mesh = mesh; Debug.Log("TeleportArea was created"); } } public static void SaveMesh(Mesh mesh, string name, bool makeNewInstance, bool optimizeMesh) { Mesh meshToSave = (makeNewInstance) ? Instantiate(mesh) : mesh; if (optimizeMesh) MeshUtility.Optimize(meshToSave); AssetDatabase.CreateAsset(meshToSave, "Assets/GeneratedNavMeshes/" + name + ".
asset");
AssetDatabase.SaveAssets();
}
}
Как это использовать
- Загрузите последнюю версию с github https://github.com/LivelyPuer/NavMeshToTeleportArea
- Импортируйте его в Unity после установки пакета SteamVR 2.x.
- Создание комнаты
Украшение комнаты 4. Добавьте Collider ко всем статическим объектам и установите флажок Статический.
Статический 5. Добавьте в сцену префаб плеера SteamVR.
6. Открыть в окне/NavMesh в сетку 7. Выберите настройки TeleportArea.
8. В открывшемся окне нажмите кнопку «Сформировать».
9. На сцене появятся 2 объекта: 1. Телепортация (система движения для SteamVR) 2. Наша сгенерированная TeleportArea 10. Все готово! Наш готовый результат: Спасибо за прочтение статьи, все предложения по дальнейшему улучшению системы приветствуются в комментариях.
Готовый проект можно найти на github. Теги: #игры #Разработка игр #vr #Разработка для AR и VR #unity #AR и VR #pc #unity3d #navmesh #3v
-
Если Seagate Запылится...
19 Oct, 24 -
Фонд Ржавчины
19 Oct, 24 -
Временное Заявление И Для Чего Оно Нужно
19 Oct, 24 -
Каждому По-Своему
19 Oct, 24 -
С# Для Начинающих. Лекция 1. Введение
19 Oct, 24 -
Пост О Небольших Видеоиграх
19 Oct, 24