Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > Unity > Общие вопросы

Общие вопросы вопросы не попадающие ни в один из доступных разделов

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

Я снова со своими тупыми вопросами.
Продолжаю делать скрипт камеры. Поставило в тупик следующее:
public void Camera_SlideCalc () {
SlideVector = Vector3.zero;
CameraTarget.position = Vector3.SmoothDamp(CameraTarget.position,CameraTarget.position+SlideVector,ref velocity,2f);
private Vector3 velocity = Vector3.zero;
По логике если стартовая точка и конечная совпадает (т.к. прибавляется нулевой вектор) то движения не должно быть, а оно есть. Больше никаких источников возникновения движения нет. Если комментирую строчку со SmoothDamp то движение исчезает.

Всю голову поломал, видимо что-то опять недопонимаю...
может velocity обнулять нужно после вызова функции?

upd:
сократил функцию до вида, проблема осталась:
public void Camera_SlideCalc () {
CameraTarget.position = Vector3.SmoothDamp(CameraTarget.position,CameraTarget.position,ref velocity,2f);}
такое ощущение, что я не до конца понял принцип работы SmoothDamp. Почему если начало и конец движения равны движение все равно есть?
__________________
Области Хаоса - мой новый Youtube проект

Последний раз редактировалось EvilOkta, 05.08.2014 в 00:20. Причина: добавление
(Offline)
 
Ответить с цитированием
Старый 05.08.2014, 07:54   #107
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,566
Написано 3,004 полезных сообщений
(для 5,317 пользователей)
Ответ: Передача переменной в метод

Ты двигаешь цель, а камера как движется?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 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)
 
Ответить с цитированием
Старый 05.08.2014, 14:04   #109
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,566
Написано 3,004 полезных сообщений
(для 5,317 пользователей)
Ответ: Передача переменной в метод

У тебя там кажется влияет
Speed 0.1f// скорость движения камеры 
Пртестировать не могу, не понял зачем столько полей у скрипта
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 05.08.2014, 14:35   #110
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

разобрался, оказывается конфликтовали две velocity из разных частей кода. Я использовал один и тот же контейнер для хранения - видимо это и давало искажение.
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 26.03.2015, 00:20   #111
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

Вопрос на логику кода, читал сегодня справки, думал над реализацией.
В общем висит у меня на камере метод, отвечающий за тряску камеры.

Хочу разобраться как лучше реализовать следующую логику:
Метод тряски могут вызывать разные игровые объекты и события (взрывы, падения, повреждение и т.п) из собственных скриптов.
Самый простой способ как я понял это отправка сообщений на активацию скрипта из других с помощью getComponent.

Появился вопрос следующий, в методе есть возможность задавать длительность тряски с помощью переменной. Как реализовать установку длительности тряски из тех скриптов которые будут вызывать этот метод?

Через getComponent смысл понятен, просто сначала посылать в скрипт значение продолжительности тряски и затем активировать его.

Рассматриваю вариант с подпиской метода на события, но мне кажется это слишком запутывает задачу (или нет - подскажите?) тогда событие, которое активирует метод должно задать ему длительность. Как это реализовать? Сориентируйте как должен выглядеть скрипт чтобы в него можно было передавать длительность (shakeOver) из других скриптов, которые вызывают событие.

Интересует изменение метода ShakeIsDo (), как его доработать? Надеюсь правильно объяснил вопрос.
Не пинайте в справки, я просто опять упускаю какую-то базовую концепцию ООП. Отправлять в метод/функцию объект для его модификации и возврата с помощью return я разобрался, а тут требуется void но с заданным параметром, которым управляют другие объекты, совершенно разного типа.

public class CameraShake MonoBehaviour {
    
public 
Transform CameraTransform;
public 
bool isShakeshakeRun;
public 
float shakeAmountshakeOvershakeTimeshakeTimeStop;
public 
Vector3 OriginalPos,ShakePos,ShakeVector;    
    
    
void Start () {
    
isShake false;
    
shakeRun false;
    
shakeAmount 0.1f;
    
shakeOver 0.1f;
    }
    
 
void Update() {
      
    if ((
Input.GetKey(KeyCode.Space))) {
        
isShake true;
        
shakeTime 0f;
        
OriginalPos CameraTransform.position;
        
shakeRun true;
        }    
        
    if ((
Input.GetKey(KeyCode.B))) {
            
isShake false;
            
shakeTime 0f;
        
CameraTransform.position OriginalPos;
        }
        
    if (
shakeRunShakeIsDo();     
        
}
    public 
void ShakeIsDo () 
        {
        
ShakePos CameraTransform.position;    
        
ShakeVector Random.insideUnitSphere shakeAmount;
        
ShakeVector = new Vector3(0f,ShakeVector.y,0f);
        
CameraTransform.position = new Vector3(ShakePos.x,ShakePos.y+ShakeVector.y,ShakePos.z);    
    if (((
ShakePos.y-OriginalPos.y)>shakeOver)||((ShakePos.y-OriginalPos.y)<-shakeOver)) CameraTransform.position = new Vector3(ShakePos.x,OriginalPos.y,ShakePos.z);
        
shakeTime += Time.deltaTime;
        if (
shakeTime >= shakeOvershakeRun false;
        }

в коде есть дублирующие переменные isShake и ShakeRun не обращайте внимание, вырезал части - немного другой подход был сначала.
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 26.03.2015, 06:46   #112
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Передача переменной в метод

Можно сделать через getComponent, ведь ты по сути получаешь этим способом экземпляр класса и можешь вызывать любой метод.
Делаешь public метод ShakeStart с нужными параметрами, как минимум с параметром shakeOver
public void ShakeStart(float shakeOver) {
    
this.shakeOver shakeOver;
    
shakeTime 0f;
    
OriginalPos CameraTransform.position;
    
isShake true;

далее из других скриптов получаешь экземпляр и вызываешь метод
CameraShake shaker camera.GetComponent<CameraShake>();
shaker.ShakeStart(2.5f); 
Если время тряски фиксировано для разных случаев, то можно сделать константы (static readonly) в классе CameraShake и использовать их, например
shaker.ShakeStart(CameraShake.DELAY_FOR_EXPLOSION); 
тогда не придётся по коду искать интервалы тряски, можно будет изменять в одном месте.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (26.03.2015)
Старый 26.03.2015, 10:25   #113
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Передача переменной в метод

Ещё: чтобы каждый раз не доставать экземпляр скрипта через
CameraShake shaker = camera.GetComponent<CameraShake>();
можно сделать статическую переменную в классе CameraShake и статический метод тряски, и обращаться напрямую через имя класса:
private static CameraShake Instance;
void Awake() {
    
Instance this;
}
private 
void ShakeStartLocal(float shakeOver) { 
    
this.shakeOver shakeOver
    
shakeTime 0f
    
OriginalPos CameraTransform.position
    
isShake true
}  
public static 
void ShakeStart(float shakeOver) { 
    
Instance.ShakeStartLocal(shakeOver);
}

............

CameraShaker.ShakeStart(0.5f); 
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (27.03.2015)
Старый 07.04.2015, 22:19   #114
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

Жека огромное спасибо, все доходчиво! На основе советов сделал целый класс который передается в функцию с разными наборами параметров для тряски, не только длительность но и другие
)).

Сейчас встал в ступор снова. Задача, рейкастом выделить объекты на плоскости. Написал код, рейкаст исправно отрисовывает курсор в месте пересечения, но ни в какую не ловит объекты, которые на нем расположены. В чем беда? Layer стоит у объектов Default

using UnityEngine;
using System.Collections;

public class 
SelectUnit MonoBehaviour {

    public 
Transform Cursor;
    public 
Camera RealCamera;
    public 
float MouseXCordMouseYCord;
    private 
Vector3 velocityCur Vector3.zero;
    public 
Ray Position_on_plane;
    public 
RaycastHit RayInfo;
    public 
Vector3 PointRayCursorPosition;
    public 
GameObject Unit_was_Hit;
    
    
void Start () {
    
    }
    
    
void Update () {
    
MouseXCord Input.mousePosition.x;
    
MouseYCord Input.mousePosition.y;
    
SetPosition_on_plane ();
    
Analize_Hit_Unit ();
    }
    
    public 
void 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 velocityCur,0.1f);    // плавно переместить курсор в точку назначения
    
}    
    
    public 
void Analize_Hit_Unit () {
    if (
RayInfo.transform!=nullUnit_was_Hit = (GameObject)RayInfo.collider.gameObject// вот тут происходит поиск объекта
        
}

Пробовал информацию доставать и из коллайдера и из трансформа, результат такой же.
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 07.04.2015, 23:59   #115
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,892
Написано 1,185 полезных сообщений
(для 3,298 пользователей)
Ответ: Передача переменной в метод

Сообщение от EvilOkta Посмотреть сообщение
Жека огромное спасибо, все доходчиво! На основе советов сделал целый класс который передается в функцию с разными наборами параметров для тряски, не только длительность но и другие
)).

Сейчас встал в ступор снова. Задача, рейкастом выделить объекты на плоскости. Написал код, рейкаст исправно отрисовывает курсор в месте пересечения, но ни в какую не ловит объекты, которые на нем расположены. В чем беда? Layer стоит у объектов Default

... 
Пробовал информацию доставать и из коллайдера и из трансформа, результат такой же.
У меня показывает с каким объектом пересечение. Проверь если ли коллайдер у выделяемых объектов и не стоит ли на них "IsTrigger".
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (08.04.2015)
Старый 08.04.2015, 09:41   #116
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

Сообщение от Nex Посмотреть сообщение
У меня показывает с каким объектом пересечение. Проверь если ли коллайдер у выделяемых объектов и не стоит ли на них "IsTrigger".
спасибо )) нашел проблему! Оказалось size у коллайдеров почему-то сбросился на 0, вот рейкаст их и не видел. Сейчас все заработало! Спасибо!))
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 08.04.2015, 22:14   #117
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

Есть какая-нибудь альтернатива использовать GameObject.FindGameObjectsWithTag для заполнения списка List<>, а не массива []? Делаю через промежуточный массив, но понимаю что тем самым удваиваю нагрузку на память.
public List<GameObjectUnitList = new List<GameObject>(); 
    public 
GameObject[] UnitsInScene;
        
    
void Start () {
    
UnitsInScene GameObject.FindGameObjectsWithTag("Unit Player");
    for (
int i=0i<=UnitsInScene.Lengthi++) {UnitList.Add (UnitsInScene[i]);}
    } 
Код работает как надо, но ищу вариант составления списка юнитов сразу в List (ибо массив динамический и методы нужны). Есть такие способы?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 08.04.2015, 22:56   #118
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,892
Написано 1,185 полезных сообщений
(для 3,298 пользователей)
Ответ: Передача переменной в метод

Сообщение от EvilOkta Посмотреть сообщение
Есть какая-нибудь альтернатива использовать GameObject.FindGameObjectsWithTag для заполнения списка List<>, а не массива []?
Возможно так
UnitList.AddRange(GameObject.FindGameObjectsWithTag("Unit Player"));
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (08.04.2015)
Старый 09.04.2015, 13:57   #119
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

Ребят, посоветуйте книги/статьи/материалы которые можно почитать по системам событий, делегатам, подпискам и синглтонам. Вчера уперся в стену в скрипте, понял что без понимания этих механизмов дальше в разработке не продвинусь, так как сложность взаимодействия скриптов друг с другом растет в геометрической прогрессии, а getcomponent на каждый чих скрипта делать накладно )))
Хочу разобраться в простейшем примере, уже поставил задачу. Смысл такой - есть список объектов. Нужно создать событие (выделение конкретного объекта мышкой), на которое подпишутся все остальные объекты и проделают у себя манипуляции со своими скриптами.
Читал пару статей на хабре, но не могу в голове уложить алгоритм - где объявлять издателя, где производить подписку, какая роль статических классов и методов во всем этом.
В общем что посоветуете? MDSN уже почитал - для восприятия сложно.
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 09.04.2015, 22:45   #120
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,217
Написано 436 полезных сообщений
(для 784 пользователей)
Ответ: Передача переменной в метод

http://gameprogrammingpatterns.com/contents.html
Можно каждую главу отдельно от других читать, написано довольно хорошо и понятно (на мой взгляд). Ещё по паттернам читал книгу "банды четырёх", но не впечатлился.
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (09.04.2015)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 01:34.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com