Перемещение игрового объекта в Arcore

Я работал над google ARCore и зациклился на том, как переместить игровой объект с входами, поступающими с устройства Android .

Холст, который я создал, - это точно с 4 кнопками, которые в качестве сценария AxisTouchButton из кросс-платформенного ввода охватывают вертикальную и горизонтальную. Я пробовал использовать тонкое прикосновение к масштабированию, переводить и поворачивать, кажется, работает отлично. Но когда я пытаюсь применить силу или скорость к игровому объекту, он отлично движется в первый раз, а затем, когда я снова опускаю кнопки, он запускается плавать в этом конкретном направлении, если не нажимается другая кнопка.

Следующий код предназначен для перемещения игрового объекта, прикрепленного к префизу Andy в сценарии HelloAR, из примеров:

Vector3 offset=Vector3.zero;

offset.x = CrossPlatformInputManager.GetAxis("Horizontal");

offset.z= CrossPlatformInputManager.GetAxis("Vertical");

rb.velocity=(offset * speed ) ;

android,unity3d,augmented-reality,arcore,

0

Ответов: 1


0

Я не уверен, почему ваш сборник дрейфует с помощью кода, который вы предоставили, попробуйте сбросить скорость до нуля после того, как вы закончите движение сборного блока.

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 - это вы и подборка того, что вы создаете. Убедитесь, что вы создаете экземпляр только одного сборника за раз и отсылаете его к выбранному объекту.

андроид, Unity3D, дополненная реальность, Arcore,
Похожие вопросы
Яндекс.Метрика