Deurscripts voor eenheid

In deze tutorial laat ik zien hoe je een klassieker en een schuifdeur maakt in Unity.

Klassieke deur

Een klassieke deur is een gewone deur die wordt geopend door rond de scharnieren te draaien.

Stappen

Om een ​​gewone deur in Unity te maken, volg je de onderstaande stappen:

  • Maak een nieuw script, noem het 'SC_DoorScript', verwijder alles ervan en plak de onderstaande code:

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;
        }
    }
}
  • Sleep uw deurmodel naar de scèneweergave (of maak een nieuwe kubus en schaal deze zodat deze op een deur lijkt)
  • Maak een nieuw GameObject (GameObject -> Leeg maken) en geef het een naam "Door"
  • Verplaats het "Door"-object naar de positie waar het deurscharnier moet zijn

Objectpositie eenheidsdeurscharnier

  • Bevestig een SphereCollider-component aan het "Door"-object en wijzig de straal ervan zodat het groter is dan een deur (dit is het gebied van waaruit de speler de deur kan openen)
  • Verplaats uw deurmodel binnen het "Door"-object
  • Zorg ervoor dat uw speler is getagd als "Player"
  • Wanneer u het triggergebied binnenloopt, zou u de deur moeten kunnen openen/sluiten door op 'F' te drukken.

Schuifdeur

Een schuifdeur is een deur die opengaat door in een specifieke richting te schuiven (bijvoorbeeld omhoog, omlaag, naar links of naar rechts) en wordt vaak gebruikt in Scifi-niveaus.

Stappen

Om een ​​schuifdeur in Unity te maken, volg je onderstaande stappen:

  • Maak een nieuw script, noem het 'SC_SlidingDoor', verwijder alles eruit en plak de onderstaande code:

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;
        }
    }
}
  • Sleep uw deurmodel naar de scèneweergave (of maak een nieuwe kubus en schaal deze zodat deze op een deur lijkt)
  • Maak een nieuw GameObject (GameObject -> Leeg maken) en geef het een naam "SlidingDoor"
  • Verplaats het "SlidingDoor"-object naar de middenpositie van uw deurmodel
  • Bevestig een SphereCollider-component aan het "SlidingDoor"-object en wijzig de straal zodat deze groter is dan een deur (dit is het gebied dat de open gebeurtenis activeert)
  • Verplaats uw deurmodel binnen het "SlidingDoor"-object
  • Zorg ervoor dat uw speler is getagd als "Player"
  • Als de speler het triggergebied betreedt, moet de deur automatisch opengaan en weer sluiten zodra de speler het triggergebied verlaat.

Sharp Coder Video speler

Voorgestelde artikelen
Hoe u het nieuwe HDRP-watersysteem in eenheid kunt gebruiken
Script voor het maken van een lichtschakelaar in eenheid
Joystickcontroller instellen voor beweging in eenheid
FPC Swimmer - Een alomvattend eenheidsmiddel voor meeslepende wateromgevingen
Muislook-script voor Unity
Raycast- en projectielgebaseerd schietscript voor Unity
2D Melee Attack-tutorial voor Unity