2016-04-25 7 views
1

У меня есть сцена VR с C# Script на камере, которая позволяет пользователю нажать один раз, чтобы переместить и снова остановить.Unity3D для Google Картон

public float speed = 1.0f; 
public bool startedMoving = true; 
public GameObject myCam; 


    // Update is called once per frame 
    void Update() { 

     if (startedMoving) { 
      transform.position += myCam.transform.forward * speed * Time.deltaTime; 
     } 

//  if(Input.GetButtonDown("Fire1")){ 
     if (Input.GetMouseButton(0)){ 
      startedMoving = !startedMoving; 
     } 
    } 

То, что я хочу знать, как я могу НАЖМИТЕ & ДЕРЖАТЬ двигаться в обратном направлении ..? Спасибо!

~ б

+0

Когда вы нажимаете кнопку CLICK & HOLD и движется назад, когда он перестает двигаться назад? Когда вы отпустите его? Когда вы снова нажмете CLICK & HOLD? Вы оставили эту информацию. – Programmer

ответ

2

Используйте enum, чтобы отобразить статус мыши вместо startedMoving или несколько очков booleans, что сделает все, проще осуществить. Комментарий в коде описывает, как это работает.

using UnityEngine; 
using System.Collections; 

public class ClickAndHeld : MonoBehaviour 
{ 
    public GameObject myCam; 
    CLICK_MODE clickMode = CLICK_MODE.NO_CLICK; 
    MOVE_DIRECTION moveDir = MOVE_DIRECTION.IDLE; 

    public float speed = 1.0f; 


    //If down for 0.5 secods the it is considered Click and Hold instead of Click 
    float clickHoldDetectTime = 0.5f; 
    float clickCounter = 0; //Dont not change 

    void Start() 
    { 
     StartCoroutine(mover()); 
    } 

    // Update is called once per frame 
    void Update() 
    { 

     if (Input.GetMouseButton(0)) 
     { 

      //If in NO_CLICK, set to CLICKED 
      if (clickMode == CLICK_MODE.NO_CLICK) 
      { 
       //Change the mode to CLICKED 
       clickMode = CLICK_MODE.CLICKED; 
      } 

      //If in CLICKED mode, start counting to clickHoldDetectTime 
      if (clickMode == CLICK_MODE.CLICKED) 
      { 
       clickCounter += Time.deltaTime; //Increment counter 

       //Check if we have reached the clickHoldDetectTime time 
       if (clickCounter > clickHoldDetectTime) 
       { 
        //Reset Counter 
        clickCounter = 0; 

        //Change the mode to CLICK_AND_HELD 
        clickMode = CLICK_MODE.CLICK_AND_HELD; 
       } 
      } 

      //If STILL down and the the current mode is CLICK_AND_HELD then do clickedAndHeldDown stuff 
      if (clickMode == CLICK_MODE.CLICK_AND_HELD) 
      { 
       clickedAndHeldDown(); 
      } 
     } 
     else 
     { 
      //If released and the current mode is CLICKED then do clicked stuff 
      if (clickMode == CLICK_MODE.CLICKED) 
      { 
       clicked(); 
      } 

      //If released and the current mode is CLICK_AND_HELD, change to RELEASED then do relased stuff 
      if (clickMode == CLICK_MODE.CLICK_AND_HELD) 
      { 
       //Change the mode to RELEASED 
       clickMode = CLICK_MODE.RELEASED; 
       mouseReleasedAfterBeingHeld(); 
      } 


      //Reset each time mouse button is released 
      reset(); 
     } 

    } 

    IEnumerator mover() 
    { 
     while (true) 
     { 

      if (moveDir == MOVE_DIRECTION.IDLE) 
      { 

      } 

      //Move Forward 
      if (moveDir == MOVE_DIRECTION.FORWARD) 
      { 

       transform.position += myCam.transform.forward * speed * Time.deltaTime; 
      } 

      //Move Backward 
      if (moveDir == MOVE_DIRECTION.BACKWARD) 
      { 
       transform.position -= myCam.transform.forward * speed * Time.deltaTime; 
      } 
      yield return null; 
     } 
    } 

    private void clicked() 
    { 
     Debug.Log("CLICKED"); 

     //If Idle, become Forward 
     if (moveDir == MOVE_DIRECTION.IDLE) 
     { 
      moveDir = MOVE_DIRECTION.FORWARD; 
     } 

     //If forward, moves become idle 
     else if (moveDir == MOVE_DIRECTION.FORWARD) 
     { 
      moveDir = MOVE_DIRECTION.IDLE; 
     } 

     //-------------------------------------------------- 
     //If backward, moves become idle 
     else if (moveDir == MOVE_DIRECTION.BACKWARD) 
     { 
      moveDir = MOVE_DIRECTION.IDLE; 
     } 
    } 

    private void clickedAndHeldDown() 
    { 
     Debug.Log("CLICKED AND HELD"); 

     //If Idle, becomes backward 
     if (moveDir == MOVE_DIRECTION.IDLE) 
     { 
      moveDir = MOVE_DIRECTION.BACKWARD; 
     } 
    } 


    //Called when released after being RELEASED from CLICKED_HELD 
    private void mouseReleasedAfterBeingHeld() 
    { 
     Debug.Log("RELEASED AFTER CLICKED AND HELD"); 

     //If backward, move becomes idle 
     if (moveDir == MOVE_DIRECTION.BACKWARD) 
     { 
      moveDir = MOVE_DIRECTION.IDLE; 
     } 

     //-------------------------------------------------- 
     //If forward, move becomes idle 
     else if (moveDir == MOVE_DIRECTION.FORWARD) 
     { 
      moveDir = MOVE_DIRECTION.IDLE; 
     } 
    } 

    void reset() 
    { 
     clickMode = CLICK_MODE.NO_CLICK; 
     clickCounter = 0; 
    } 
} 

public enum CLICK_MODE 
{ 
    NO_CLICK, CLICKED, CLICK_AND_HELD, RELEASED 
} 

public enum MOVE_DIRECTION 
{ 
    IDLE, FORWARD, BACKWARD 
} 
+0

Блестящий! Да, программист! Это работает лучше. СПАСИБО ! – Bentoon

+0

@Bentoon Я не знаю, когда вы хотите, чтобы движение назад ** остановилось **. Можете ли вы ответить на это? Я знаю, что этот ответ принят, но я хочу его исправить. Когда вы нажимаете CLICK & HOLD и движется назад, когда он перестает двигаться назад? Когда вы отпустите его? Когда вы снова нажмете CLICK & HOLD? Вы оставили эту информацию. – Programmer

+0

Я хочу, чтобы он отступил назад, когда вы отпустите, но более насущный - мне нужно идти вперед и назад в направлении, в котором точки Cam в VR ... идеях? THANKYOU – Bentoon

1

Поскольку у вас есть только один триггер действие, которое вы собираетесь иметь, чтобы осуществить что-то время, основанное на переключая вперед/назад движение. Например, если вы нажимаете и отпускаете триггер быстро, то перемещение вперед может быть переключено, но если вы удерживаете спусковой крючок после N продолжительности времени, тогда ходите назад.

Он практический пример, чтобы вы начали.

  • нажатие и отпускание триггера в пределах 300 мс будет переключать движение вперед
  • Нажатие и удерживание на спусковой крючок дольше, чем 300мс начнет назад движение, освобождая курок затем остановится в обратном движению

Эта теоретический пример

public float speed = 1.0f; 
bool triggerPressed = false; 
float triggerHeldTime = 0f; 
public bool movingForwards = false; 
public bool movingBackwards = false; 


void Update() 
{ 
    // increment hold time if we're still holding trigger 
    if (Input.GetMouseButton(0) && triggerPressed) 
     triggerHeldTime += Time.deltaTime; 

    if (Input.GetMouseButton(0) && !triggerPressed) 
    { 
     // reset everything when trigger initially pressed 
     movingForards = false; 
     movingBackwards = false; 
     triggerHeldTime = 0f; 
     triggerPressed = true; 
    } 
    else if (!Input.GetMouseButton(0) && triggerPressed) 
    { 
     // upon trigger release 

     triggerPressed = false; 

     // if we are not moving backwards, toggle forwards movement 
     if(!movingBackwards) 
      movingForwards = !movingForwards; 

     // always reset backwards movement when we release the trigger 
     movingBackwards = false; 
     triggerHeldTime = 0f; 
    } 

    // if the trigger has been held for 300ms then move backwards 
    if(triggerHeldTime > 0.3f) 
    { 
     moveForwards = false; 
     moveBackwards = true; 
    } 


    // actually perform the movement 
    if (moveForwards) 
    { 
     transform.position += myCam.transform.forward * speed * Time.deltaTime; 
    } 
    else if(moveBackwards) 
    { 
     transform.position -= myCam.transform.forward * speed * Time.deltaTime; 
    } 

} 
+0

Спасибо, Роб !!!! Я изменил его, и он работает в Unity. Будет ли тестироваться в Картоне сейчас ... – Bentoon

+0

Это работает. Но мне нужно идти вперед и назад направлять точки Cam в – Bentoon

+0

Исправлено, применяя его к голове вместо контейнера Outer CardboadCam – Bentoon