Вы передаете
transform.position = new Vector3(touchPos.x = deltaX, touchPos.y = deltaY, initialPosition.z);
в
case TouchPhase.Moved:
if (Physics.Raycast(raycast, out raycastHit))
{
if (raycastHit.collider.name == this.name)
{
Debug.Log("move " + " " + this.name);
transform.position = new Vector3(touchPos.x = deltaX, touchPos.y = deltaY, initialPosition.z);
}
}
break;
, что заставляет ваш объект придерживаться начальной позиции, с которой началось касание, до достижения случая TouchPhase.Ended
.
Полагаю, вам скорее всего хотелось бы сохранить начальную Дельту:
private Vector2 initialDelta;
и установить ее в
case TouchPhase.Began:
if (Physics.Raycast(raycast, out raycastHit))
{
if (raycastHit.collider.name == this.name)
{
initialDelta = transform.position - touchPos;
}
}
break;
А затем использовать эту Дельту для позиционирования объекта
case TouchPhase.Moved:
if (Physics.Raycast(raycast, out raycastHit))
{
if (raycastHit.collider.name == this.name)
{
Debug.Log("move " + " " + this.name);
transform.position = touchPos + initialDelta + Vector3.forward * initialPosition.z;
}
}
break;
В общем
Я бы не позволил каждому объекту обрабатывать raycast! Это довольно дорого
Вместо этого поместите ваш сценарий на один единственный контроллер объект на сцене и дополнительно сохраните, какой объект вы ударили.
Затем вы можете поместить все свои подвижные объекты в специальный Layer и отфильтруйте ваш Raycast, чтобы он попал только в этот указанный c слой.
Что-то вроде, например,
// Set via the Inspector
public LayerMask raycastLayers;
private Transform currentlyDraggedObject;
и затем получите его в
case TouchPhase.Began:
if (Physics.Raycast(raycast, out raycastHit, layermask = (int)raycastLayers))
{
currentlyDraggedObject = raycastHit.transform;
initialDelta = currentlyDraggedObject.position - touchPos;
// Your component would now only store and provide public the target position
objectPosition = currentlyDraggedObject.GetComponent<Moveable>().objectPosition;
}
break;
, а затем выполните манипуляции с перетаскиваемым объектом
case TouchPhase.Moved:
if (currentlyDraggedObject)
{
Debug.Log("move " + " " + currentlyDraggedObject.name);
currentlyDraggedObject.position = touchPos + initialDelta + Vector3.forward * initialPosition.z;
}
break;
case TouchPhase.Ended:
if(currentlyDraggedObject)
{
if (Mathf.Abs(currentlyDraggedObject.position.x - objectPosition.position.x) <= snapdifficulty
&& Mathf.Abs(currentlyDraggedObject.position.y - objectPosition.position.y) <= snapdifficulty)
{
currentlyDraggedObject.position = new Vector3(objectPosition.position.x, objectPosition.position.y, initialPosition.z);
correctPosition = true;
}
else
{
currentlyDraggedObject.position = new Vector3(initialPosition.x, initialPosition.y, initialPosition.z);
}
currentlyDraggedObject = null;
}
break;
Печатается на смартфоне, но я надеюсь, что идея проясняется