Корисний скрипт для камери
Cьогодні: 26 кві 2019, 12:12
- Список форумів‹ Ресурси‹ Компоненти (Скарбничка)
- Змінити розмір шрифту
- Для друку
- Техпідтримка
- Реєстрація
- FAQ
- Реєстрація
- Вхід
Корисний сценарій для камери.
Корисний сценарій для камери.
nazgul30 14 бер 2012, 09:26
using UnityEngine; using System.Collections;
/// /// Перелік кнопок миші. /// public enum MOUSE_BUTTON < NONE, MOUSE_LEFT, MOUSE_CENTER, MOUSE_RIGHT >
/// /// Скрипт для обертання камери навколо об'єкта по еліпсу. /// Можливість скролінгу та плавної зупинки обертання /// public class MouseEllipseOrbit : MonoBehaviour < //мета public Transform target; //кнопка обертання public MOUSE_BUTTON mouseButtonOrbit = MOUSE_BUTTON. MOUSE_RIGHT;
//Паннінг public bool isPanning; //Кнопка панінгу public MOUSE_BUTTON mouseButtonPan = MOUSE_BUTTON. MOUSE_CENTER ; //Швидкість панінгу public float panningSpeed = 5; //шар, в якому знаходиться площина панінгу. public int panningLayer;
//Напівосі еліпса public float a = 10; public float b = 10;
private float distance = 10;
/ / Швидкість обертання по x public float x Speed = 250; //швидкість обертання по y public float ySpeed = 120;
//Мінімальна межа просмтра по осі y public float yMinLimit = - 20 ; //Максимальна межа просмтра по осі y public float yMaxLimit = 80;
private float x = 0; private float y = 0;
//Скролінг public bool isScrolling = true; //Швидкість скролінгу public float scrollSpeed = 1; //Мінімальна дистанція скролінга public float scrollMinDistance = 1 ; //Максимальна дистанція скролінга public float scrollMaxDistance = 10 ;
приватний кут поплавця;
private Vector3 newTargetPosition ;
приватні векторні кути 3;
void Awake ( ) < кути = перетворення. eulerAngles ; >
void Початок ( ) < newTargetPosition = target. позиція ;
x = кути. y ; y = кути. x ;
// Змусити тверде тіло не змінювати обертання if ( rigidbody ) rigidbody . freezeRotation = true; орбіта ( ) ; прокрутка ( ); >
if ( isPanning ) panning ( ) ; if ( isScrolling ) scroll ( ) ; перетворення . localPosition = ( transform . localRotation ) * new Vector3 ( 0, 0, - distance ) ; >
приватна порожня орбіта ( ) < якщо ( ціль ) < x += Вхід. GetAxis ("Миша X") * xSpeed * 0.02f; y -= Вхід. GetAxis ("Миша Y") * ySpeed * 0.02f;
calcRotation (x,y); calcDistance ( ) ; > >
мета. позиція = Вектор3. Lerp ( target. position , newTargetPosition, Time. deltaTime * panningSpeed ) ; >
приватна прив’язка пустоти ( ) < Ray ray = камера. ScreenPointToRay ( Введення. mousePosition ); RaycastHit hit = новий RaycastHit ( ) ; if ( Physics. Raycast ( промінь, вихід, 4000,
panningLayer ) ) < newTargetPosition = попадання. точка ; > >
private void calcRotation ( float x, float y ) < y = clampAngle ( y, yMinLimit, yMaxLimit ) ; Обертання кватерніона = кватерніон. Ейлер (y, x, 0); трансформувати. ротація = обертання ; >
private void calcDistance ( ) < Vector3 targetDir = transform . позиція - ціль. позиція ; плавний кут = Вектор3.Кут ( targetDir,target. forward ) ; чисельник з плаваючою точкою = Mathf. Pow ( a,2 ) * Mathf. Pow (b,2);
float знаменник = Mathf. Pow ( a,2 ) * Mathf. Pow ( Mathf. Sin ( кут * Mathf. Deg2Rad ) ,2 ) + Mathf. Pow ( b,2 ) * Mathf. Pow (Mathf. Cos (кут * Mathf. Deg2Rad) ,2);
відстань = Mathf. Sqrt (чисельник/знаменник); >
приватний недійсний прокручування ( ) < //приблизити if ( ( Input. GetAxis ( "Колесо прокрутки миші") ) > 0 ) < якщо (відстань >= scrollMinDistance) < float dist1 = відстань; distance +=- ( Input. GetAxis ( "Mouse ScrollWheel") ) * scrollSpeed ; float k = dist1 / distance ; a = a / k ; b = b/k ; > > //віддалити if ( ( Input. GetAxis ( "Колесо прокрутки миші") ) 0 ) < if ( distance scrollMaxDistance ) < float dist1 = відстань; distance +=- ( Input. GetAxis ( "Mouse ScrollWheel") ) * scrollSpeed ; float k = dist1 / distance ; a = a / k ; b = b/k ; > > >
приватний float clampAngle (кут float, float min, float max ) < якщо ( кут - 360 ) кут += 360 ; якщо ( кут > 360 ) кут -= 360 ; повернути Mathf. Затиск (кут, мін., макс.); >
public void init ( ) < x = кути. y ; y = кути. x ; орбіта ( ) ; прокрутка ( );
public void setTargetPosition ( Vector3 targetPos ) < newTargetPosition = targetPos ; > >
за допомогою UnityEngine ; використання UnityEditor ; /// /// Редактор для MouseEllipseOrbit. /// [ CustomEditor ( typeof ( MouseEllipseOrbit ) ) ] публічний частковий клас MouseEllipseOrbitEditor : редактор
public void OnSceneGUI ( ) < MouseEllipseOrbit meo = ціль як MouseEllipseOrbit ; якщо ( meo && meo. target != null ) < //Стрелка X Ручки. колір = Колір. червоний ; Вектор3 maxX = meo. мета . позиція + Вектор3. вперед * meo. a ; Ручки. ArrowCap ( 0,maxX,Quaternion. LookRotation ( meo. target . forward ) , HandleUtility. GetHandleSize ( maxX ) / 2 ) ;
//Стрілка Y Ручки. колір = Колір. зелений ; Вектор3 maxY = meo. мета . позиція + Вектор3. правильно * meo. b ; Ручки. ArrowCap ( 0,maxY,Quaternion. LookRotation ( meo. target . right ) , HandleUtility. GetHandleSize ( maxY ) / 2 ) ;
Ellipse ellipse = новий еліпс ( meo. target . position , meo. a , meo. b , Color. blue ) ; //Елліпс // Handles.color = Color.green; Ручки. DrawLine ( meo. transform . position , meo. target . position ) ; еліпс. DrawEllipse ( );
//Надпис навколо камери Vector3 targetDir = meo. трансформувати. положення - мео. мета . позиція ; плавний кут = Вектор3. Кут ( targetDir, meo. target . forward ); float distance = еліпс. calcDistance (кут); Vector3 labPos = meo. трансформувати. позиція ; Ручки. Мітка ( labPos, "Відстань: " + відстань + " \n Кут " + кут ) ;
//Кнопка установки камери
Rect pos = new Rect ( Ширина екрану / 2 - 75,0, 150,50 ) ; Ручки. Початок GUI (); GUILayout. BeginArea (pos); if (GUILayout. Button ( "Установити положення камери") ) setCameraPosition ( meo ) ; GUILayout. EndArea ( ); Ручки. EndGUI ( ); > >
private void setCameraPosition ( MouseEllipseOrbit meo ) < Перетворення камери = meo. трансформувати ; Перетворення target = meo. мета ;
камера. LookAt (мішень); Ellipse ellipse = новий еліпс ( meo. target . position ,meo. a ,meo. b ) ; Vector3 targetDir =мео. трансформувати. положення - мео. мета . позиція ; плавний кут = Вектор3. Кут ( targetDir,meo. target . forward ) ; float distance = еліпс. calcDistance (кут); камера. localPosition = ( camera. localRotation ) * new Vector3 ( 0, 0, - distance ) ; >
клас Ellipse < private Vector3 centr = Vector3. нульовий ; private float a ; private float b ; приватний колір кольору;
загальнодоступний еліпс (центр вектора3, float a, float b) < це . центр = центр; це . a = a ; це . b = b ; >
загальнодоступний еліпс (центр вектора3, float a, float b, колір кольору) < це . центр = центр; це . a = a ; це . b = b ; це . колір = колір; >
загальнодоступний float calcDistance ( плаваючий кут ) < чисельник з плаваючою точкою = Mathf. Pow ( a,2 ) * Mathf. Pow (b,2); знаменник з плаваючою точкою = Mathf. Pow ( a,2 ) * Mathf. Pow ( Mathf. Sin ( кут * Mathf. Deg2Rad ) ,2 ) + Mathf. Pow ( b,2 ) * Mathf. Pow (Mathf. Cos (кут * Mathf. Deg2Rad) ,2); float distance = Mathf. Sqrt (чисельник/знаменник); зворотна відстань; >
Вектор3 Оцінити ( float t ) < float y = Mathf. Sqrt (- Mathf. Pow (t,2) + Mathf. Pow (a,2)) * b/a; повернення ( центр - новий вектор3 ( y,0,t ) ); >
Vector3 MinusEvaluate ( float t ) < float y = - Mathf. Sqrt (- Mathf. Pow (t,2) + Mathf. Pow (a,2)) * b/a; повернення ( центр - новий вектор3 ( y,0,t ) ); >
public void DrawEllipse ( ) < Ручки. колір = колір; float delta = a / 40 ; для ( int i = 0 ; i 80 ; i ++ ) < float t = - a + i * delta ; float t1 = - a + ( i + 1 ) * delta ; Вектор3 t1v = Оцінити (t1); Ручки. DrawLine ( Оцінити ( t) , t1v ) ; Ручки. DrawLine ( MinusEvaluate ( t ) , MinusEvaluate ( t1 ) ) ; > Ручки. DrawLine ( centr - новий Vector3 ( 0,0, - a ) ,centr - новий Vector3 ( 0,0,a ) ) ; Ручки. DrawLine (центр - новий Вектор3 (- b,0,0) ,центр - новий Вектор3 (b,0,0));
за допомогою UnityEngine ; використання UnityEditor ;
відкритий частковий клас MouseEllipseOrbitEditor : редактор
публічне перевизначення void OnInspectorGUI ( ) < MouseEllipseOrbit meo = ціль як MouseEllipseOrbit ; if (! meo) повернути;
Графічний інтерфейс редактора. рівень відступу = 1;
мео. target = EditorGUILayout. ObjectField ( "Target", meo. target, typeof (Transform), true) як Transform; мео. mouseButtonOrbit = ( MOUSE_BUTTON ) EditorGUILayout. EnumPopup ("Кнопка Orbit", meo. mouseButtonOrbit);
panningMode (meo); Вісь еліпсу ( meo ); scrollSettings ( meo ); MouseAxisSettings ( meo ) ;
if ( GUILayout. Button ( "Установити положення камери") ) < setCameraPosition ( meo ) ; > >
private bool showPadding = true; приватний void panningMode ( MouseEllipseOrbit meo ) < мео. isPanning = EditorGUILayout. Перемикач ( "Режим панорамування" ,meo. isPanning ) ; Графічний інтерфейс редактора. indentLevel ++; якщо (meo. isPanning) < showPadding = EditorGUILayout. Foldout ( showPadding, "Panning" ) ; якщо ( showPadding ) < Графічний інтерфейс редактора. indentLevel ++; мео. mouseButtonPan = ( MOUSE_BUTTON ) EditorGUILayout. EnumPopup ("Кнопка панорамування" , meo. mouseButtonPan ); мео. panningSpeed = EditorGUILayout. FloatField ( "Швидкість панорамування" , meo. panningSpeed ); Графічний інтерфейс редактора. indentLevel --; > > Графічний інтерфейс редактора. indentLevel --; >
private bool showEllipseAxis = true; private void ellipseAxis ( MouseEllipseOrbitmeo ) < showEllipseAxis = EditorGUILayout. Foldout ( showEllipseAxis, "Вісь еліпса" ) ; Графічний інтерфейс редактора. indentLevel ++; якщо ( showEllipseAxis ) < Графічний інтерфейс редактора. indentLevel ++; мео. a = EditorGUILayout. FloatField ("Вісь A", meo. a); мео. b = EditorGUILayout. FloatField ("Вісь B", meo. b); Графічний інтерфейс редактора. indentLevel --; > Графічний інтерфейс редактора. indentLevel --; >
private bool showMouseAxisSettings = true; private void mouseAxisSettings ( MouseEllipseOrbit meo ) < showMouseAxisSettings = EditorGUILayout. Foldout ( showMouseAxisSettings, "Параметри осі миші" ); Графічний інтерфейс редактора. indentLevel ++; якщо ( showMouseAxisSettings ) < Графічний інтерфейс редактора. indentLevel ++; мео. xSpeed = EditorGUILayout. FloatField ( "Швидкість осі Х" , meo. xSpeed ); мео. ySpeed = EditorGUILayout. FloatField ( "Швидкість осі Y" , meo. ySpeed ); мео. yMinLimit = EditorGUILayout. FloatField ( "Y min limit" , meo. yMinLimit ) ; мео. yMaxLimit = EditorGUILayout. FloatField ( "Y max limit" , meo. yMaxLimit ) ; Графічний інтерфейс редактора. indentLevel --; > Графічний інтерфейс редактора. indentLevel --; >
private bool showScrollSettings = true; private void scrollSettings ( MouseEllipseOrbit meo ) < мео. isScrolling = EditorGUILayout. Перемикач ( "Режим прокручування" ,meo. isScrolling ) ; Графічний інтерфейс редактора. indentLevel ++; якщо (meo. isScrolling) < showScrollSettings = EditorGUILayout. Foldout ( showScrollSettings, "Налаштування осі миші" ) ; якщо ( showScrollSettings ) < Графічний інтерфейс редактора. indentLevel ++; мео. scrollSpeed = EditorGUILayout. FloatField ( "Швидкість прокручування" , meo. scrollSpeed ) ; мео. scrollMinDistance = EditorGUILayout. FloatField ( "Прокрутка мінімальної відстані" , meo. scrollMinDistance ) ; мео. scrollMaxDistance =EditorGUILayout. FloatField ("Scroll max distance", meo. scrollMaxDistance); EditorGUI. indentLevel --; > > EditorGUI. indentLevel --; > >
Пакет у додатку:) У пакеті є префаб із уже налаштованою камерою та приклад сцени