Синтаксис:
Используется csharp
[SerializeField]
private Terrain _terrain;
private Vector3 _startPointBezier;
private Vector3 _endPointBezier;
private Vector3 _topLine;
private Vector3 _bottomLine;
private Random _rnd = new Random();
private Vector3[] _points = new Vector3[11];
private Vector3[] _tangents = new Vector3[11];
void Start()
{
int iswidth = _rnd.Next(0, 1);
if (iswidth == 0)
{
_startPointBezier = new Vector3(0,0, (float)_rnd.NextDouble());
_endPointBezier = new Vector3(1, 0, (float)_rnd.NextDouble());
if (_startPointBezier.z > _endPointBezier.z)
{
Vector3 tmp = _endPointBezier;
_endPointBezier = _startPointBezier;
_startPointBezier = tmp;
}
_topLine = new Vector3(1, 0, _startPointBezier.z);
_bottomLine = new Vector3(1, 0, _endPointBezier.z);
for (int i = 1; i < _points.Length - 1; i++)
{
_points[i] = new Vector3((float)(1) / 10 * i, 0, (float)(_rnd.Next((int)(_startPointBezier.z * 10), (int)(_endPointBezier.z * 10))) / 10);
}
}
else
{
_startPointBezier = new Vector3((float)_rnd.NextDouble(), 0, 0);
_endPointBezier = new Vector3((float)_rnd.NextDouble(), 0, 1);
if (_startPointBezier.x > _endPointBezier.x)
{
Vector3 tmp = _endPointBezier;
_endPointBezier = _startPointBezier;
_startPointBezier = tmp;
}
_topLine = new Vector3(_startPointBezier.x, 0, 1);
_bottomLine = new Vector3(_endPointBezier.x, 0, 1);
for (int i = 1; i < _points.Length - 1; i++)
{
_points[i] = new Vector3((float)(_rnd.Next((int)(_startPointBezier.x * 10), (int)(_endPointBezier.x * 10)) / 10), 0, (float)(1) / 10 * i);
}
}
_points[0] = _startPointBezier;
_points[_points.Length - 1] = _endPointBezier;
for (int i = 0; i < _tangents.Length - 1; i++)
{
_tangents[i] = new Vector3(_points[i + 1].x - _points[i].x, 0, _points[i + 1].z - _points[i].z);
}
_tangents[_tangents.Length - 1] = new Vector3(0.1f, 0, _endPointBezier.z);
for (int i = 0; i < _points.Length - 1; i++)
{
Handles.color = Color.white;
Handles.DrawBezier(_points[i], _points[i + 1], _tangents[i], _tangents[i + 1], Color.white, null, 10f);
}
}
private Terrain _terrain;
private Vector3 _startPointBezier;
private Vector3 _endPointBezier;
private Vector3 _topLine;
private Vector3 _bottomLine;
private Random _rnd = new Random();
private Vector3[] _points = new Vector3[11];
private Vector3[] _tangents = new Vector3[11];
void Start()
{
int iswidth = _rnd.Next(0, 1);
if (iswidth == 0)
{
_startPointBezier = new Vector3(0,0, (float)_rnd.NextDouble());
_endPointBezier = new Vector3(1, 0, (float)_rnd.NextDouble());
if (_startPointBezier.z > _endPointBezier.z)
{
Vector3 tmp = _endPointBezier;
_endPointBezier = _startPointBezier;
_startPointBezier = tmp;
}
_topLine = new Vector3(1, 0, _startPointBezier.z);
_bottomLine = new Vector3(1, 0, _endPointBezier.z);
for (int i = 1; i < _points.Length - 1; i++)
{
_points[i] = new Vector3((float)(1) / 10 * i, 0, (float)(_rnd.Next((int)(_startPointBezier.z * 10), (int)(_endPointBezier.z * 10))) / 10);
}
}
else
{
_startPointBezier = new Vector3((float)_rnd.NextDouble(), 0, 0);
_endPointBezier = new Vector3((float)_rnd.NextDouble(), 0, 1);
if (_startPointBezier.x > _endPointBezier.x)
{
Vector3 tmp = _endPointBezier;
_endPointBezier = _startPointBezier;
_startPointBezier = tmp;
}
_topLine = new Vector3(_startPointBezier.x, 0, 1);
_bottomLine = new Vector3(_endPointBezier.x, 0, 1);
for (int i = 1; i < _points.Length - 1; i++)
{
_points[i] = new Vector3((float)(_rnd.Next((int)(_startPointBezier.x * 10), (int)(_endPointBezier.x * 10)) / 10), 0, (float)(1) / 10 * i);
}
}
_points[0] = _startPointBezier;
_points[_points.Length - 1] = _endPointBezier;
for (int i = 0; i < _tangents.Length - 1; i++)
{
_tangents[i] = new Vector3(_points[i + 1].x - _points[i].x, 0, _points[i + 1].z - _points[i].z);
}
_tangents[_tangents.Length - 1] = new Vector3(0.1f, 0, _endPointBezier.z);
for (int i = 0; i < _points.Length - 1; i++)
{
Handles.color = Color.white;
Handles.DrawBezier(_points[i], _points[i + 1], _tangents[i], _tangents[i + 1], Color.white, null, 10f);
}
}
Но при запуске вылетает ошибка: NullReferenceException: Object reference not set to an instance of an object
UnityEditor.Handles.DrawBezier (UnityEngine.Vector3 startPosition, UnityEngine.Vector3 endPosition, UnityEngine.Vector3 startTangent, UnityEngine.Vector3 endTangent, UnityEngine.Color color, UnityEngine.Texture2D texture, System.Single width) для строки 66, это строка с непосредственным вызовом метода Handles.DrawBezier(). Насколько я понимаю, Unity ругается на то, что я обращаюсь к чему-то через reference, а не напрямую, но покопавшись в спецификациях не нашел ни слова о том, что для этого метода нужен вообще какой-либо объект. Пока я дошел до того момента, что я ведь рисую на terrain'e, а значит у него должно быть место в парметрах, но такого пункта нет, а terrain, собственно передаётся из Unity в скрипт из сцены. Может кто-то чем-то помочь? Хотя направление "лопаты" указать куда копать дальше?