Door Scripts pentru Unity

În acest tutorial, voi arăta cum să faci o ușă clasică și o ușă glisantă în Unity.

Ușa clasică

O ușă clasică este o ușă obișnuită care se deschide prin rotirea în jurul balamalelor sale.

Pași

Pentru a face o ușă obișnuită în Unity, urmați pașii de mai jos:

  • Creați un script nou, numiți-l 'SC_DoorScript', eliminați totul din el, apoi lipiți codul de mai jos:

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;
        }
    }
}
  • Trageți și plasați modelul ușii în vizualizarea Scenă (sau creați un nou Cub și scalați-l pentru a semăna cu o ușă)
  • Creați un nou GameObject (GameObject -> Create Empty) și denumiți-l "Door"
  • Mutați obiectul "Door" în poziția în care ar trebui să fie balamaua ușii

Poziția obiectului balamalei ușii Unity

  • Atașați o componentă SphereCollider la obiectul "Door" și modificați-i raza astfel încât să fie mai mare decât o ușă (aceasta va fi zona de unde jucătorul va putea deschide ușa)
  • Mutați modelul ușii în interiorul obiectului "Door"
  • Asigurați-vă că playerul dvs. este etichetat ca "Player"
  • După ce intri în zona declanșatorului, ar trebui să poți deschide/închide ușa apăsând 'F'.

Ușă glisantă

O ușă glisantă este o ușă care se deschide prin alunecare într-o direcție specifică (de ex. în sus, în jos, la stânga sau la dreapta) și este adesea folosită în nivelele SF.

Pași

Pentru a realiza o ușă glisantă în Unity, urmați pașii de mai jos:

  • Creați un nou script, numiți-l 'SC_SlidingDoor', eliminați totul din el, apoi lipiți codul de mai jos:

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;
        }
    }
}
  • Trageți și plasați modelul ușii în vizualizarea Scenă (sau creați un nou Cub și scalați-l pentru a semăna cu o ușă)
  • Creați un nou GameObject (GameObject -> Create Empty) și denumiți-l "SlidingDoor"
  • Mutați obiectul "SlidingDoor" în poziția centrală a modelului de ușă
  • Atașați o componentă SphereCollider la obiectul "SlidingDoor" și modificați-i raza astfel încât să fie mai mare decât o ușă (aceasta va fi zona care va declanșa evenimentul deschis)
  • Mutați modelul ușii în interiorul obiectului "SlidingDoor"
  • Asigurați-vă că playerul dvs. este etichetat ca "Player"
  • La intrarea în zona de declanșare, ușa ar trebui să se deschidă automat și apoi să se închidă odată ce jucătorul părăsește zona de declanșare.

Sharp Coder Video player

Articole sugerate
FPC Swimmer - Un activ unitar cuprinzător pentru medii de apă imersive
Mouse Look Script pentru Unity
Script pentru crearea unui comutator de lumină în Unity
Script de împușcare cu arma Raycast și proiectile pentru Unity
Cum să configurați controlerul cu joystick pentru mișcare în Unity
Tutorial de atac corp la corp 2D pentru Unity
Tutorial cu cronometrul de numărătoare inversă pentru Unity