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 и куб встаёт на место.
Код сбора информации с одной стороны:
Код
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)); }
Код, восстанавливающий положение игрока:
Код
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]; if (positionDULRVector3[0]==Vector3(0,1,0)) { jampDablTime = 0; jamp = 0; if (Input.GetKey(KeyCode.UpArrow)) { jampBoolean = false; } } if (positionDULRVector3[0]==Vector3(0,-1,0)) { jampDablTime = 10; jamp = -1; playerAnimation = 0; } if (positionDULRVector3[0]==Vector3(1,0,0)) { playerAnimation = 0; } if (positionDULRVector3[0]==Vector3(-1,0,0)) { playerAnimation = 0; } } else { positionDULR0 = 1; }
Может задержка из-за кода или я что то не понимаю.
Блог.
Сообщение отредактировал commandoby - Ср, 11 Июн 2014, 12:35
Сообщение Вот что происходит в моей игре: Переменная PositionDURL0 равна 1, если куб не проник в поверхность, и меньше, если проник. Данные к переменной собираются со 100 Physics.Raycast, ищутся проникающие, выбирается один и отправляется этой переменной. На скриншотах 3 кадра приземления. Первый - кадр до приземления; переменная верно равна 1. Второй - кадр приземления; куб проникает сквозь объект; переменная всё ещё равна 1. Третий - кадр восстановления; переменная не равна 1 и куб встаёт на место.
Код сбора информации с одной стороны:
Код
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)); }
Код, восстанавливающий положение игрока:
Код
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]; if (positionDULRVector3[0]==Vector3(0,1,0)) { jampDablTime = 0; jamp = 0; if (Input.GetKey(KeyCode.UpArrow)) { jampBoolean = false; } } if (positionDULRVector3[0]==Vector3(0,-1,0)) { jampDablTime = 10; jamp = -1; playerAnimation = 0; } if (positionDULRVector3[0]==Vector3(1,0,0)) { playerAnimation = 0; } if (positionDULRVector3[0]==Vector3(-1,0,0)) { playerAnimation = 0; } } else { positionDULR0 = 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