Script per porte per Unity

In questo tutorial mostrerò come realizzare una porta classica e una scorrevole in Unity.

Porta classica

Una porta classica è una porta normale che si apre ruotando attorno ai suoi cardini.

Passi

Per realizzare una porta normale in Unity, procedi nel seguente modo:

  • Crea un nuovo script, chiamalo 'SC_DoorScript', rimuovi tutto da esso quindi incolla il codice seguente:

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;
        }
    }
}
  • Trascina e rilascia il modello della tua porta nella vista Scena (o crea un nuovo cubo e ridimensionalo per assomigliare a una porta)
  • Crea un nuovo GameObject (GameObject -> Crea vuoto) e assegnagli un nome "Door"
  • Sposta l'oggetto "Door" nella posizione in cui dovrebbe trovarsi la cerniera della porta

Posizione dell'oggetto cerniera della porta Unity

  • Collega un componente SphereCollider all'oggetto "Door" e modifica il suo raggio in modo che sia più grande di una porta (questa sarà l'area da cui il giocatore potrà aprire la porta)
  • Sposta il modello della tua porta all'interno dell'oggetto "Door"
  • Assicurati che il tuo giocatore sia taggato come "Player"
  • Entrando nell'area del grilletto dovresti essere in grado di aprire/chiudere la porta premendo 'F'.

Porta scorrevole

Una porta scorrevole è una porta che si apre scorrendo in una direzione specifica (es. su, giù, sinistra o destra) ed è spesso utilizzata nei livelli Sci-fi.

Passi

Per realizzare una porta scorrevole in Unity, seguire i passaggi seguenti:

  • Crea un nuovo script, chiamalo 'SC_SlidingDoor', rimuovi tutto da esso quindi incolla il codice seguente:

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;
        }
    }
}
  • Trascina e rilascia il modello della tua porta nella vista Scena (o crea un nuovo cubo e ridimensionalo per assomigliare a una porta)
  • Crea un nuovo GameObject (GameObject -> Crea vuoto) e assegnagli un nome "SlidingDoor"
  • Sposta l'oggetto "SlidingDoor" nella posizione centrale del modello di porta
  • Collega un componente SphereCollider all'oggetto "SlidingDoor" e modifica il suo raggio in modo che sia più grande di una porta (questa sarà l'area che attiverà l'evento di apertura)
  • Sposta il modello della tua porta all'interno dell'oggetto "SlidingDoor"
  • Assicurati che il tuo giocatore sia taggato come "Player"
  • Entrando nell'area di attivazione, la porta dovrebbe aprirsi automaticamente e poi chiudersi una volta che il giocatore lascia l'area di attivazione.

Sharp Coder Lettore video

Articoli suggeriti
Script per l'aspetto del mouse per Unity
Script per creare un interruttore della luce in Unity
Script C# per creare un effetto traccia del cursore in Unity
Una risorsa unitaria completa per ambienti acquatici immersivi
Script di tiro con pistola basato su Raycast e proiettili per Unity
Come impostare il controller joystick per il movimento in Unity
Tutorial sull'attacco corpo a corpo 2D per Unity