Я не уверен, почему ваш сборник дрейфует с помощью кода, который вы предоставили, попробуйте сбросить скорость до нуля после того, как вы закончите движение сборного блока.
rb.velocity = new Vector3(0,0,0);
Или, может быть, это связано с тем, что вы перемещаете сборный блок слишком далеко от своего родительского якоря или, может быть, от самолета, обнаруженного аркой.
Но у меня есть другой проверенный способ переместить сборку, используя сенсорный ввод на плоскостях, обнаруженных в Arcore, и поскольку он позволяет перемещать сборный блок только на обнаруженных плоскостях, чтобы вы могли легко сбросить свой якорь после того, как вы закончите замену сборного блока.
Я изменил бы скрипт HelloARController.cs следующим образом.
bool move = false; //handle move with some button calls
void Update(){
//add this in your update method to call MoveObject() method
//handle move with some buttons
if(move){
MoveObject();
}
}
void MoveObject(){
if(Input.touchCount == 1){
Touch touch = Input.GetTouch(0);
TrackableHit hit;
TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon | TrackableHitFlags.FeaturePointWithSurfaceNormal;
if (Frame.Raycast (touch.position.x, touch.position.y, raycastFilter, out hit)) {
if ((hit.Trackable is DetectedPlane) && Vector3.Dot (firstPersonCamera.transform.position - hit.Pose.position, hit.Pose.rotation * Vector3.up) < 0) {
Debug.Log ("Hit at back of the current detected plane");
}
else {// KEY CODE SNIPPET : moves the selectedObject at the location of touch on detected planes
selectedObject.transform.position = hit.Pose.position;
}
}
else {
Debug.Log ("Not moving");
}
}
}
здесь selectedObject - это вы и подборка того, что вы создаете. Убедитесь, что вы создаете экземпляр только одного сборника за раз и отсылаете его к выбранному объекту.