Я когда-то создал нечто подобное go.
Вы должны быть осторожны с ScreenToWorldPoint()
. Положение щелчка - это никогда не трехмерная точка в мире, а луч. В пространстве есть целая линия местоположений, которые будут появляться в одном и том же месте экрана.
Функция Unity ScreenToWorldPoint()
использует координату Z из входного вектора в качестве расстояния. Поскольку вы просто берете его с Input.GetTouch()
, это, безусловно, не то расстояние, на которое вы хотите.
Делайте c на нем: https://docs.unity3d.com/2020.1/Documentation/ScriptReference/Camera.ScreenToWorldPoint.html
Предпочтительно использовать Camera.ScreenPointToRay()
. Затем используйте этот луч, чтобы решить, какую точку вы хотите считать нажатой.
В моей реализации захвата я использовал это для вызова Physics.Raycast()
или Physics.RaycastAll()
, посмотрите на найденные хиты, и решите за точку попадания.
Когда игрок тянет, вам нужно решить, как изменить расстояние. Если вы щелкаете по карте, как в примере ссылки на видео, вы можете сохранить координату Y цели щелчка, а затем при каждом перемещении мыши пересекать новый луч с этой плоскостью Y.
В моем примере, Я просто сохранил расстояние, и это позволило игроку перемещать предмет, оставаясь на том же расстоянии, на котором оно было при поднятии.
Из моего образца, нажав, я делаю это:
// try to grab something.
Ray beam = new Ray(){origin=head.transform.position,direction=head.transform.forward};
RaycastHit hit;
if( ! Physics.Raycast(beam,out hit,15.0f) )
return;
grab_item = hit.rigidbody;
if( grab_item==null || grab_item.isKinematic )
return;
grab_pos_on_item = grab_item.transform.InverseTransformPoint(hit.point);
grab_distance = (hit.point-beam.origin).magnitude;
затем в каждом обновлении проверяйте, где находится новая точка, а затем перемещайте туда элемент.
if(grab_item!=null)
{
// p1: hand, p2: item
Vector3 p1 = head.transform.position + head.transform.forward * grab_distance;
Vector3 p2 = grab_item.transform.TransformPoint(grab_pos_on_item);
Vector3 dist = p1-p2;
// code to make the item move by 'dist'
Если я правильно понял, вам, возможно, будет интересно сохранить постоянную координаты Y?