2016-05-19 7 views
0

Я написал сценарий для перемещения объекта с помощью луча в позиции на местности, однако я не могу, чтобы жизнь меня казалась гладкой. Я пробовал всевозможные вещи, пытаясь понять это (как вы, вероятно, можете сказать по количеству прокомментированного кода ниже); отключая различные переменные жесткости, однако безрезультатно.Smooth raycast positioning

Один из подходов, с помощью которых (вида) был отключен коллайдер, прикрепленный к объекту, однако это приводит к непреднамеренному погружению объекта под ландшафт.

Может кто-нибудь, пожалуйста, посоветуйте мне, как наилучшим образом подойти к этому? Я чувствую, что это должно быть очень просто, но я слишком усложняю это.

  //Move 
     if (Input.GetKey(KeyCode.E)) { 
      //   if (Input.GetKeyDown(KeyCode.E)) 
      //   { 
      //    modObj.GetComponent(BoxCollider).enabled = false;    
      initPos = modObj.transform.position; 
      var initRotation = modObj.transform.rotation; 
      //   } 
      //    
      //   modObj.GetComponent(Rigidbody).isKinematic = true; 
      //   modObj.GetComponent(Rigidbody).useGravity = false; 

      moveObject(modObj, initPos, initRotation); 
     } else { 
      //   modObj.GetComponent(BoxCollider).enabled = true; 
      //   modObj.GetComponent(Rigidbody).isKinematic = false; 
      //   modObj.GetComponent(Rigidbody).useGravity = true; 
     } 
function moveObject(modObj: GameObject, initPos: Vector3, initRotation: Quaternion) { 
    //Debug.Log("Moving Object"); 

    var hit: RaycastHit; 
    var foundHit: boolean = false; 

    foundHit = Physics.Raycast(transform.position, transform.forward, hit); 
    //Debug.DrawRay(transform.position, transform.forward, Color.blue); 

    if (foundHit && hit.transform.tag == "Terrain") { 
    modifyObjGUIscript.activateMoveDisplay(initPos, hit.point); 

    //  var meshHalfHeight = modObj.GetComponent.<MeshRenderer>().bounds.size.y /2; //helps account for large and small objects 

    modObj.transform.position = hit.point; //***method 01*** 
    //  modObj.transform.position = Vector3.Lerp(initPos, hit.point, speed); //***method 02*** 
    //  modObj.transform.position = Vector3.SmoothDamp(initPos, hit.point, velocity, smoothTime); //***method 02*** 

    //  modObj.transform.position.y = modObj.transform.position.y + meshHalfHeight + hoverHeight; 

    modObj.transform.rotation = initRotation; 
    } 
} 

ответ

1

Вы должны вызвать MoveObject пересчитывать позицию весьма часто - каждый кадр, если это возможно. Например, из «Обновления» или из сопрограммы:

void Update() 
{ 
    modObj.transform.position = Vector3.Lerp(initPos, hit.point, speed); 
} 


IEnumerator MoveObject(Vector3 initPos, Vector3 endPos, float speed) 
{ 
    while (initPos != endPos) 
    { 
    modObj.transform.position = Vector3.Lerp(initPos, endPos, speed); 
    yield return null; 
    } 
} 
+0

Право на. Также обратите внимание, что очень часто вы делаете это: у вас есть новый независимый маркер (т. Е. Пустой GameObject), называемый «Tracker». Но маленький белый куб на нем для целей развития, чтобы вы могли его увидеть. Поместите сценарий Джорела на Tracker (НЕ НА ВАШ АКТУАЛЬНЫЙ САМОЛЕТ). Сделать пользователя на самом деле управляющим и т. Д., Tracker. Затем, ваш самолет действительно * следит за Tracker везде *. Таким образом, вы можете * сгладить движение на Y * для самолета; часто бывает проще и логично это делать. – Fattie

+0

@joreldraw жаль должно быть яснее в моем сообщении: функция 'moveObject()' вызывается из 'Input.GetKey (KeyCode.E)' внутри 'FixedUpdate()'; это соответствует тому, что вы говорите? Я также изменил позиционирование с помощью преобразования объекта на его жесткое тело: 'var movRb = modObj.GetComponent. (); ' ' movRb.position = Vector3.Lerp (initPos, hit.point, speed); ' в соответствии с некоторой другой обратной связью, которую я получил. Это, безусловно, помогло, но не разрешило проблему. Любая дополнительная обратная связь будет высоко оценена. –

+0

попытайтесь вызвать сопрограмму coroutine с условием while, я редактирую сопрограмму для этого. – joreldraw