Моя главная проблема в том что я сначало пишу код,а потом его переделываю Вот например
Код
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;
Там ещё есть структуры.Если иерархию не разделять можно запутаться).По крайней мере я пару раз запутался.Впрочем,это не совсем по теме)И комментарии на fps не влияют никак
Сообщение отредактировал defGMDefeloper - Вторник, 20 Февраля 2018, 18:46
Используй везде не его, а sqrMagnitude. Он гораздо быстрее. Правда при этом все сравнения нужно менять.
Да у меня дистанция практически везде - это коефициент линейной интерполяции(текущая на максимальную),было 3 остался один.Два заменил на -offset.z.Зачем считать расстояние до камеры если оно уже есть).Тупанул.Остался 1.Т.к он сравнивается с константами- ничиго переписывать и не нужно. А что насчет сктруктур?Как лучше сделать. Трехэтажные структуры эт норм?(Star.Planet.Sputnik)
Сообщение отредактировал defGMDefeloper - Вторник, 20 Февраля 2018, 20:15
Для оптимизации, структуры можно передавать по ссылке, чтобы не копировать каждый раз Больше ничем помочь не могу потому что копаться в этом коде желания нет, отформатируй его хотя бы)
Цитата
Сразу видно, что они приватные.
Во-первых это не нужно, во-вторых код начинает выглядеть как говно (точнее как код на Си из 1990 годов), в-третьих разработчики языка рекомендуют этого не делать: https://docs.microsoft.com/en-us....entions DO NOT use underscores, hyphens, or any other nonalphanumeric characters. Впрочем, дело твое)
Структуру выровнял,и правда страшно выглядела)),но новая проблемка. 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