Unity tüm kapılar aynı anda açılıyor

gcmsx

Centipat
Katılım
23 Mayıs 2022
Mesajlar
35
Merhaba, iyi günler dilerim. Unity'de geliştirdiğim oyuna bir kapı sistemi ekledim. Kapı normal bir şekilde açılıyor ama bir kapıyı açınca aynı anda bütün kapılar açılıyor. Bu durumu nasıl düzeltebilirim?
 
Son düzenleyen: Moderatör:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Kapi : MonoBehaviour { public Collider tetik; // Tek parça olan barikatın collideri (İsTrigger açık). public GameObject destroyversion; bool canPress; //public ile parçalanmış kopya alındı. void OnTriggerEnter(Collider tetik) { Debug.Log("Karakter Girdi"); if (tetik.gameObject.tag == "Tetik")// Gireceğimiz objenin tagını Tetik yapın. { canPress = true; } } void OnTriggerExit(Collider other) { Debug.Log("KarakterÇıktı"); if (other.gameObject.tag == "Tetik") { canPress = false; } } void Update() { if (canPress) { if (Input.GetKeyDown(KeyCode.F)) { Debug.Log("Tuş Çalışıyor"); Destroy(gameObject); Instantiate(destroyversion, transform.position, transform.rotation); //Parçalı barikat tek parça olan barikatın yerine geçiyor. Destroy(gameObject); // sağlam kopya silindi. } } } }
Belirteyim her kapı birer kopya hepsini sonradan kopyaladım.
 
Şimdi hocam kodun mantığını tam olarak anlamadım. Kapıya gelip F'ye basınca neyi yok ediyor. Yani kodun bulunduğu objeyi yok ediyor ki buda saçma çünkü mesela Instantiate'den önce kodun bulunduğu objeyi yok etmişsiniz. Yok edilince Instantiate'nin mantıken çalışmaması lazım.

Kendi anladığım mantık şu şekilde. F'ye basınca değdiğimiz kapı yok olacak. Aşağıdaki kodu yazdım fakat sistemi daha iyi anlatmanız çok iyi olur.
C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Kapi : MonoBehaviour
{
public Collider tetik; // Tek parça olan barikatın collideri (İsTrigger açık).
public GameObject destroyversion;
GameObject triggeredObject;
bool canPress;
//public ile parçalanmış kopya alındı.
void OnTriggerEnter(Collider tetik)
{
Debug.Log("Karakter Girdi");
if (tetik.gameObject.tag == "Tetik")// Gireceğimiz objenin tagını Tetik yapın.
{
triggeredObject = tetik.gameObject.transform.gameObject;
canPress = true;
}
}
void OnTriggerExit(Collider other)
{
Debug.Log("KarakterÇıktı");
if (other.gameObject.tag == "Tetik")
{
triggeredObject = null;
canPress = false;
}
}
void Update()
{
if (canPress)
{
if (Input.GetKeyDown(KeyCode.F))
{
Debug.Log("Tuş Çalışıyor");
Instantiate(destroyversion, transform.position, transform.rotation);
//Parçalı barikat tek parça olan barikatın yerine geçiyor.
Destroy(triggeredObject);
// sağlam kopya silindi.
}
}
}
}

Sonucu belirtiniz.
 
Şimdi hocam kodun mantığını tam olarak anlamadım. Kapıya gelip F'ye basınca neyi yok ediyor. Yani kodun bulunduğu objeyi yok ediyor ki buda saçma çünkü mesela Instantiate'den önce kodun bulunduğu objeyi yok etmişsiniz. Yok edilince Instantiate'nin mantıken çalışmaması lazım.

Kendi anladığım mantık şu şekilde. F'ye basınca değdiğimiz kapı yok olacak. Aşağıdaki kodu yazdım fakat sistemi daha iyi anlatmanız çok iyi olur.
C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Kapi : MonoBehaviour
{
public Collider tetik; // Tek parça olan barikatın collideri (İsTrigger açık).
public GameObject destroyversion;
GameObject triggeredObject;
bool canPress;
//public ile parçalanmış kopya alındı.
void OnTriggerEnter(Collider tetik)
{
Debug.Log("Karakter Girdi");
if (tetik.gameObject.tag == "Tetik")// Gireceğimiz objenin tagını Tetik yapın.
{
triggeredObject = tetik.gameObject.transform.gameObject;
canPress = true;
}
}
void OnTriggerExit(Collider other)
{
Debug.Log("KarakterÇıktı");
if (other.gameObject.tag == "Tetik")
{
triggeredObject = null;
canPress = false;
}
}
void Update()
{
if (canPress)
{
if (Input.GetKeyDown(KeyCode.F))
{
Debug.Log("Tuş Çalışıyor");
Instantiate(destroyversion, transform.position, transform.rotation);
//Parçalı barikat tek parça olan barikatın yerine geçiyor.
Destroy(triggeredObject);
// sağlam kopya silindi.
}
}
}
}

Sonucu belirtiniz.
Hocam şöyle kapı dediğim aslında kapının üstündeki barikatlar mantık şu şekilde aynı görünümde 2 barikat prefabı var birisi yerçekiminden etkileniyor birisi etkilenmiyor. Karakter IsTrigger alanın içine girip F tuşuna bastığında yerçekeminden etkilenmeyen barikat silinip yerine yerçekiminden etkilenen barikat geçiyor o da doğal olarak yere düşüyor mantık bu.
 
Hocam şöyle kapı dediğim aslında kapının üstündeki barikatlar mantık şu şekilde aynı görünümde 2 barikat prefabı var birisi yerçekiminden etkileniyor birisi etkilenmiyor. Karakter IsTrigger alanın içine girip F tuşuna bastığında yerçekeminden etkilenmeyen barikat silinip yerine yerçekiminden etkilenen barikat geçiyor o da doğal olarak yere düşüyor mantık bu.
Onun yerine şey yapsanız? Yere düşmemesi için Rigidbody'deki eksenleri dondurup içine girince açsak? Bunu yaparsanız instantiate'ye gerek kalmaz ve yere düşer. Dediğim gibi yapmak istiyorsanız kod aşağıda.

Kapı objesine Rigidbody ekleyip, Rigidbody içindeki Constraints bölümündeki tüm tikleri aktif yapın.

Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Kapi : MonoBehaviour
{
public Collider tetik; // Tek parça olan barikatın collideri (İsTrigger açık).
public GameObject destroyversion;
GameObject triggeredObject;
bool canPress;
//public ile parçalanmış kopya alındı.
void OnTriggerEnter(Collider tetik)
{
Debug.Log("Karakter Girdi");
if (tetik.gameObject.tag == "Tetik")// Gireceğimiz objenin tagını Tetik yapın.
{
triggeredObject = tetik.gameObject.transform.gameObject;
canPress = true;
}
}
void OnTriggerExit(Collider other)
{
Debug.Log("KarakterÇıktı");
if (other.gameObject.tag == "Tetik")
{
triggeredObject = null;
canPress = false;
}
}
void Update()
{
if (canPress)
{
if (Input.GetKeyDown(KeyCode.F))
{
    triggeredObject.GetComponent<Rigidbody>().constraints = RigidbodyConstraints.none;
}
}
}
}
 

Technopat Haberler

Geri
Yukarı