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

блин, ребят помогите, опять застрял, четвертый час бьюсь а косяка не могу найти до сих пор.
В чем смысл - делаю навигацию камеры с небольшим движением по инерции после смены направления. Но почему-то весь блок где инерция должна по идее происходить - не происходит. Хотя если вставить отладчики, то видно что эти блоки выполняются.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class 
CameraNavigation : MonoBehaviour {
     
    public 
Transform CameraTransform; //основа навигации камеры
    
public GameObject CameraTarget; //цель камеры
    
public float Speed, SpeedX, SpeedY, RealSpeedX, RealSpeedY, SpeedXFrom, SpeedYFrom;
    public 
int ScreenWidth, ScreenHeight; // размеры экрана
    
public bool inInertia; //инерция камеры
        
    
List<float> Borders = new List<float>(); //список экранных маркеров
    
public enum GetBordersInfo {None,Left,Right,Up,Down,UpLeft,UpRight,DownLeft,DownRight}; // присвоение попавшей рамки
    
public GetBordersInfo BordersInfo, BordersInfoSave;
    
    const 
float ScreenPercent = 0.05f;
    
// Use this for initialization
    
    
    
void Start () {
    
ScreenWidth = Screen.width;
    
ScreenHeight = Screen.height;    
    
CameraTransform = transform;
    
Speed = 0.5f;
            
    
inInertia = false;    
    
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 - снизу 
    
    
}
    
    
// Update is called once per frame
    
void Update () {
    
        
СheckInBorders(); // - проверка попадания в рамки
    
CameraTransform.Translate(new Vector3(RealSpeedX,0,RealSpeedY));    
    
    }
        
    public 
void CheckInBorders () {
    
float MouseXCord = Input.mousePosition.x;
    
float MouseYCord = Input.mousePosition.y;
    
    if (
inInertia == false) {    
        
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;
        
        switch (
BordersInfo) {
        case 
GetBordersInfo.Left:
            
SpeedY = Speed;
            
SpeedX = 0f;
            break;
        case 
GetBordersInfo.Right:
            
SpeedY = -Speed;
            
SpeedX = 0f;
            break;
        case 
GetBordersInfo.Up:
            
SpeedX = Speed;
            
SpeedY = 0f;
            break;
        case 
GetBordersInfo.Down:
            
SpeedX = -Speed;
            
SpeedY = 0f;
            break;
        case 
GetBordersInfo.UpLeft:
            
SpeedX = SpeedY = Speed;
            break;
        case 
GetBordersInfo.DownLeft:
            
SpeedX = -Speed;
            
SpeedY = Speed;
            break;
        case 
GetBordersInfo.UpRight:
            
SpeedX = Speed;
            
SpeedY = -Speed;
            break;    
        case 
GetBordersInfo.DownRight:
            
SpeedX = SpeedY = -Speed;
            break;
        case 
GetBordersInfo.None:
            
SpeedX = SpeedY = 0f;
            break;
            }
        
BordersInfoSave = BordersInfo;
        }
                    
        if (
inInertia == true) {
            
RealSpeedX = Mathf.Lerp(SpeedXFrom, SpeedX, Time.time/2f);
            
RealSpeedY = Mathf.Lerp(SpeedYFrom, SpeedY, Time.time/2f);
            if ((
RealSpeedX == SpeedX)&&(RealSpeedY == SpeedY)) inInertia = false;
        }
    }
    
} 
По задумке переменная RealSpeedX должна плавно в течение двух секунд изменяться от SpeedXFrom до SpeedX, притом они отслеживаются при изменении направления движения камеры.
Т.е. если курсор был в левой части экрана GetBordersInfo.Left то при перемещении в центральную часть GetBordersInfo.None скорость должна плавно угаснуть с 1 до 0.
Но не выходит, всю голову поломал.

PS: Внимание, много говнокода!
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием