Показать сообщение отдельно
Старый 16.01.2011, 15:06   #2
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Расширение редактора Unity

И на javascript:
Bezier.js
// опорные точки кривой
var P0 : Vector3 = Vector3.zero;
var 
P1 : Vector3 = Vector3(0, 0, 1);
var 
P2 : Vector3 = Vector3(1, 0, 1);
var 
P3 : Vector3 = Vector3(1, 0, 0);

// интерполяция по кривой используя формулу кривой Bezier третьего порядка
function Evaluate(t : float) : Vector3
{
    var 
t1 : float = 1 - t;
    return 
t1 * t1 * t1 * P0 + 3 * t * t1 * t1 * P1 +
            
3 * t * t * t1 * P2 + t * t * t * P3;
}

// существует два события, которые можно использовать для отображения
// "не визуального" объекта - OnDrawGizmos и OnDrawGizmosSelected
// первый выполняется всегда, второй - когда объект выбран
// функции рисования находятся в классе Gizmos
function OnDrawGizmosSelected()
{
    
// отобразим кривую как 50 сегментов
    
Gizmos.color = Color.green;
    for (var 
i = 1; i < 50; i++)
    {
        var 
t : float = (i - 1f) / 49f;
        var 
t1 : float = i / 49f;
        
Gizmos.DrawLine(Evaluate(t), Evaluate(t1));
    }
} 
Editor/BezierEditor.js
@CustomEditor(Bezier)
class 
BezierEditor extends Editor
{
    
// данная функция выполняет отрисовку инспектора компонента
    
override function OnInspectorGUI()
    {
        
// выполняем отрисовку инспектора по умолчанию
        
DrawDefaultInspector();

        
// ссылка на компонент
        
var bezier : Bezier = target;
        if (
bezier)
        {
            
// вычисляем длину кривой так же по 50-ти отрезкам
            
var length : float = 0;
            for (var 
i = 1; i < 50; i++)
            {
                var 
t : float = (i - 1f) / 49f;
                var 
t1 : float = i / 49f;
                
length += (bezier.Evaluate(t) - bezier.Evaluate(t1)).magnitude;
            }

            
// отображаем длину кривой в инспекторе
            
GUILayout.Label(System.String.Format("Curve length: {0}", length));
        }
    }

    
// отрисовка в сцене, здесь в отличии от компонента, где мы использовали
    // для отрисовки класс Gizmos используется клас Handles (манипуляторы)
    
function OnSceneGUI()
    {
        
        var 
bezier : Bezier = target;
        if (
bezier)
        {
            
//Нарисуем линии манипуляторов
            
Handles.DrawLine(bezier.P0, bezier.P1);
            
Handles.DrawLine(bezier.P2, bezier.P3);

            
// Для каждой контрольной точки создаемманипулятор в виде сферы
            
var rot : Quaternion = Quaternion.identity;
            var 
size : float  = HandleUtility.GetHandleSize(bezier.P0) * 0.2;
            
bezier.P0 = Handles.FreeMoveHandle(bezier.P0, rot, size, Vector3.zero, Handles.SphereCap);
            
bezier.P1 = Handles.FreeMoveHandle(bezier.P1, rot, size, Vector3.zero, Handles.SphereCap);
            
bezier.P2 = Handles.FreeMoveHandle(bezier.P2, rot, size, Vector3.zero, Handles.SphereCap);
            
bezier.P3 = Handles.FreeMoveHandle(bezier.P3, rot, size, Vector3.zero, Handles.SphereCap);
        }


        
// если мы двигали контрольные точки, то мы должны указать редактору, 
        // что объект изменился (стал "грязным")
        
if (GUI.changed)
            
EditorUtility.SetDirty(target);
    }

} 
(Offline)
 
Ответить с цитированием
Эти 7 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Amatsu (21.11.2011), Fatalix3d (23.02.2011), Harter (15.01.2012), Illidan (19.01.2011), Lestar (28.01.2012), maxturbo (09.03.2011), Nuprahtor (16.01.2011)