>>46307 Ну, во-первых, в Юнити просто по его архитектуре каждый движущийся на экране спрайт, появляющийся из ниоткуда (инстанцированный) представляется объектом, и именно эти объекты клонируются в левой колонке - я даже не знаю, как от этого уйти. Для каждого из них в первой карте у меня был соответствующий ему экземпляр моего самописного класса, хранящий параметры пули - надо полагать, ты хочешь избавиться от них. В этой карте мне уже не потребовалось создавать по объекту на пулю, здесь у меня один объект на волну. Волны - условные горизонтальные линии, движущиеся равномерно вниз, относительно которых рисуется обычная синусоида. Вот класс:
public class wave{
public float height, phase;
public bool type;
public List<GameObject> bsprites;
public wave(float height, bool type){
this.height = height;
this.type = type;
this.phase = 0;
this.bsprites = new List<GameObject> ();
}
}
Height - вертикальное расстояние от волны до верхнего края экрана, type определяет направление движения и жёлто-зелёность, фаза - фаза и есть, меняется по мере движения и задаёт движение шариков по волне, List<GameObject> bsprites - список тех самых юнити-объектов. Храним List этих волн, каждые 1,2 секунды инстанцируем новую, прибиваем те, у которых height вышла за пределы экрана.
При создании новой волны рисуем первичную синусоиду
wave w = new wave (vert
scrsize_y + 1, type);
type = !type;
waves.Add (w);
for (float c = -(horiz
scrsize
x + overlap * 3 * Mathf.PI); c < horizscr
sizex + overlap * 3 * Mathf.PI; c += horiz
scrsize_x/bulletsinwave) {
point.x = c;
point.y = w.height + Mathf.Sin(1.3f * c);
onebullet = Instantiate(prefabbullet, point, Quaternion.identity) as GameObject;
if (w.type)
onebullet.GetComponent<SpriteRenderer> ().sprite = yellow;
w.bsprites.Add(onebullet);
}
В каждом кадре смещаем сначала видимое положение пуль, потом параметры волны
foreach (var w in waves) {
for (int s = 0; s < w.bsprites.Count; s++){
var pos = w.bsprites[s].transform.position;
pos.x = -(horiz
scrsize
x + overlap * 3 * Mathf.PI) + overlap * w.phase + s * horizscr
sizex/bulletsinwave;
pos.y = w.height + Mathf.Sin(1.3f * (s + w.phase));
w.bsprites[s].transform.position = pos;
}
w.phase = (w.type ? w.phase + 0.01f : w.phase - 0.01f);
w.height -= 0.01f;
}
и удаляем отработавшие своё волны
for (int c = 0; c < waves.Count; c++) {
if (waves[c].height < -2 * vert
scrsize_y){
foreach (var s in waves[c].bsprites)
Destroy(s);
waves.RemoveAt(c);
}
}
Преимущество этого метода - простота кода и наглядность. Сложное движение пуль разбито на ряд простых движений - равномерное движение волны вниз, равномерное движение пуль вбок, вертикальное качание пуль по синусоиде. Чтобы знать, куда в следующем кадре должна двинуться пуля, недостаточно знать её координаты - надо знать волну, к которой она приписана, знать параметры height, phase и type этой волны, потому что все они используются при расчёте сдвига на следующий кадр. Может, конечно, можно исхитриться и сделать по-твоему (я не понимаю, что из себя представляет то, что ты называешь "поведением"), но код будет сложнее и малопонятнее, по-моему.
Короче, если совсем кратко, я не байтоёб и пользуюсь всеми преимуществами ООП.