Проблема в том что сетка колайдера не обновляется. То есть я нахожу вершины которые задеваю кликом непосредственно из RaycastHit.Point. Значит мне нужно обновлять колайдер после каждого деформирования. как это можно сделать?
Сообщение отредактировал defGMDefeloper - Вторник, 25 Сентября 2018, 18:08
Разбросать точку прибития для разных юнитов?Написать свой алгоритм поиска пути? Начинать движение сначало юнитами которые ближе к точке прибития? Сделать пешеходам разную скорость,чтобы они пытались обойти друг друга?
Как все таки сделать 2 камеры. Сделал перспективу.Отключил слой с UI. Сделал ортогональную .Отключил все кроме UI,сделал Depth Only и Depth на 1. Не работает.Даже если выключить ортогональную видно UI Что я упустил?
Сообщение отредактировал defGMDefeloper - Воскресенье, 04 Марта 2018, 18:09
Да есть одна.Начинаю читать файл.Пишу offset++.ПОтом когда доходит до строчки которая содержит кол-во звезд в группе,мозг не хочет работать.Мб я прост уже закодился). Вот проблема в чем.Сделал такой редактор.Загружаешь картинку галактики - он строить карту пути по этой картинке(заполняет массив областями и регионами где могут распологаться звезды),на основе данных о цвете пикселя. Кол-во групп в областях - разное.как и кол-во планет вокруг звезды.И вот пока посчитаешь смещение вплоть до самой нижний иерархии мозг дымить начинает =( Теперь на выбор 2 фигни.Либо записывать кол-во планет рядом со звездами либо перебирать файл полностью.
Добавлено (02 Марта 2018, 15:21) --------------------------------------------- Сори,но я не понял в чем вообще прикол?Во первых пришлось создавать сериализируемые структуры для вектора цвета и квартертиона.В добавок ко всему бинарный файл будет весить гораздо больше.Ибо он записывает названия сериализируемых структур и ещё много всякой фигни.То что весило 160 кб теперь весит мегабайт.И это я ток самое основное запилил. Не нужно быть великим математиком чтоб понять что то что весило бы гиг будет весить 6 гиг
Сообщение отредактировал defGMDefeloper - Пятница, 02 Марта 2018, 15:28
Я не понимаю как с ним работать.Данные должны загружаются не последовательно,а значит нужны какие-то указатели.Я хотел использовать в качестве них директории внутри архива.Как это можно сделать с помощью бинарного файла?
Тебе не нужно сжатие, у тебя данные несжимаемые Кроме того, гигабайт на диске это ерунда
Вы не поняли.Что сохранять это понятно.Файлов будет 500-1000 как вы и сказали.Я не об этом.А о том что 500 файлов в 1 папке выглядит как минимум неаккуратно).Как запихнуть это все в архив,без сжатия само собой.Чтоб он работал как директория,но при этом не являлся папкой.
Прочитал про ScriptableObject.Вы меня не совсем поняли.Объекты хранят совершенно разную информацию,и таких объектов много.Более того управление происходит из 1 скрипта.И информация о каждом объекте хранится в 1 экземпляре,зачем тогда ScriptableObject? Объем этой информации может превышать 1 гб(в совокупности).Нужно сделать архив с данными и выгружать их по мере использовании.Эти данные разные и их много.Речь о том как сделать архив с этими данными,и как вытряхивать из него нужны данные.
AssetBundle не подходит ибо хранить информацию о миллионе однотипных объектов,нету смысла.
Цитата
Объекты хранят совершенно разную информацию
Цитата
однотипных объектов
Если кто запутался,поясню.Разные координаты,цвет. Зачем сохранять объект полностью если они однотипные и можно просто сохранить координаты,имя,цвет(1 цифрой,цвета - неизменный массив).Это инфа о звездах если что. Но из-за того что таких объектов очень много(в среднем пол миллиона),хранить все это в ОП скажем так напряжно.В добавок есть ещё планеты,а там ой ой ой инфы.Карта высот ,объекты и т.д.Ужс.Гиг данных.Их нужно подгружать только по необходимости. Следовательно лучше сделать архив и в нем сделать директории.и вот именно к ним и обращятся.
И тут 2 вопроса,на которых я в нете ответа не нашел. Как сделать архив?.Потому что на практике эти библиотеки не содержат тех классов которые описаны в туториале.
Код
using System.IO; using System.IO.Compression;
За ранее спасибо =)
Сообщение отредактировал defGMDefeloper - Среда, 28 Февраля 2018, 14:30
Загружаю данные из файла в структуры.У меня карта разбита на регионы,группы и объекты в них,а также доп. инфа о объектах(модель,текстуры и т.д) Объектов достаточно много,а значит хранить все это в оп не рационально. Скажем файл с данными о регионах и группах хранит достаточно мало данных,только координаты,а вот объекты лучше подгружать по мере использования.Как это сделать?. Объекты при этом лучше хранить в 1 файле.В чем-то вроде архива
Используй линейную интерполяцию . Mathf.Lerp добавь переменную time (коефициент интерполяции) и меняй её от 1 до 0; после изменения пиши Mathf.Clamp01(time); Я всегда так делаю.Ибо оператор == работает не точно,сам проверял. Скажем я делал проверку на число и оно останавливалось на тысячных,что мне не подходит,ибо мне нужно точно. Старайся избегать if в принципе.делай код более линейным.
Сообщение отредактировал defGMDefeloper - Воскресенье, 25 Февраля 2018, 18:06
Я уже писал ранее,но видимо старые темы никто не читает).Я хочу сделать путешествия в космосе максимально динамичными.В Spore когда приближаешься к солнечной с-ме или к планете загружается новая сцена,идет загрузка всех данных .Я хочу сделать чтобы это все происходило в реальном времени.Застрял на планетах.Как это можно реализовать?.Проблема в том что у них изначально очень маленький масштаб. 0.3-0.5.Из-за этого камера смотрит на планету целиком.Как можно подстроить камеру под маленькие масштабы?
Сообщение отредактировал defGMDefeloper - Четверг, 22 Февраля 2018, 14:03
Структуру выровнял,и правда страшно выглядела)),но новая проблемка. sqrMagnitude мне выдает заоблачные цифры.Из-за того что масштабы достаточно большие(.
Ай,старый прикол,не правидёшь.Если Public оно ток в инспекторе меняется. Сделал чтоб при вход в солнечную систему создавались планеты и крутились вокруг звезды.
Код
IEnumerator _planetController(int r, int s)//[PLANET] { float rotation = 0; for (int i = 0; i < stars[r, s].planet.Length; i++) { GameObject new_ = Instantiate(planetPrefab, _star.transform); new_.transform.localScale = Vector3.one * stars[r, s].planet[i].position.scale; } while (true) { yield return new WaitForFixedUpdate(); for (int i = 0; i < stars[r, s].planet.Length; i++) { rotation += 0.025f * stars[r, s].planet[i].position.scale; Quaternion angle_ = Quaternion.Euler(0, stars[r, s].planet[i].position.angle + (rotation * (stars[r, s].planet[i].position.orb % 2 == 0 ? 1 : -1)), 0); Vector3 orb_ = new Vector3(0, 0, stars[r, s].planet[i].position.orb + 1.25f); _star.transform.GetChild(i).position = angle_ * orb_ + stars[r, s].position; } if (field == 0)//камера в космосе break; } StopCoroutine(planetController); }
Как запихнуть в 1 цикл я не придумал =(.Разве что bool[] создавать.
ВАЖНО очень много обращений к transform.
Код
sw.WriteLine(load.target.transform.gameObject.name); sw.WriteLine(load.ship.transform.position.x); sw.WriteLine(load.ship.transform.position.y); sw.WriteLine(load.ship.transform.position.z); for (int i = 0; i < load.starrange.Count; i++) { if (!load.starrange[i].isGenerate) continue; stars.WriteLine(i); for (int g = 0; g < galaxy._roundLayer; g++) { stars.WriteLine(load.stars[i, g].starName); stars.WriteLine(load.stars[i, g].position.x); stars.WriteLine(load.stars[i, g].position.y); stars.WriteLine(load.stars[i, g].position.z); stars.WriteLine(load.stars[i, g].StarType); } }
Вот код,к примеру.Нужно ли создавать предварительно ссылку перед всеми этими обращениями,или это никак не влияет на производительность?
Сообщение отредактировал defGMDefeloper - Вторник, 20 Февраля 2018, 21:17
Используй везде не его, а sqrMagnitude. Он гораздо быстрее. Правда при этом все сравнения нужно менять.
Да у меня дистанция практически везде - это коефициент линейной интерполяции(текущая на максимальную),было 3 остался один.Два заменил на -offset.z.Зачем считать расстояние до камеры если оно уже есть).Тупанул.Остался 1.Т.к он сравнивается с константами- ничиго переписывать и не нужно. А что насчет сктруктур?Как лучше сделать. Трехэтажные структуры эт норм?(Star.Planet.Sputnik)
Сообщение отредактировал defGMDefeloper - Вторник, 20 Февраля 2018, 20:15
Там ещё есть структуры.Если иерархию не разделять можно запутаться).По крайней мере я пару раз запутался.Впрочем,это не совсем по теме)И комментарии на fps не влияют никак
Сообщение отредактировал defGMDefeloper - Вторник, 20 Февраля 2018, 18:46
Моя главная проблема в том что я сначало пишу код,а потом его переделываю Вот например
Код
public struct Stars{ public string starName; public int StarType;// public Vector3 position; public Transform transform; public MeshRenderer mrend_; public Animation anim_; public Collider coll_; }
public Vector3 position; public Transform transform; нафига 2 раза хранить позицию спросите вы? Звезды загружается из файла сохранения(координаты,цвет и т.д). Логично будет написать transform.position = ReadLine... Но не тут то было .Есть 2 метода: Код
Первый инициализирует структуру по данным в файле,второй создает обьект и дополняет эти данные.Получается я не могу сразу записать координаты в несуществующий transform Можно ли как -то сделать не криво?).А то получается координаты хранятся 2 раза. И ещё кое что.
Код
IEnumerator _StarDraw() { float dist2ship, /*-offset.z,*/star2cam, k, f; Material mat_; Color color_; while (true) { f = Mathf.Lerp(0.5f, 1, Vector3.Distance(ship.transform.position, cam.position) / solarsystem); for (int i = 0; i < starrange.Count; i++) { dist2ship = Vector3.Distance(starrange[i].position, ship.transform.position); // -offset.z = Vector3.Distance(starrange[i].position, cam.position); switch (field) { case Field.Space: Destroy(_star); if (starrange[i].isDrawing[0] = dist2ship < drawRange[0] && -offset.z < LayerDis[0]) { if (!starrange[i].isGenerate) { _generateStars(i); StartCoroutine(CreateStars(i)); break; } starrange[i].isDrawing[2] = dist2ship < drawRange[2] && -offset.z < LayerDis[2]; starrange[i].isDrawing[1] = starrange[i].isDrawing[2] ? true : dist2ship < drawRange[1] && -offset.z < LayerDis[1]; for (int c = 0; c < starsPrefab2D.Length; c++) { if (starrange[i].material[c] == null) continue; float distance = Mathf.Lerp(drawRange[_typeIdx(c)], drawRange[2], dist2ship / drawRange[2]); k = (1 - -offset.z / LayerDis[_typeIdx(c)]) * (1 - dist2ship / distance) * (spaceMenu_.uiActive ? 0.25f : 1f); mat_ = starrange[i].material[c]; color_ = mat_.GetColor("_TintColor"); mat_.SetColor("_TintColor", new Vector4(color_.r, color_.g, color_.b, k)); } for (int s = 0; s < _roundLayer; s++) { int idx = _typeIdx(stars[i, s].StarType); if (!starrange[i].isDrawing[idx]) continue; stars[i, s].mrend_.enabled = starrange[i].isDrawing[idx]; stars[i, s].anim_.enabled = starrange[i].isDrawing[idx]; stars[i, s].transform.LookAt(cam.position); star2cam = Vector3.Distance(stars[i, s].position, cam.position); stars[i,s].coll_.enabled = star2cam<flyDist; float scale = star2cam/ _radius; stars[i, s].transform.localScale = Vector3.one*scale; } } else { if (!starrange[i].isGenerate) continue; if (dist2ship > 1000 && Cleaner == null) { Cleaner = StartCoroutine(_clearStars(i)); continue; } if (starrange[i].isDrawing[0]) { for (int s = 0; s < _roundLayer; s++) { if (!starrange[i].isGenerate) break; if (stars[i, s].transform == null) break; stars[i, s].mrend_.enabled = false; stars[i, s].anim_.enabled = false; stars[i, s].coll_.enabled = false; } starrange[i].isDrawing[0] = false; } } break; case Field.Solar_System: if (dist2ship < drawRange[2]) { for (int s = 0; s < _roundLayer; s++) { if (stars[i, s].transform == null) break; if (!starrange[i].isDrawing[_typeIdx(stars[i, s].StarType)]) continue; if (stars[i, s].mrend_.enabled) { stars[i, s].transform.LookAt(cam.position); float scale = Vector3.Distance(stars[i, s].position, cam.position) / _radius * f; stars[i, s].transform.localScale = Vector3.one*scale; } if (_star == null && target == null ? false : target.position == stars[i, s].position) _star = Instantiate(starsPrefab3D[stars[i, s].StarType], stars[i, s].position, Quaternion.identity); } } break; } } yield return new WaitForFixedUpdate(); }
Корутин который отвечает за отрисовку звезд.Внутри запускается другие три:
Код
public void _generateStars(int i) { starrange[i].isGenerate = true; for (int g = 0; g < _roundLayer; g++) { int type = UnityEngine.Random.Range(0, 8); Vector3 _v = _GeneratePos(i); string gName = main._generateName(); stars[i,g] = _newStarInfoFrom(gName,_v,type); } }
Код
IEnumerator CreateStars(int i) { for (int g = 0; g < _roundLayer; g++) { GameObject new_ = Instantiate(starsPrefab2D[stars[i, g].StarType], stars[i, g].position, Quaternion.identity); stars[i, g] = _newStarInfoFrom(stars[i, g],new_); Material globalMaterial = starrange[i].material[stars[i, g].StarType]; Material localMaterial = new_.transform.GetChild(0).GetChild(0).GetComponent<Renderer>().material; if (globalMaterial == null) globalMaterial = localMaterial; else localMaterial = globalMaterial; starrange[i].material[stars[i, g].StarType] = globalMaterial; new_.transform.GetChild(0).GetChild(0).GetComponent<Renderer>().material = localMaterial; new_.gameObject.name = stars[i, g].starName; yield return new WaitForFixedUpdate(); } }
Код
IEnumerator _clearStars(int i)//Не стоит скапливаться обьектам { starrange[i].isGenerate = false; for(int s = 0;s<_roundLayer;s++) { yield return new WaitForFixedUpdate(); Destroy(stars[i,s].transform.gameObject); } StopCoroutine(Cleaner); Cleaner = null; }
Смешно то,что Масштаб и поворот 3д плайна с текстурой,быстрее чем Camera.main.WorldToScreenPoint Что можно убрать/переписать.Самую большую нагрузку дают Vector3.Distance и неявное обращение ==null. Как лучше в плане производительности:
Код
public struct Star { public string starName; public int StarType; public Vector3 position; public Transform transform; public MeshRenderer mrend_; // public Animation anim_; public Collider coll_; public Planet[] planet; public bool[] orbIsBusy; //=============== public class Planet { public string planetName; public MeshRenderer mrend_; public localPos position;
public struct localPos { public float angle, scale; public int orb;