Scripts de porte pour Unity

Dans ce tutoriel, je vais montrer comment réaliser une porte classique et une porte coulissante en Unity.

Porte Classique

Une porte classique est une porte ordinaire qui s’ouvre en tournant autour de ses charnières.

Pas

Pour créer une porte normale en Unity, suivez les étapes ci-dessous:

  • Créez un nouveau script, appelez-le 'SC_DoorScript', supprimez tout puis collez le code ci-dessous:

SC_DoorScript.cs

//Make an empty GameObject and call it "Door"
//Drag and drop your Door model into Scene and rename it to "Body"
//Make sure that the "Door" Object is at the side of the "Body" object (The place where a Door Hinge should be)
//Move the "Body" Object inside "Door"
//Add a Collider (preferably SphereCollider) to "Door" object and make it bigger then the "Body" model
//Assign this script to a "Door" Object (the one with a Trigger Collider)
//Make sure the main Character is tagged "Player"
//Upon walking into trigger area press "F" to open / close the door

using UnityEngine;

public class SC_DoorScript : MonoBehaviour
{
    // Smoothly open a door
    public AnimationCurve openSpeedCurve = new AnimationCurve(new Keyframe[] { new Keyframe(0, 1, 0, 0), new Keyframe(0.8f, 1, 0, 0), new Keyframe(1, 0, 0, 0) }); //Contols the open speed at a specific time (ex. the door opens fast at the start then slows down at the end)
    public float openSpeedMultiplier = 2.0f; //Increasing this value will make the door open faster
    public float doorOpenAngle = 90.0f; //Global door open speed that will multiply the openSpeedCurve

    bool open = false;
    bool enter = false;

    float defaultRotationAngle;
    float currentRotationAngle;
    float openTime = 0;

    void Start()
    {
        defaultRotationAngle = transform.localEulerAngles.y;
        currentRotationAngle = transform.localEulerAngles.y;

        //Set Collider as trigger
        GetComponent<Collider>().isTrigger = true;
    }

    // Main function
    void Update()
    {
        if (openTime < 1)
        {
            openTime += Time.deltaTime * openSpeedMultiplier * openSpeedCurve.Evaluate(openTime);
        }
        transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, Mathf.LerpAngle(currentRotationAngle, defaultRotationAngle + (open ? doorOpenAngle : 0), openTime), transform.localEulerAngles.z);

        if (Input.GetKeyDown(KeyCode.F) && enter)
        {
            open = !open;
            currentRotationAngle = transform.localEulerAngles.y;
            openTime = 0;
        }
    }

    // Display a simple info message when player is inside the trigger area (This is for testing purposes only so you can remove it)
    void OnGUI()
    {
        if (enter)
        {
            GUI.Label(new Rect(Screen.width / 2 - 75, Screen.height - 100, 155, 30), "Press 'F' to " + (open ? "close" : "open") + " the door");
        }
    }
    //

    // Activate the Main function when Player enter the trigger area
    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            enter = true;
        }
    }

    // Deactivate the Main function when Player exit the trigger area
    void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            enter = false;
        }
    }
}
  • Faites glisser et déposez votre modèle de porte dans la vue Scène (ou créez un nouveau cube et redimensionnez-le pour qu'il ressemble à une porte)
  • Créez un nouveau GameObject (GameObject -> Create Empty) et nommez-le "Door"
  • Déplacez l'objet "Door" vers la position où la charnière de la porte doit être

Position de l'objet de la charnière de porte Unity

  • Attachez un composant SphereCollider à l'objet "Door" et modifiez son rayon pour qu'il soit plus grand qu'une porte (ce sera la zone à partir de laquelle le joueur pourra ouvrir la porte)
  • Déplacez votre modèle de porte à l'intérieur de l'objet "Door"
  • Assurez-vous que votre lecteur est identifié comme "Player"
  • En entrant dans la zone de déclenchement, vous devriez pouvoir ouvrir/fermer la porte en appuyant sur 'F'.

Porte coulissante

Une porte coulissante est une porte qui s'ouvre en glissant dans une direction spécifique (par exemple vers le haut, le bas, la gauche ou la droite) et est souvent utilisée dans les niveaux de science-fiction.

Pas

Pour réaliser une porte coulissante en Unity, suivez les étapes ci-dessous:

  • Créez un nouveau script, appelez-le 'SC_SlidingDoor', supprimez tout puis collez le code ci-dessous:

SC_SlidingDoor.cs

//Make an empty GameObject and call it "SlidingDoor"
//Drag and drop your Door model into Scene and rename it to "Body"
//Move the "Body" Object inside "SlidingDoor"
//Add a Collider (preferably SphereCollider) to "SlidingDoor" Object and make it bigger then the "Body" model
//Assign this script to a "SlidingDoor" Object (the one with a Trigger Collider)
//Make sure the main Character is tagged "Player"
//Upon walking into trigger area the door should Open automatically

using UnityEngine;

public class SC_SlidingDoor : MonoBehaviour
{
    // Sliding door
    public AnimationCurve openSpeedCurve = new AnimationCurve(new Keyframe[] { new Keyframe(0, 1, 0, 0), new Keyframe(0.8f, 1, 0, 0), new Keyframe(1, 0, 0, 0) }); //Contols the open speed at a specific time (ex. the door opens fast at the start then slows down at the end)
    public enum OpenDirection { x, y, z }
    public OpenDirection direction = OpenDirection.y;
    public float openDistance = 3f; //How far should door slide (change direction by entering either a positive or a negative value)
    public float openSpeedMultiplier = 2.0f; //Increasing this value will make the door open faster
    public Transform doorBody; //Door body Transform

    bool open = false;

    Vector3 defaultDoorPosition;
    Vector3 currentDoorPosition;
    float openTime = 0;

    void Start()
    {
        if (doorBody)
        {
            defaultDoorPosition = doorBody.localPosition;
        }

        //Set Collider as trigger
        GetComponent<Collider>().isTrigger = true;
    }

    // Main function
    void Update()
    {
        if (!doorBody)
            return;

        if (openTime < 1)
        {
            openTime += Time.deltaTime * openSpeedMultiplier * openSpeedCurve.Evaluate(openTime);
        }

        if (direction == OpenDirection.x)
        {
            doorBody.localPosition = new Vector3(Mathf.Lerp(currentDoorPosition.x, defaultDoorPosition.x + (open ? openDistance : 0), openTime), doorBody.localPosition.y, doorBody.localPosition.z);
        }
        else if (direction == OpenDirection.y)
        {
            doorBody.localPosition = new Vector3(doorBody.localPosition.x, Mathf.Lerp(currentDoorPosition.y, defaultDoorPosition.y + (open ? openDistance : 0), openTime), doorBody.localPosition.z);
        }
        else if (direction == OpenDirection.z)
        {
            doorBody.localPosition = new Vector3(doorBody.localPosition.x, doorBody.localPosition.y, Mathf.Lerp(currentDoorPosition.z, defaultDoorPosition.z + (open ? openDistance : 0), openTime));
        }
    }

    // Activate the Main function when Player enter the trigger area
    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            open = true;
            currentDoorPosition = doorBody.localPosition;
            openTime = 0;
        }
    }

    // Deactivate the Main function when Player exit the trigger area
    void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            open = false;
            currentDoorPosition = doorBody.localPosition;
            openTime = 0;
        }
    }
}
  • Faites glisser et déposez votre modèle de porte dans la vue Scène (ou créez un nouveau cube et redimensionnez-le pour qu'il ressemble à une porte)
  • Créez un nouveau GameObject (GameObject -> Create Empty) et nommez-le "SlidingDoor"
  • Déplacez l'objet "SlidingDoor" vers la position centrale de votre modèle de porte
  • Attachez un composant SphereCollider à l'objet "SlidingDoor" et modifiez son rayon pour qu'il soit plus grand qu'une porte (ce sera la zone qui déclenchera l'événement d'ouverture)
  • Déplacez votre modèle de porte à l'intérieur de l'objet "SlidingDoor"
  • Assurez-vous que votre lecteur est identifié comme "Player"
  • En entrant dans la zone de déclenchement, la porte devrait s'ouvrir automatiquement, puis se fermer une fois que le joueur quitte la zone de déclenchement.

Sharp Coder Lecteur vidéo

Articles suggérés
Script pour créer un interrupteur d'éclairage dans Unity
Sélection d'unités de style RTS pour Unity
Éditeur de cartes de hauteur de terrain en jeu pour Unity
FPC Swimmer - Un atout Unity complet pour les environnements aquatiques immersifs
Script de recherche de souris pour Unity
Comment utiliser la manette Xbox dans Unity
Script de tir au pistolet basé sur Raycast et Projectile pour Unity