Physics.Raycast - Форум Игроделов
Пт, 17 Май 2024, 05:18 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Игроделов » UNITY3D » СКРИПТИНГ » Physics.Raycast
Physics.Raycast
commandobyДата: Вт, 10 Июн 2014, 23:54 | Сообщение # 1
Unity 3D Free
 
Сообщений: 836
Награды: 3
Репутация: 211
Статус: Offline
Действительно ли Physics.Raycast возвращает данные только в следующем кадре, или нет?


P.S.Счастливое сообщение. (777'ое)


Блог.

Сообщение отредактировал commandoby - Вт, 10 Июн 2014, 23:57
 
СообщениеДействительно ли Physics.Raycast возвращает данные только в следующем кадре, или нет?


P.S.Счастливое сообщение. (777'ое)

Автор - commandoby
Дата добавления - 10 Июн 2014 в 23:54
ЛевшаДата: Ср, 11 Июн 2014, 00:25 | Сообщение # 2
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Цитата commandoby ()
Действительно ли Physics.Raycast возвращает данные только в следующем кадре

Сомневаюсь... скорее в том же.


X.cor.R (Prologue)
 
Сообщение
Цитата commandoby ()
Действительно ли Physics.Raycast возвращает данные только в следующем кадре

Сомневаюсь... скорее в том же.

Автор - Левша
Дата добавления - 11 Июн 2014 в 00:25
seamanДата: Ср, 11 Июн 2014, 01:39 | Сообщение # 3
Гуру
 
Сообщений: 1748
Награды: 10
Репутация: 660
Статус: Offline
Это не корутина, при этом новый поток не запускается. Это обычная функция. У всех обычных функция возвращается результат сразу, без задержки.
Логично? Вроде да. Хотя я не проверял.
 
СообщениеЭто не корутина, при этом новый поток не запускается. Это обычная функция. У всех обычных функция возвращается результат сразу, без задержки.
Логично? Вроде да. Хотя я не проверял.

Автор - seaman
Дата добавления - 11 Июн 2014 в 01:39
commandobyДата: Ср, 11 Июн 2014, 12:32 | Сообщение # 4
Unity 3D Free
 
Сообщений: 836
Награды: 3
Репутация: 211
Статус: Offline
Вот что происходит в моей игре:

Переменная PositionDURL0 равна 1, если куб не проник в поверхность, и меньше, если проник. Данные к переменной собираются со 100 Physics.Raycast, ищутся проникающие, выбирается один и отправляется этой переменной.
На скриншотах 3 кадра приземления.
Первый - кадр до приземления; переменная верно равна 1.
Второй - кадр приземления; куб проникает сквозь объект; переменная всё ещё равна 1.
Третий - кадр восстановления; переменная не равна 1 и куб встаёт на место.


Может задержка из-за кода или я что то не понимаю.


Блог.

Сообщение отредактировал commandoby - Ср, 11 Июн 2014, 12:35
 
СообщениеВот что происходит в моей игре:

Переменная PositionDURL0 равна 1, если куб не проник в поверхность, и меньше, если проник. Данные к переменной собираются со 100 Physics.Raycast, ищутся проникающие, выбирается один и отправляется этой переменной.
На скриншотах 3 кадра приземления.
Первый - кадр до приземления; переменная верно равна 1.
Второй - кадр приземления; куб проникает сквозь объект; переменная всё ещё равна 1.
Третий - кадр восстановления; переменная не равна 1 и куб встаёт на место.


Может задержка из-за кода или я что то не понимаю.

Автор - commandoby
Дата добавления - 11 Июн 2014 в 12:32
seamanДата: Ср, 11 Июн 2014, 14:05 | Сообщение # 5
Гуру
 
Сообщений: 1748
Награды: 10
Репутация: 660
Статус: Offline
Как первый и второй код связаны? Например если оба в Update и второй расположен перед первым, то он получит данные от первого только в следующем кадре.
ЗЫ: Если куб - зачем столько рейкастов?
 
СообщениеКак первый и второй код связаны? Например если оба в Update и второй расположен перед первым, то он получит данные от первого только в следующем кадре.
ЗЫ: Если куб - зачем столько рейкастов?

Автор - seaman
Дата добавления - 11 Июн 2014 в 14:05
commandobyДата: Ср, 11 Июн 2014, 16:44 | Сообщение # 6
Unity 3D Free
 
Сообщений: 836
Награды: 3
Репутация: 211
Статус: Offline
Я тоже думал, что проблема в передаче, но второй сразу после всех рейкастов. Вот целый кусок:
Код
var pos : float[] = [-0.29,-0.15,0,0.15,0.29];
var positionDULR = new Array ();
var positionDULRVector3 = new Array ();

var downInt : int = 0;
for(var xDown = 0; xDown < 5; xDown++) {
for(var yDown = 0; yDown < 5; yDown++) {
var hitDown : RaycastHit;
Physics.Raycast (transform.position+Vector3(pos[xDown],0.29,pos[yDown]), Vector3.down, hitDown, 10.0);
distanceDown[downInt] = Vector3.Distance(transform.position+Vector3(pos[xDown],0.29,pos[yDown]), hitDown.point);
downInt++;
}}
posMinDown = Mathf.Min(distanceDown);
if (posMinDown<0.598) { positionDULR.Add(posMinDown); positionDULRVector3.Add(Vector3(0,1,0)); }

var upInt : int = 0;
for(var xUp = 0; xUp < 5; xUp++) {
for(var yUp = 0; yUp < 5; yUp++) {
var hitUp : RaycastHit;
Physics.Raycast (transform.position+Vector3(pos[xUp],-0.29,pos[yUp]), Vector3.up, hitUp, 10.0);
distanceUp[upInt] = Vector3.Distance(transform.position+Vector3(pos[xUp],-0.29,pos[yUp]), hitUp.point);
upInt++;
}}
posMinUp = Mathf.Min(distanceUp);
if (posMinUp<0.598) { positionDULR.Add(posMinUp); positionDULRVector3.Add(Vector3(0,-1,0)); }

var rightInt : int = 0;
for(var xRight = 0; xRight < 5; xRight++) {
for(var yRight = 0; yRight < 5; yRight++) {
var hitRight : RaycastHit;
Physics.Raycast (transform.position+Vector3(-0.29,pos[yRight],pos[xRight]), Vector3.right, hitRight, 10.0);
distanceRight[rightInt] = Vector3.Distance(transform.position+Vector3(-0.29,pos[yRight],pos[xRight]), hitRight.point);
rightInt++;
}}
posMinRight = Mathf.Min(distanceRight);
if (posMinRight<0.598) { positionDULR.Add(posMinRight); positionDULRVector3.Add(Vector3(-1,0,0)); }

var leftInt : int = 0;
for(var xLeft = 0; xLeft < 5; xLeft++) {
for(var yLeft = 0; yLeft < 5; yLeft++) {
var hitLeft : RaycastHit;
Physics.Raycast (transform.position+Vector3(0.29,pos[yLeft],pos[xLeft]), Vector3.left, hitLeft, 10.0);
distanceLeft[leftInt] = Vector3.Distance(transform.position+Vector3(0.29,pos[yLeft],pos[xLeft]), hitLeft.point);
leftInt++;
}}
posMinLeft = Mathf.Min(distanceLeft);
if (posMinLeft<0.598) { positionDULR.Add(posMinLeft); positionDULRVector3.Add(Vector3(1,0,0)); }

if (positionDULR.length>1) {
if (positionDULR[1] > positionDULR[0]) { positionDULR[0] = positionDULR[1]; positionDULRVector3[0] = positionDULRVector3[1]; }
}

if (positionDULR.length>0) {
positionDULR0 = positionDULR[0];
transform.position += (0.599-positionDULR[0])*positionDULRVector3[0];
//кусок кода, не связанный с проблемой
} else {
positionDULR0 = 1;
}


Цитата seaman ()
ЗЫ: Если куб - зачем столько рейкастов?

Он может упасть или удариться не на плоскость, а на балку, или об край.


Блог.

Сообщение отредактировал commandoby - Ср, 11 Июн 2014, 16:50
 
СообщениеЯ тоже думал, что проблема в передаче, но второй сразу после всех рейкастов. Вот целый кусок:
Код
var pos : float[] = [-0.29,-0.15,0,0.15,0.29];
var positionDULR = new Array ();
var positionDULRVector3 = new Array ();

var downInt : int = 0;
for(var xDown = 0; xDown < 5; xDown++) {
for(var yDown = 0; yDown < 5; yDown++) {
var hitDown : RaycastHit;
Physics.Raycast (transform.position+Vector3(pos[xDown],0.29,pos[yDown]), Vector3.down, hitDown, 10.0);
distanceDown[downInt] = Vector3.Distance(transform.position+Vector3(pos[xDown],0.29,pos[yDown]), hitDown.point);
downInt++;
}}
posMinDown = Mathf.Min(distanceDown);
if (posMinDown<0.598) { positionDULR.Add(posMinDown); positionDULRVector3.Add(Vector3(0,1,0)); }

var upInt : int = 0;
for(var xUp = 0; xUp < 5; xUp++) {
for(var yUp = 0; yUp < 5; yUp++) {
var hitUp : RaycastHit;
Physics.Raycast (transform.position+Vector3(pos[xUp],-0.29,pos[yUp]), Vector3.up, hitUp, 10.0);
distanceUp[upInt] = Vector3.Distance(transform.position+Vector3(pos[xUp],-0.29,pos[yUp]), hitUp.point);
upInt++;
}}
posMinUp = Mathf.Min(distanceUp);
if (posMinUp<0.598) { positionDULR.Add(posMinUp); positionDULRVector3.Add(Vector3(0,-1,0)); }

var rightInt : int = 0;
for(var xRight = 0; xRight < 5; xRight++) {
for(var yRight = 0; yRight < 5; yRight++) {
var hitRight : RaycastHit;
Physics.Raycast (transform.position+Vector3(-0.29,pos[yRight],pos[xRight]), Vector3.right, hitRight, 10.0);
distanceRight[rightInt] = Vector3.Distance(transform.position+Vector3(-0.29,pos[yRight],pos[xRight]), hitRight.point);
rightInt++;
}}
posMinRight = Mathf.Min(distanceRight);
if (posMinRight<0.598) { positionDULR.Add(posMinRight); positionDULRVector3.Add(Vector3(-1,0,0)); }

var leftInt : int = 0;
for(var xLeft = 0; xLeft < 5; xLeft++) {
for(var yLeft = 0; yLeft < 5; yLeft++) {
var hitLeft : RaycastHit;
Physics.Raycast (transform.position+Vector3(0.29,pos[yLeft],pos[xLeft]), Vector3.left, hitLeft, 10.0);
distanceLeft[leftInt] = Vector3.Distance(transform.position+Vector3(0.29,pos[yLeft],pos[xLeft]), hitLeft.point);
leftInt++;
}}
posMinLeft = Mathf.Min(distanceLeft);
if (posMinLeft<0.598) { positionDULR.Add(posMinLeft); positionDULRVector3.Add(Vector3(1,0,0)); }

if (positionDULR.length>1) {
if (positionDULR[1] > positionDULR[0]) { positionDULR[0] = positionDULR[1]; positionDULRVector3[0] = positionDULRVector3[1]; }
}

if (positionDULR.length>0) {
positionDULR0 = positionDULR[0];
transform.position += (0.599-positionDULR[0])*positionDULRVector3[0];
//кусок кода, не связанный с проблемой
} else {
positionDULR0 = 1;
}


Цитата seaman ()
ЗЫ: Если куб - зачем столько рейкастов?

Он может упасть или удариться не на плоскость, а на балку, или об край.

Автор - commandoby
Дата добавления - 11 Июн 2014 в 16:44
Форум Игроделов » UNITY3D » СКРИПТИНГ » Physics.Raycast
  • Страница 1 из 1
  • 1
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024