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.

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