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