2016-04-25 19 views
1

Ich habe eine VR-Szene mit einem C# -Skript auf der Kamera, die den Benutzer ermöglicht, einmal zu klicken, um zu bewegen und wieder zu stoppen.Unity3D für Google Cardboard

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; 
     } 
    } 

Was ich wissen will, ist, wie ich & HOLD rückwärts zu bewegen, klicken Sie kann ..? Vielen Dank!

~ b

+0

Wenn Sie auf CLICK & HOLD klicken und es sich rückwärts bewegt, wann hört es auf, sich rückwärts zu bewegen? Wann veröffentlichen Sie es? Wenn Sie erneut KLICK & HALTEN? Du hast diese Information vergessen. – Programmer

Antwort

2

Verwenden Sie enum die repräsentieren den Status der Maus anstelle von startedMoving oder mehrere booleans, die alles einfacher zu implementieren macht. Der Kommentar im Code beschreibt, wie es funktioniert.

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

Brilliant! Ja Programmierer! Das funktioniert besser. DANKE ! – Bentoon

+0

@Bentoon Ich weiß nicht, wann du rückwärts nach ** Stopp ** gehen willst. Kannst du das beantworten? Ich weiß, dass diese Antwort akzeptiert wird, aber ich möchte es beheben. Wenn Sie auf CLICK & HOLD klicken und es sich rückwärts bewegt, wann hört es auf, sich rückwärts zu bewegen? Wann veröffentlichen Sie es? Wenn Sie erneut KLICK & HALTEN? Du hast diese Information vergessen. – Programmer

+0

Ich möchte, dass es rückwärts stoppt, wenn du es loslässt, aber dringender ist, dass ich vorwärts und rückwärts gehen muss, in welche Richtung der Cam in VR zeigt ... Ideen? THANKYOU – Bentoon

1

Da Sie nur eine Trigger-Aktion haben Sie gehen zu müssen, etwas Zeit für Hin- und Herschalten Vorwärts-/Rückwärtsbewegung Basis implementieren. Wenn Sie zum Beispiel den Auslöser schnell drücken und loslassen, kann der Vorwärtslauf umgeschaltet werden. Wenn Sie jedoch den Auslöser nach einer bestimmten Zeit gedrückt halten, gehen Sie rückwärts.

Er ist ein praktisches Beispiel für den Einstieg.

  • Drücken und den Abzug innerhalb 300ms Freigabe schaltet Vorwärtsbewegung
  • Drücken und den Auslöser für länger als 300 ms Holding Bewegung beginnen nach hinten, dem Loslassen des Auslösers wird dann stoppen Rückwärtsbewegung

Diese ist ein theoretisches Beispiel

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

Vielen Dank Rob !!!! Ich modded es und es funktioniert in Unity - Will in Cardboard jetzt testen ... – Bentoon

+0

Es funktioniert Aber ich muss vorwärts gehen und rückwärts die Richtung der Cam zeigt in – Bentoon

+0

Fixed, indem Sie es auf den Kopf anstelle der äußeren CardboadCam Container – Bentoon

Verwandte Themen