Unity trigger sistemi

gcmsx

Centipat
Katılım
23 Mayıs 2022
Mesajlar
35
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; //public ile parçalanmış kopya alındı. void OnTriggerEnter(Collider tetik) { Debug.Log("karakter girdi"); 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. } } }
Arkadaşlar herkese merhaba, oyunumda barikatları kırmak için böyle bir kod yazdım kodun mantığı kısaca şöyle aynı objeden 2 prefab var bunlardan biri parçalı diğeri tek parça barikatın yanına yaklaşıp F tuşuna basınca tek parça olan barikatın yerini parçalanmış olan barikat alıp o parçalar da yere düşecek ancak F tuşuna basmama rağmen hiçbir şey olmuyor bunun sebebi nedir acaba?
 
"OnTriggerEnter" sadece trigger ilk tetiklendiği anda çalışır. Triggerın içinde olup olmadığını kontrol etmek için "OnTriggerStay" kullanman lazım. Bir de "GetKeyDown" ile input aldığında eğer aldığın input ile "OnTriggerStay" aynı anda tetiklenmez ise çalışmaz. Bundan Dolayı "GetKey" kullanmalısı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;
bool canPress;
//public ile parçalanmış kopya alındı.
void OnTriggerEnter(Collider tetik)
{
    if(tetik.gameObject.tag == "Tetik")// Gireceğimiz objenin tagını Tetik yapın.
    {
        canPress = true;
    }
}
void OnTriggerExit(Collider other){
    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.
            }
        }
    }
}

Buyrun.
 
"Ontriggerenter" sadece trigger ilk tetiklendiği anda çalışır. Triggerın içinde olup olmadığını kontrol etmek için "ontriggerstay" kullanman lazım. Bir de "getkeydown" ile input aldığında eğer aldığın input ile "ontriggerstay" aynı anda tetiklenmez ise çalışmaz. Bundan dolayı "getkey" kullanmalısın.

Getkey kullanırsa basılı tutunca sıkıntı olabilir en sağlıklısı collidere tag verip tag üzerinden yapmak hem optimizasyondan yararı olur.
 
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;
bool canPress;
//public ile parçalanmış kopya alındı.
void OnTriggerEnter(Collider tetik)
{
    if(tetik.gameObject.tag == "Tetik")// Gireceğimiz objenin tagını Tetik yapın.
    {
        canPress = true;
    }
}
void OnTriggerExit(Collider other){
    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.
            }
        }
    }
}

Buyrun.
sağolun teşekkürler.
Getkey kullanırsa basılı tutunca sıkıntı olabilir en sağlıklısı collidere tag verip tag üzerinden yapmak hem optimizasyondan yararı olur.
önerileriniz için teşekkürler sağolun.
 

Geri
Yukarı