使用光线投射问题移动对象

时间:2016-05-12 02:28:43

标签: unity3d unityscript raycasting

我编写了一个脚本,其中游戏对象旨在移动到从玩家相机抛出的raycast.point。在大多数情况下,这种方法可以正常工作,但是当物体快速移向相机(即光线投射源)时,有时(大约相机距离物体45度)。

我尝试过多种尝试解决此问题的方法,但我似乎无法挖掘出这个问题的根源。通过停用附加到正在移动的对象的对撞机来管理以防止这种情况发生。但是我出于各种原因需要对撞机,所以这种方法并不合适。

如果有人能提供关于我哪里出错的任何指示,我将非常感激。

NB:在uJS编码

非常感谢Ryan



function FixedUpdate() {

  if (modObj != null && !guiMode) {

    //Panel Control 
    if (!selectObjPanel.activeSelf && !modifySelectObjPanel.activeSelf) //if the selectpanel not open and modSelect not already activated
    {
      activateModSelectObjPanel(true); //activate it
    } else if (selectObjPanel.activeSelf) {
      activateModSelectObjPanel(false);
    }


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

      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 != "Player") {
    //Debug.Log("Move to Hit Point: " + hit.point);
    modifyObjGUIscript.activateMoveDisplay(initPos, hit.point);

    var meshHalfHeight = modObj.GetComponent. < MeshRenderer > ().bounds.size.y / 2; //helps account for large and small objects
    //        Debug.Log("CurObj Mesh Min: " + meshHalfHeight);

    //        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***

    var rb = modObj.GetComponent. < Rigidbody > ();
    rb.MovePosition(hit.point); //***method 03***

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

    modObj.transform.rotation = initRotation;
  }
}
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

原来问题是由于光线投射击中了被移动的物体。通过仅允许来自地形的命中作为要移动的点来解决此问题。

if(foundHit && hit.transform.tag == "Terrain")