Вы редко создаете новый экземпляр класса коллекции в классе. Создайте его один раз и очистите его, а не создайте новый список. (и использовать 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 или равенство первому списку в наборе доступа для свойства.
Во-первых, я бы рекомендовал использовать центростремительный сплайн 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);
}