Показать сообщение отдельно
Старый 05.08.2014, 12:17   #108
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

камера наследует движение от цели как дочерний объект, пробовал вместо трансформа цели поставить трансформ камеры - то же самое.
Вот код целиком. Функция подобного движения активируется при долгом нажатии на левую кнопку мыши. Все действия в функциях с пометкой Slide

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class 
CameraNavigation MonoBehaviour {
     
    public 
Transform CameraTransform//основа навигации камеры
    
public Transform CameraTargetCameraRotateCameraView//цель камеры
    
public Transform Cursor;
    public 
Camera RealCamera;
    private 
float SpeedSpeedXSpeedYRealSpeedXRealSpeedYSpeedXFromSpeedYFrom// эталонная скорость по координатам, реальная скорость, слепки для скорости
    
public int ScreenWidthScreenHeight// размеры экрана
    
public bool inInertia//инерция камеры
    
    
public List<floatBorders = new List<float>(); //список экранных маркеров
    
public enum GetBordersInfo {None,Left,Right,Up,Down,UpLeft,UpRight,DownLeft,DownRight}; // присвоение попавшей рамки
    
private GetBordersInfo BordersInfoBordersInfoSave//контейнер для хранения маркеров и слепка маркеров
    
public float InertiaTimeInertiaTimeScaleSlideTimeSlideTrigger// время инерции и скорость инерции
    
public enum SlideStatus {Idle,Calc,Run}; // стадия слайда
    
public SlideStatus ActiveSlideStatus;
    const 
float ScreenPercent 0.01f// размер рамки
    
public float MouseXCordMouseYCordMouseXMouseY// данные о мыши
    
public Vector3 MoveVectorSlideVectorSlideMem,SlideStart//вектор перемещения, вектор скольжения,вектор слепка, вектор старта скольжения
    
public Vector2 StartSlidePos,SlidePos;
    public 
float RotSpeedZoomDistanceZoomingSlideSpeed// скорость вращения
    
private float SlideSecond;
    private 
Vector3 velocity Vector3.zero;
    public 
Ray Position_on_plane;
    public 
RaycastHit RayInfo;
    public 
Vector3 PointRayCursorPosition;
    
    
void Start () {
    
Screen.showCursor true;
    
ScreenWidth Screen.width;
    
ScreenHeight Screen.height;    // размеры экрана
    
CameraTransform transform// трансформации камеры для перемещения
    
Speed 0.1f// скорость движения камеры
    
RotSpeed 100f;
    
SlideSpeed 10f;
    
InertiaTimeScale 3f;    // скорость движения во время инерции
    
SlideTrigger SlideSecond 0.2f// время включения режима скольжения, частота съема слепка для слайда в секундах
    
inInertia false;    
    
ActiveSlideStatus SlideStatus.Idle;    
    
Borders.Add ((float)ScreenWidth*ScreenPercent); // 0 - слева
    
Borders.Add ((float)ScreenWidth*(1-ScreenPercent)); // 1 - справа
    
Borders.Add ((float)ScreenHeight*ScreenPercent); // 2 - сверху
    
Borders.Add ((float)ScreenHeight*(1-ScreenPercent)); // 3 - снизу 
    
CameraTarget.position = new Vector3(0,0,0); // установка цели камеры
    
CameraView.position = new Vector3 (0,0,-5); // установка расстояния до цели
    
CameraRotate.position CameraTarget.position// выравнивание позиции цели и основы вращения
    
CameraRotate.rotation CameraTarget.rotation// выравнивание вращения цели и основы вращения
    
RotateCamera();    // запуск ограничителя высоты поворота
    
}
    
    
// Update is called once per frame
    
void Update () {
    
MouseX Input.GetAxis("Mouse X"); // отклонение мыши Х
    
MouseY Input.GetAxis("Mouse Y"); // отклонение мыши У
    
Zooming Input.GetAxis("Mouse ScrollWheel");
    
Camera_Navigation();    
    }        
    
    public 
void CheckInBorders () { // проверка попадания в рамки
    
MouseXCord Input.mousePosition.x;
    
MouseYCord Input.mousePosition.y// координаты мыши
                    
    
if (!inInertia) {    // если работает инерция то
        
BordersInfoSave BordersInfo// сделать слепок текущего квадрата экрана
        
if ((MouseXCord <= Borders[0])&&(BordersInfo != GetBordersInfo.Left)) BordersInfo GetBordersInfo.Left// мышь в левой части
        
if ((MouseXCord >= Borders[1])&&(BordersInfo != GetBordersInfo.Right)) BordersInfo GetBordersInfo.Right// мышь в правой части
        
if ((MouseYCord <= Borders[2])&&(BordersInfo != GetBordersInfo.Down)) BordersInfo GetBordersInfo.Down// мышь в нижней части
        
if ((MouseYCord >= Borders[3])&&(BordersInfo != GetBordersInfo.Up)) BordersInfo GetBordersInfo.Up// мышь в верхней части
        
if ((MouseXCord <= Borders[0])&&(MouseYCord >= Borders[3])&&(BordersInfo != GetBordersInfo.UpLeft)) BordersInfo GetBordersInfo.UpLeft// Лево-вверх
        
if ((MouseXCord >= Borders[1])&&(MouseYCord >= Borders[3])&&(BordersInfo != GetBordersInfo.UpRight)) BordersInfo GetBordersInfo.UpRight// Право-вверх
        
if ((MouseXCord <= Borders[0])&&(MouseYCord <= Borders[2])&&(BordersInfo != GetBordersInfo.DownLeft)) BordersInfo GetBordersInfo.DownLeft// Лево-Вниз
        
if ((MouseXCord >= Borders[1])&&(MouseYCord <= Borders[2])&&(BordersInfo != GetBordersInfo.DownRight)) BordersInfo GetBordersInfo.DownRight// Право-Вниз
        
if ((MouseXCord >= Borders[0])&&(MouseXCord <= Borders[1])&&(MouseYCord >= Borders[2])&&(MouseYCord <= Borders[3])&&(BordersInfo != GetBordersInfo.None)) BordersInfo GetBordersInfo.None// Курсор в центральной части
        
}
        
    if (
BordersInfoSave != BordersInfo) { // при смене квадрата
        
SpeedXFrom SpeedX
        
SpeedYFrom SpeedY// начальное значение скорости
        
inInertia true// включить инерцию
        
InertiaTime 0f// запустить таймер инерции    
        
ChangeSpeed (); // расчитать конечную скорость
        
BordersInfoSave BordersInfo// сохранить текущий квадрат
        
}
                    
    if (
inInertia
        { 
// если инерция включена
            
InertiaTime += Time.deltaTime// отчет времени
            
RealSpeedX Mathf.Lerp(SpeedXFromSpeedXInertiaTime*InertiaTimeScale); // плавное изменение скорости Х
            
RealSpeedY Mathf.Lerp(SpeedYFromSpeedYInertiaTime*InertiaTimeScale);// плавное изменение скорости У
            
if ((RealSpeedX == SpeedX)&&(RealSpeedY == SpeedY)) inInertia false// если скорость достигнута - отключить инерцию
        
}
    }
    
    public 
void ChangeSpeed () { // изменение скорости
    
        
switch (BordersInfo) { // куда перешел курсор мыши
        
case GetBordersInfo.Left
            
SpeedX = -Speed;
            
SpeedY 0f// значения скорости
            
break;
        case 
GetBordersInfo.Right:
            
SpeedX Speed;
            
SpeedY 0f// значения скорости
            
break;
        case 
GetBordersInfo.Up:
            
SpeedY Speed;
            
SpeedX 0f// значения скорости
            
break;
        case 
GetBordersInfo.Down:
            
SpeedY = -Speed;
            
SpeedX 0f// значения скорости
            
break;
        case 
GetBordersInfo.UpLeft:
            
SpeedX = -Speed;
            
SpeedY Speed// значения скорости
            
break;
        case 
GetBordersInfo.DownLeft:
            
SpeedX SpeedY = -Speed// значения скорости
            
break;
        case 
GetBordersInfo.UpRight:
            
SpeedX SpeedY Speed// значения скорости
            
break;    
        case 
GetBordersInfo.DownRight:
            
SpeedX Speed;
            
SpeedY = -Speed// значения скорости
            
break;
        case 
GetBordersInfo.None:
            
SpeedX SpeedY 0f// значения скорости
            
break;
            }    
    }
    
    public 
void CheckKeyBoardRule () { // управление с клавиатуры
    
if (BordersInfo == GetBordersInfo.None)    {
        if (
Input.GetKey(KeyCode.LeftArrow)) BordersInfo GetBordersInfo.Left;    
        if (
Input.GetKey(KeyCode.RightArrow)) BordersInfo GetBordersInfo.Right;    
        if (
Input.GetKey(KeyCode.UpArrow)) BordersInfo GetBordersInfo.Up;    
        if (
Input.GetKey(KeyCode.DownArrow)) BordersInfo GetBordersInfo.Down;
        if (
Input.GetKey(KeyCode.LeftArrow)&&Input.GetKey(KeyCode.UpArrow)) BordersInfo GetBordersInfo.UpLeft;    
        if (
Input.GetKey(KeyCode.LeftArrow)&&Input.GetKey(KeyCode.DownArrow)) BordersInfo GetBordersInfo.DownLeft;    
        if (
Input.GetKey(KeyCode.RightArrow)&&Input.GetKey(KeyCode.UpArrow)) BordersInfo GetBordersInfo.UpRight;    
        if (
Input.GetKey(KeyCode.RightArrow)&&Input.GetKey(KeyCode.DownArrow)) BordersInfo GetBordersInfo.DownRight;    
        
ChangeSpeed (); // изменить скорость
        
}
        }
    
    public 
void RotateCamera() {
    if (
Input.GetMouseButton(1)) 
        { 
// если нажата правая кнопка мыши
            
CameraRotate.Rotate (-MouseY*RotSpeed*Time.deltaTime,0f,0f);     // вращать по Х
            
if (MouseYCord>ScreenHeight/2fCameraTransform.Rotate (0f,-MouseX*RotSpeed*Time.deltaTime,0f); // вращать по У в верхней половине экрана
            
else CameraTransform.Rotate (0f,MouseX*RotSpeed*Time.deltaTime,0f); // вращать по У в нижней половине экрана        
        
}
    
CameraRotate.eulerAngles = new Vector3 (Mathf.Clamp(CameraRotate.rotation.eulerAngles.x,30f,80f),CameraRotate.eulerAngles.y,CameraRotate.eulerAngles.z); // ограничители
    
}
    
    public 
void ChangeMove (GetBordersInfo InBorders) {
    switch (
InBorders) {
        case (
GetBordersInfo.Left):
            
CameraTransform.Translate(0f,0f,MouseY*Time.deltaTime*2f);    
        break;    
        case (
GetBordersInfo.Right):
            
CameraTransform.Translate(0f,0f,MouseY*Time.deltaTime*2f);    
        break;
        case (
GetBordersInfo.Up):
            
CameraTransform.Translate(MouseX*Time.deltaTime*2f,0f,0f);    
        break;        
        case (
GetBordersInfo.Down):
            
CameraTransform.Translate(MouseX*Time.deltaTime*2f,0f,0f);    
        break;        
        }
    }
    
    public 
void Camera_zoom () {
        
ZoomDistance Mathf.Clamp(Vector3.Distance(CameraView.transform.position,CameraRotate.transform.position),2f,10f);    
        if ((
ZoomDistance<10f)&(ZoomDistance>2f)) CameraView.Translate (Vector3.forward*Zooming);
        if ((
Zooming<0f)&(ZoomDistance==2f)) CameraView.Translate (Vector3.forward*Zooming);
        if ((
Zooming>0f)&(ZoomDistance==10f)) CameraView.Translate (Vector3.forward*Zooming);
    }
    
    public 
void Camera_SlideCalc () {
    
    
//SlideVector = Vector3.zero;
    
    
CameraTransform.position Vector3.SmoothDamp(CameraTransform.position,CameraTransform.position,ref velocity,2f);    
            
    if (
Input.GetMouseButtonUp(0)) 
        {
            
ActiveSlideStatus SlideStatus.Run;
            
SlideTime 0f;
            
SlideTrigger SlideSecond;
        }    
    }    
    
    public 
void Camera_Navigation() {
    
CheckInBorders(); // - проверка попадания в рамки
    
CheckKeyBoardRule (); // - управление c клавиатуры
        
if (BordersInfo == GetBordersInfo.NoneRotateCamera(); // вращение только в центральной области игры
    
MoveVector = new Vector3(RealSpeedX,0,RealSpeedY); //вектор перемещения
    
CameraTransform.Translate (MoveVector); //перемещаем камеру в соответствии со скоростями
    
ChangeMove(BordersInfo); // расчет скоростей
    
Camera_zoom(); // Зум        
    
Camera_SetPosition_on_plane ();
        if (
Input.GetMouseButton(0)&(ActiveSlideStatus==SlideStatus.Idle)) SlideTime += Time.deltaTime// если слайда нет, то включить слайд через 0.2 сек
        
if (SlideTime SlideTrigger// готовимся сделать слайд
            
{
                
SlideStart Cursor.position// слепок текущего положения
                
SlideTime 0f// обнулить таймер
                
ActiveSlideStatus SlideStatus.Calc;    // начать расчет слайда
            
}
        if (
ActiveSlideStatus==SlideStatus.CalcCamera_SlideCalc();    // расчет слайда
        
if (ActiveSlideStatus==SlideStatus.RunCamera_SlideRun();
    
    }
    
    public 
void Camera_SlideRun() {
    
    
ActiveSlideStatus SlideStatus.Idle;    
    }
    
    public 
void Camera_SetPosition_on_plane () {
    
Position_on_plane RealCamera.ScreenPointToRay(new Vector3(MouseXCord,MouseYCord,0f)); // пусить луч в координаты мыши
    
if (Physics.Raycast(Position_on_planeout RayInfoMathf.Infinity)) // если пересечение то 
        
{
            
PointRay RayInfo.point;    // получаем информацию о столкновении
            
CursorPosition = new Vector3(Mathf.Round(PointRay.x),0f,Mathf.Round(PointRay.z)); //позиция курсора на плоскости
        
}    
    
Cursor.position Vector3.SmoothDamp(Cursor.position,CursorPosition,ref velocity,0.1f);    // плавно переместить курсор в точку назначения
    
}    

__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием