2016-05-10 9 views
1

Ich versuche, eine ähnliche Funktion wie Amnesie zu implementieren: Der Dunkle Abstieg lässt den Spieler die Maustaste gedrückt halten und an einer Tür nach vorne oder hinten ziehen, um sie zu öffnen (Wenn Sie nicht vertraut sind, siehe Door Example um ca. 36:30 Uhr).Öffnen Sie eine Tür vorne und hinten in Unity3D ähnlich Amnesia

Ich habe den folgenden Code, und es ist eine Art funktioniert, aber die Öffnung ist nervös und springt hin und her ein wenig, und ich kann nicht herausfinden, ob ich verwende transform.Rotate falsch:

if (previousMousePosition == garbageVector) // if this is the first frame, create a reference for previousMousePosition 
     previousMousePosition = Input.mousePosition; 
    else 
    { 
     // else find the difference and rotate 
     rotationAmount = (Input.mousePosition.x - previousMousePosition.x); 
     if (rotationAmount < 0) 
      this.transform.Rotate(Vector3.up * rotationSpeed * Time.deltaTime); 
     else if (rotationAmount > 0) 
      this.transform.Rotate(Vector3.down * rotationSpeed * Time.deltaTime); 

    } 

Hinweis: Dieses Skript ist an der fraglichen Tür angebracht.

Außerdem berücksichtigt mein Code nicht, auf welcher Seite der Tür der Player steht, wenn es darum geht, die Rotation zu bestimmen. Hat jemand irgendwelche Tipps, wo ich damit anfangen könnte?

Antwort

2

Der Code in Ihrer Frage ist zu klein, um dies zu erreichen. Irgendwelche Möglichkeiten, die Sie leicht tun können, indem Sie die transform.localEulerAngles ändern. Der Code, den ich in dieser Antwort angehängt habe, kann das tun. T teste das Skript, folge der Anleitung unten. Dies beschreibt auch, wie Vorder- und Hintertüren zu bestimmen sind.

.Erstellen Sie einen einfachen Cube mit dem Namen name it Door.

.Entfernen Sie die Box Collider, die automatisch an den neu erstellten Cube/Door angehängt wird.

. Wählen Sie die Tür, klicken Sie mit der rechten Maustaste auf und klicken Sie auf "Create Empty". Benenne das neue GameObject in FrontCollider um. Stellen Sie sicher, dass FrontCollider jetzt das Kind von Door GameObject ist.

.Wählen Sie FrontCollider, fügen Sie BoxCollider hinzu. Positionieren Sie den Collider an der Vorderseite der Tür (Vorderseite der Kamera).

.Duplicate FrontCollider und umbenennen die neue Gameobject BackCollider. Dann verschiebe das BackCollider GameObject auf die Rückseite des Doors GameObject. Der beste Weg, um sicherzustellen, dass es gut ausrichtet, ist, wenn die z-Position des FrontCollider -2 ist, legen Sie die z-Position von BackCollider auf 2. So alles, was Sie tun, ist die z-Position von FrontCollider und BackCollider Collidern zu sein gegenseitig.

.Create ein leerer Gameobject und nennen Sie es Tür Eltern Stellen Sie sicher, es ist kein Kind von jedem Gameobject ist. Wir müssen dieses GameObject verwenden, um den Drehpunkt der Tür nach links zu ändern. Damit die Tür tatsächlich wie eine Tür (eine Seite) rotiert, anstatt um das Zentrum von sich selbst.

.Verwendung der Verschieben-Werkzeug und Bewegen Sie den Tür Eltern Gameobject auf der linken Seite der Tür. NICHT drehen. Verschiebe es einfach.Wenn Sie denken, dass überall dort, wo die Tür Eltern befindet sich nun, wo die Tür um drehen sollte, schließen Sie das Door Script unten an der Tür Eltern Gameobject nicht die Tür Gameobject.

.Drag die FrontCollider Gameobject zum frontDoorCollider Schlitz im Skript. Ziehen Sie das BackCollider GameObject in den Slot backDoorColliderin im Skript. Das ist es.

Wenn vor der Tür steht, click, hold und move die Maus nach unten, wird es PULL die Tür offen. Wenn Sie es hochschieben, wird es geschlossen.

Wenn stading in der Rückseite der Tür, click, hold und move die Maus nach oben, wird es PUSH die Tür offen. Wenn Sie es hochschieben, wird es geschlossen.

enter image description here

public class Door : MonoBehaviour 
{ 
    public float ySensitivity = 300f; 
    public float frontOpenPosLimit = 45; 
    public float backOpenPosLimit = 45; 

    public GameObject frontDoorCollider; 
    public GameObject backDoorCollider; 

    bool moveDoor = false; 
    DoorCollision doorCollision = DoorCollision.NONE; 


    // Use this for initialization 
    void Start() 
    { 
     StartCoroutine(doorMover()); 
    } 

    // Update is called once per frame 
    void Update() 
    { 
     if (Input.GetMouseButtonDown(0)) 
     { 
      Debug.Log("Mouse down"); 

      RaycastHit hitInfo = new RaycastHit(); 
      if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo)) 
      { 
       if (hitInfo.collider.gameObject == frontDoorCollider) 
       { 
        moveDoor = true; 
        Debug.Log("Front door hit"); 
        doorCollision = DoorCollision.FRONT; 
       } 
       else if (hitInfo.collider.gameObject == backDoorCollider) 
       { 
        moveDoor = true; 
        Debug.Log("Back door hit"); 
        doorCollision = DoorCollision.BACK; 
       } 
       else 
       { 
        doorCollision = DoorCollision.NONE; 
       } 
      } 
     } 

     if (Input.GetMouseButtonUp(0)) 
     { 
      moveDoor = false; 
      Debug.Log("Mouse up"); 
     } 
    } 

    IEnumerator doorMover() 
    { 
     bool stoppedBefore = false; 
     float yRot = 0; 

     while (true) 
     { 
      if (moveDoor) 
      { 
       stoppedBefore = false; 
       Debug.Log("Moving Door"); 

       yRot += Input.GetAxis("Mouse Y") * ySensitivity * Time.deltaTime; 


       //Check if this is front door or back 
       if (doorCollision == DoorCollision.FRONT) 
       { 
        Debug.Log("Pull Down(PULL TOWARDS)"); 
        yRot = Mathf.Clamp(yRot, -frontOpenPosLimit, 0); 
        Debug.Log(yRot); 
        transform.localEulerAngles = new Vector3(0, -yRot, 0); 
       } 
       else if (doorCollision == DoorCollision.BACK) 
       { 
        Debug.Log("Pull Up(PUSH AWAY)"); 
        yRot = Mathf.Clamp(yRot, 0, backOpenPosLimit); 
        Debug.Log(yRot); 
        transform.localEulerAngles = new Vector3(0, yRot, 0); 
       } 
      } 
      else 
      { 
       if (!stoppedBefore) 
       { 
        stoppedBefore = true; 
        Debug.Log("Stopped Moving Door"); 
       } 
      } 

      yield return null; 
     } 

    } 


    enum DoorCollision 
    { 
     NONE, FRONT, BACK 
    } 
}