Безье вдоль поверхности местности

Вы редко создаете новый экземпляр класса коллекции в классе. Создайте его один раз и очистите его, а не создайте новый список. (и использовать ObservableCollection, поскольку он уже унаследовал интерфейс INotifyCollectionChanged )

private readonly ObservableCollection list;
public ctor() {
    list = new ObservableCollection();
    list.CollectionChanged += listChanged;
}

public ObservableCollection List { get { return list; } }

public void Clear() { list.Clear(); }

private void listChanged(object sender, NotifyCollectionChangedEventArgs args) {
   // list changed
}

Таким образом, вам нужно только один раз подключить события и выполнить «сброс», вызвав метод clear вместо того, чтобы проверять значение null или равенство первому списку в наборе доступа для свойства.

0
задан dan_wipf 11 March 2019 в 14:08
поделиться

1 ответ

Во-первых, я бы рекомендовал использовать центростремительный сплайн Catmull-Rom , потому что он следует точным точкам и требует меньше точек для генерации (также рисует только между p1 и p2), но я не знаю, что вы хотите добиться этого:

Я бы преобразовал ваш Безье в 2-мерный Безье и работал бы с ним только в 2-мерном пространстве, а затем, когда вы рисуете (визуализируете), вы присваиваете ему значение Y, используя https: //docs.unity3d.com/ScriptReference/Terrain.SampleHeight.html

Я делаю это со своими сплайнами, и это дает довольно точный сплайн в конце (генерация дороги)

[119 ] ОБРАТИТЕ ВНИМАНИЕ !: Чтобы неявное преобразование Vector2 и Vector3 не соответствовало вашим потребностям, вам нужно добавить метод расширения для преобразования Vector3 в Vector2 :) (Vector (x, y, z) будет Vector (x, y), но вам нужен Вектор (x, z))

Редактировать 1:

Пример кода, как считывать фактическую высоту местности через Terrain.SampleHeight(); по координате Vector2 что вы уверены, что выше ландшафта, если Vector2 не выше terrain он вернет вам ноль или высоту ландшафта шкафов, так что я не уверен, какой атм (не могу проверить сейчас):)

public static float GetPoint_On_Terrain(Vector2 point){
    float terrainHeightAtPoint = Terrain.activeTerrain.SampleHeight(new Vector3(point.x, 0, point.y));
    return new Vector3(point.x, terrainHeightAtPoint,point.y);
}
0
ответ дан Menyus 11 March 2019 в 14:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: