Я не уверен, почему ваш префаб дрейфует с предоставленным вами фрагментом кода. Попробуйте сбросить скорость до нуля после того, как вы закончите с перемещением префаба.
rb.velocity = new Vector3(0,0,0);
Или, может быть, это такиз-за того, что вы перемещаете префаб слишком далеко от его родительского якоря или, возможно, от плоскости, обнаруженной arcore.
Но у меня есть другой проверенный способ перемещения префаба с помощью сенсорного ввода наПлоскости обнаружены 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 - это ваш и любой префаб из всего, что вы создаете.Убедитесь, что вы создаете только один префаб одновременно, и отсылаете его к selectedObject.