Другие языки программирования и технологии

скрипт на траффик в игре на c# в unity

Тк разбираться с юнити и соответственно этим языком начал совсем недавно, прошу помочь с оптимизацией, и советом по дальнейшему написанию) суть игры заключается в управлении светофорами. следовательно каждый автомобиль должен "видеть" другой (как это сделать!!!!) также им необходимо пворачивать нормально. в этом скрипте я пока прописал только движение по оси у с остановками на каждом светофоре и уездом за край карты... вот собственно он сам. using UnityEngine;
using System.Collections;public class carmoving : MonoBehaviour {
public float carspeed = 10;
//отвечает за движение
// по х
private float prevpozx;
//по у
private float prevpozy;
//отвечает за ускорение
private int speedup;
//запуск отдельных блоков
public bool bmovingx;
public bool bmovingy;
private bool bbrakes;
private bool bturn;
//позиции перекрестков
public new Vector2 per1;
public new Vector2 per2;
public new Vector2 per3;
public new Vector2 per4;
public new Vector2 per5;
public new Vector2 per6;
//рачет рассояния тормоза
private int brakingx;
private int brakingy;
//перменныые позции перекрестка
float x;
float y;
//переменная медленного торможения
int i = 0;

void Start () {
speedup = 0;
bbrakes = false;
bturn = false;
//выяснение стартогового состояния
//НЕ РАБОТАЕТ
if (0 == 0) {
bmovingx = false;
bmovingy = true;}
else {
bmovingx = true;
bmovingy = false; }
y = per1.y;

}

// Update is called once per frame
void Update () {
//обеспеч равномерную работу скрипта
//разбитие для удобства
if (bmovingx == true) {
movingx ();
}
if (bmovingy == true) {
movingy ();
}
if (bbrakes == true) {
brakes ();
}
if (bturn == true) {
turn ();
}
//посоянный прощет расстояния до перекрестка
if (y-10<prevpozy&&prevpozy<y) {
bmovingy = false;
bbrakes = true;
} }

void movingy(){
//производим сдвиг
transform.position = new Vector3 (6, prevpozy + carspeed * Time.deltaTime, 0);
//расчитываем след шаг
prevpozy = prevpozy + carspeed * Time.deltaTime;
//создаем медленное ускорение if (speedup <= 10) {
speedup = speedup + 1;
} else {speedup = 0;
if (carspeed < 5) {
carspeed = carspeed + 1;
}
}
} void movingx(){ //производим сдвиг
transform.position = new Vector3 (6, prevpozy + carspeed * Time.deltaTime, 0);
//расчитываем след шаг
prevpozy = prevpozy + carspeed * Time.deltaTime;
//создаем медленное ускорение
if (speedup <= 10) {
speedup = speedup + 1;
} else {speedup = 0;
if (carspeed < 5) {
carspeed = carspeed + 1; }
} }
void brakes(){
if (prevpozy < y) {
if (carspeed >2) {
carspeedchanger();
transform.position = new Vector3 (6, prevpozy + carspeed*Time.deltaTime, 0);
prevpozy = prevpozy + carspeed*Time.deltaTime; } else {
transform.position = new Vector3 (6, prevpozy + carspeed*Time.deltaTime, 0);
prevpozy = prevpozy + carspeed*Time.deltaTime;
}
}
else {
bbrakes = false;
bmovingy = true;
y = per2.y;
}
}
void turn(){ }
void carspeedchanger(){
if(i<5){i++;}
else{
carspeed = carspeed - 1;
i = 0;} }}
Кроме элементарного расчёта следующей позиции в данном коде ничего не увидел.

На самом деле вопрос ставится так: НАСКОЛЬКО реалистичным вы хотите сделать трафик?

В самом примитивном случае вы из дороги делаете граф, по которому двигаются отрезки или точки.
Этот граф строится на основе полос движения.
Кроме расстояния до предыдущей машины, желаемой и разрешенной на данном участке скорости ничего не требуется.
Автомобиль двигается по замкнутому контуру и ускоряется если скорость меньше желаемой. Разумеется, если расстояние до предыдущей и ограничения скорости (светофоры, тип дороги и тп) позволяют.
Координата в потоке вообще линейная, она пересчитывается в реальные только при отображении.

Пример влияния светофора на скоростной режим:
- зелёный - без ограничений
- жёлтый - ускориться для близких (+10%), и понизить скорость (-15%) для чуть дальних.
- красный - останов (-100%) для близких, понизить существенно (-40%) для чуть дальних, сократить (-25%) для очень дальних.

То есть участок перед светофором разбивается на 3-4 части, которые характеризуются разным скоростным режимом.
Длину участков выбирать из условий длительности желтого и красного и базового скоростного режима:
- на +10% скорости невозможно проехать близкий отрезок
- на -40% скорости можно проехать дальний участок
Не забывайте взаимосвязь зелёного в одном направлении и красного в другом.

Начните моделировать с движения по "восьмёрке" - замкнутый путь без поворотов с одним перекрестком. Стартовые позиции случайно, скорость тоже (в пределах допуска и желания) .
Надеюсь, эксперимент будет увлекательным: можно поиграть длительностью светофоров, добавить "тракторы", тормозящие процесс движения.

Можно добавить:
- несколько полос с разными скоростными режимами
- выделенные полосы под спецтехнику
- фиксированные и свободные участки перестроения
- повороты на перекрестках с разных полос со своими светофорами
- неуправляемые перекрёстки
- выезд на встречку
- выход на обочину (стоянку) и вход в поток
- вероятность нарушения правил
- вероятность аварии, которая со временем исчезнет (после приезда спецтехники)
- мотоциклистов, пешеходов, оленей

Дерзайте. Это интересно само по себе.
Неизвестно Неизвестно
Неизвестно Неизвестно
11 112
Лучший ответ
Жекас Апа почему
Я обвешал машину невидимыми коллайдерами, и по ним машина понимала, куда ехать. Если колладер спереди задел другую машину - надо тормозить. Если коллайдер справа задел светофор, то проверяется цвет этого светофора. И так далее, много условий. Работало не плохо, хотя косяки тоже были