ну для начала.Рыб перебирать не обязательно. Создал fishCount++; Поймал или ещё че с ней стало fishCount--; Tranform[] FishSpawnPos;//Массив с координатами рыбы Корутин IENumerator FishSpawn() { while(true) { yield return new WaitForSecond(1f);//Будем проверять нужна ли новая рыба раз в 1 секунду. if(fishCount<5) { //создаешь рыбу fishCount++; } } }
ну мб костыль ,но такой вариант public class FishTransform{ public Transform point; public bool isSpawnedHere=false; }
while(true) { if(!FishTransforms[randomTrans].isSpawnedHere) { fish = Instantiate(fishPrefab, FishTransforms[randomTrans].point.position, Quaternion.identity) as GameObject; FishTransforms[randomTrans].isSpawnedHere = true; break; } }
p.S у тя 3 точки спавна и как понял 5 рыб.Если рыбы у тя не отплывают от точки спавна тогд все предельно ясно. 1.Сделать больше точек спавна 2.Делать через корутин и ждать пока рыба отплывет -потом спавнить новую
Сообщение отредактировал defGMDefeloper - Понедельник, 22 Января 2018, 18:08
ну добавляй в list не холсты,а вот эти синие и оранжевые UI-шки,и выключай компонент ,к примеру Image,тогда он не будет отображаться
Добавлено (22 Января 2018, 17:45) --------------------------------------------- Ещё можно создать 2 камеры и переключать между ними,одна камера рендерит только синий канвас,другая только оранжевый.способов вообще много
Добавлено (22 Января 2018, 17:49) --------------------------------------------- А конкретней можно?Что ты хочешь получить в конечном результате?Или это ты прост учишся
Сообщение отредактировал defGMDefeloper - Понедельник, 22 Января 2018, 17:49
Перетащил все в 1 скрипт.Фпс больше не стал(.Видимо надо делать внутри корутина алгоритмы чтобы отсеивать все ненужные звезды и посмотреть ещё что такое паралельные циклы
например ,чем ближе камера к точке обзора(цели) тем меньше радиус на котором звезды "активны" по сути чем она ниже опускается тем меньше смысла отрисовывать звезды которые заслоняют друг друга.И выглядит не очень и нагрузка лишняя.Короче мороки много =(
Добавлено (19 Января 2018, 19:03) --------------------------------------------- И кстати.Как сделать проверку что элемент UI в области экрана? Пробовал Rect.Contains - не вышло(.хотя мб вообще не стоит делать такую проверку(идеи чет закончились(
Сообщение отредактировал defGMDefeloper - Пятница, 19 Января 2018, 17:53
IEnumerator _StarDraw(float maxDist_MKG, float maxDist_AFB2, float maxDist_OB1) { while (true) { float[] maxDist_ = {maxDist_OB1,maxDist_OB1,maxDist_AFB2,maxDist_AFB2,maxDist_AFB2,maxDist_MKG,maxDist_MKG,maxDist_MKG}; float d = Vector3.Distance(lookAt, camP.position); for (int i = 0; i < stars.Length; i++) {
if (d > maxDist_[i]) { if (StarLayers[i]) StarLayers[i] = false;
} else { if (!StarLayers[i]) StarLayers[i] = true; if(i==0) continue; Material mK = stars[i].img_.material; Color tc = mK.GetColor("_TintColor"); float k = 0.5f*(0.9f - (d / maxDist_[i]*d / maxDist_[i])); mK.SetColor("_TintColor",new Vector4(tc.r,tc.g,tc.b,k)); } } yield return new WaitForFixedUpdate(); } }
Не,конечно нет) Это вызывается в корутине ,и только для целых массивов звезд,разбитых по размеру.А проверка на дистанцию проходит только если Layer==true.Но за идею спасибо.Чутка переделать.Сделать все в 1 скрипте. stars.Length - массив из 8 звезд(типов) это клас хранящий префаб,для создания и Image(UI). Если менять материал префаба,меняет материал на всех обьектах.
Добавлено (19 Января 2018, 15:09) --------------------------------------------- А World Space не подходит.Звезды то 2д картинки,но камера двигается в трехмерном пространстве. Canvas.LookAt(camera) плохо.ибо повернуть холст с 10к дочерних обьектов.. звезда[1-10к].LookAt(camera) ничем не лучше варианта с преобразованием координат,только там я знаю точные координаты ,а в World Space координаты масштабируются в месте с холстом и короч не очень удобно
Сообщение отредактировал defGMDefeloper - Пятница, 19 Января 2018, 15:06
Для начала убери в постоянно обновляемых методах создание новых элементов типа: new Vector3(v.x, v.y, 0)
Это необходимый минимум. если на Jave,я его не использую,не могу быть уверен,пишется так
transform.position.x+= значение,то это лишь упрощение.На самом деле он также создает новый тип,Vector3 ,просто он это делает за вас.
Vector3 v = Camera.main.WorldToScreenPoint(star_.position); t_.position = new Vector3(v.x, v.y, 0); А то что я создал вектор v,если не ошибаюсь для компилятора это не особо важно,ведь я не создал новый тип. А что на счет Camera.main.WorldToScreenPoint(star_.position); - без этого ниче работать не будет.Метод создает проекцию координат из трехмерного пространства на двухмерное(экранное),т.к все "звезды" - это картинки,спрайты.
P.S пришлось создать,ибо по какой-то причине если z у UI Image больше или равно 1000 он просто пропадает.Объяснит кто почему так происходит?я ничиго не нашел
А на счет шейдеров плиз попродробней,я не особов них смыслю.Даже не знаю с чего начать поиск.
Читал я как можно оптимизировать код,но эт не подходит все.Как по мне в коде все по минимуму,поправте если ошибаюсь.Тут нужно чет глобальное ,мб кто раньше делал что подобное и нашел более оптимальное решение,а может вообще использовал не UI. И ещё раз на счет того,что красным,если кто знает плз поясните.
Сообщение отредактировал defGMDefeloper - Пятница, 19 Января 2018, 14:10
Создаю игру на подобии spore. Кто играл в spore знает что там очень много звезд(100к ,если spore.wiki не врет :3).Конечно единовременно рендерится не все(но наблюдения показывает что все равно рендерится достаточно много). На каждом обьекте есть скрипт:
На таких масштабах каждая запятая важна.Сейчас спокойно на одной сцене существует 10к звезд.Я меняю альфа канал текстуры по мере отдаления камеры от точки куда она направлена:
Код
Material mK = stars[i].img_.material; Color tc = mK.GetColor("_TintColor"); float k = 0.5f*(0.9f - (d / maxDist_[i]*d / maxDist_[i])); mK.SetColor("_TintColor",new Vector4(tc.r,tc.g,tc.b,k));
Вот пару картинок:
[color=red]=>
Ну.и собсвенно в чем проблема .Не смотря на все усилия fps низкий при том что рендерится лишь 10 часть от желаемого .И на 3 изображение при движении камеры звезды те что относительно далеко буд-то двигаются,что выглядит не очень реалистично и красиво,хотя и с точки зрения математики все правильно). 1.Как можно повысить производительность? 2.Как убрать " движение"?
Сообщение отредактировал defGMDefeloper - Пятница, 19 Января 2018, 00:19