Birlik için Kapı Yazıları

Bu derste Unity'te klasik ve sürgülü kapının nasıl yapıldığını göstereceğim.

Klasik Kapı

Klasik bir kapı, menteşeleri etrafında döndürülerek açılan normal bir kapıdır.

Adımlar

Unity'te normal bir kapı oluşturmak için aşağıdaki adımları izleyin:

  • yeni bir komut dosyası oluşturun, onu 'SC_DoorScript' olarak adlandırın, içindeki her şeyi kaldırın ve ardından aşağıdaki kodu yapıştırın:

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;
        }
    }
}
  • Kapı modelinizi Sahne görünümüne sürükleyip bırakın (veya yeni bir Küp oluşturun ve onu bir kapıya benzeyecek şekilde ölçeklendirin)
  • Yeni bir GameObject oluşturun (GameObject -> Boş Oluştur) ve adlandırın "Door"
  • "Door" nesnesini kapı menteşesinin olması gereken konuma taşıyın

Birlik kapı menteşesi nesne konumu

  • "Door" nesnesine bir SphereCollider bileşeni ekleyin ve yarıçapını kapıdan daha büyük olacak şekilde değiştirin (bu, oyuncunun kapıyı açabileceği alan olacaktır)
  • Kapı modelinizi "Door" nesnesinin içine taşıyın
  • Oynatıcınızın şu şekilde etiketlendiğinden emin olun: "Player"
  • Tetik alanına girdiğinizde 'F' tuşuna basarak kapıyı açıp kapatabilmelisiniz.

Kayar kapı

Kayar kapı, belirli bir yöne (ör. yukarı, aşağı, sola veya sağa) kaydırılarak açılan bir kapıdır ve genellikle Bilim kurgu seviyelerinde kullanılır.

Adımlar

Unity'te sürgülü kapı yapmak için aşağıdaki adımları izleyin:

  • Yeni bir komut dosyası oluşturun, onu 'SC_SlidingDoor' olarak adlandırın, içindeki her şeyi kaldırın ve aşağıdaki kodu yapıştırın:

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;
        }
    }
}
  • Kapı modelinizi Sahne görünümüne sürükleyip bırakın (veya yeni bir Küp oluşturun ve onu bir kapıya benzeyecek şekilde ölçeklendirin)
  • Yeni bir GameObject oluşturun (GameObject -> Boş Oluştur) ve adlandırın "SlidingDoor"
  • "SlidingDoor" nesnesini kapı modelinizin orta konumuna taşıyın
  • "SlidingDoor" nesnesine bir SphereCollider bileşeni ekleyin ve yarıçapını bir kapıdan daha büyük olacak şekilde değiştirin (bu, açık olayı tetikleyecek alan olacaktır)
  • Kapı modelinizi "SlidingDoor" nesnesinin içine taşıyın
  • Oynatıcınızın şu şekilde etiketlendiğinden emin olun: "Player"
  • Tetik alanına girildiğinde kapı otomatik olarak açılmalı ve oyuncu tetik alanını terk ettiğinde kapanmalıdır.

Sharp Coder Video oynatıcı

Önerilen Makaleler
FPC Swimmer - Sürükleyici Su Ortamları için Kapsamlı Bir Birlik Varlığı
Birlik için 2D Yakın Dövüş Saldırısı Eğitimi
Varlık Mağazasındaki En İyi Birlik Varlıkları
Ultimate Spawner 2.0 - Oyunun Kurallarını Değiştiren Bir Varlık
Unity için Fare Görünümü Komut Dosyası
Hava Durumu Oluşturucu - Birlik Ortamlarını Yeni Yüksekliklere Yükseltmek
Unity için Raycast ve Mermi Tabanlı Silah Atış Senaryosu