Переместить объект с помощью Raycast

Я пытаюсь переместить y-позицию элемента пользовательского интерфейса в его локальное пространство, щелкая и перетаскивая его с помощью контроллера SteamVR и raycast. Я получаю то, что мне кажется непредсказуемым результатом.

Я пытаюсь получить положение raycast в начале перетаскивания и переместить его на расстояние между тем, где оно находится и где оно было начато при перетаскивании.

Вот мой код:

if (hit.transform.name == "Content" && scrollSet == false)
{
    content = hit.transform;
    scrollSet = true;
    scrollPos = hit.transform.position ;
}

if (scrollSet == true)
{
    if (rController.triggerPressed)
    {
        y = hit.transform.position.y - scrollPos.y;
        content.transform.localPosition = new Vector3(content.transform.localPosition.x,  content.localPosition.y + y, content.transform.localPosition.z);
    }
    else
    {
        scrollSet = false;
    }
}

1 ответ

Вы можете преобразовать.MovePosition в.MoveTowards. Но это все еще прыгнуло вокруг. Оказывается, что код выполнялся только во фрейме, в котором вы щелкнули правой кнопкой мыши, поэтому уберите его из оператора if.

Вот весь сценарий, помещенный в основную камеру. Вам всегда нужно выбирать цель, поэтому, чтобы избежать ошибок, вы должны поместить gameObject с жестким телом в "bTarg".

public class ClickTarget : MonoBehaviour {

private GameObject target; private Vector3 destination; private float distance; private Vector3 tTrans;

public GUIText targetDisplay; public float speed; public GameObject bTarg;

void Start () { targetDisplay.text = ""; distance = 0.0f; target = bTarg; }

void Update () { if(Input.GetButtonDown("Fire1")){ Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if(Physics.Raycast(ray, out hit)){ if(hit.collider != null){ if(hit.collider.tag == "Unit"){ target = hit.collider.gameObject; targetDisplay.text = "Unit: " + hit.collider.gameObject.name; destination = target.transform.position; target.rigidbody.freezeRotation = false; } if(hit.collider.tag == "Building"){ target = hit.collider.gameObject; targetDisplay.text = "Building: " + hit.collider.gameObject.name; } } } } }

void FixedUpdate(){ if (Input.GetButtonDown ("Fire2") && target.tag == "Unit" && GUIUtility.hotControl == 0) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if(Physics.Raycast(ray,out hit)){ destination = hit.point; } }

 tTrans = target.transform.position;
 distance = Vector3.Distance (tTrans, destination);
 if(target.tag == "Unit"){
     if (distance > .2f) {
         target.transform.LookAt (destination);
         target.transform.position = Vector3.MoveTowards (target.transform.position, destination, speed);
         target.rigidbody.freezeRotation = true;
     }
 }
} }
Другие вопросы по тегам