Переместить объект с помощью 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;
}
}
} }