Перемещение игрового объекта в Arcore - PullRequest
0 голосов
/ 24 июня 2018

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

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

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

Vector3 offset=Vector3.zero;

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

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

rb.velocity=(offset * speed ) ;

1 Ответ

0 голосов
/ 28 июня 2018

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

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.

...