Unity 2D sandık kilit sistemi nasıl yapılır?

yasinseker02

Decapat
Katılım
29 Temmuz 2020
Mesajlar
288
Çözümler
1
Arkadaşlar 2D platform oyunu yapıyorum. Ilerlemistim bayağı fakat sandik kilit sistemini ve içinden para nasıl çıkacagini anlayamadım. Sandığın yanına gittiğimizde bize coin vermesini istiyorum bir de sandigin anahtar acilmasini istiyorum, bunu nasıl yapacağım? Bilen arkadaşlar yardımcı olabilir mi?
 
Son düzenleyen: Moderatör:
Aynısı değil ama çalışma mantıkları aynı.

Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.
 
Şimdi sanırım doğru anlamışımdır. İlk önce sandığa bir collider verelim. Tabi ki karakterimizede. Sandığa verdiğimiz colliderin tag'ını sandık yapalım. Ve sandığın collider'ının is Trigger adlı yerin tikini aktif hale getirelim. Sonra aşağıda verdiğim kodu yeni bir script oluştur ve içine at. Sonra bu scripti karakterine sürüke bırak.

[CODE title="code"]using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SandıkSistemi : MonoBehaviour
{
public bool anahtar; //burası senin anahtarının olup olmadığınını belirtiyor.
public bool sandıkAçılabilir;

void Update(){
if(Input.GetKeyDown(KeyCode.E)){ //Buradaki e tuşuna istediğin tuşu atıyabilirsin.
if(sandıkAçılabilir == true){
if(anahtar == true){
SandıkAçılma();
}
}
}
}

void OnTriggerEnter2D(Collider2D karakter)
if(karakter.gameObject.tag == "sandık"){
sandıkAçılabilir = true;
}
}
void OnTriggerExit2D(Collider2D karakter)
if(karakter.gameObject.tag == "sandık"){
sandıkAçılabilir = false;
}
}

void SandıkAçılma(){
//buraya sandık açılınca ne olacak onu yaz.
}
}
[/CODE]
 
Şimdi sanırım doğru anlamışımdır. İlk önce sandığa bir collider verelim. Tabi ki karakterimizede. Sandığa verdiğimiz colliderin Tag'ını sandık yapalım. Ve sandığın collider'ının is trigger adlı yerin tikini aktif hale getirelim. Sonra aşağıda verdiğim kodu yeni bir script oluştur ve içine at. Sonra bu scripti karakterine sürüke bırak.

[CODE title="code"]using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SandıkSistemi : MonoBehaviour.
{
public bool anahtar; //burası senin anahtarının olup olmadığınını belirtiyor.
public bool sandıkAçılabilir;

void Update(){
if(Input.GetKeyDown(KeyCode.E)){ //Buradaki e tuşuna istediğin tuşu atıyabilirsin.
if(sandıkAçılabilir == true){
if(anahtar == true){
SandıkAçılma();
}
}
}
}

void OnTriggerEnter2D(Collider2D karakter)
if(karakter.gameObject.tag == "sandık"){
sandıkAçılabilir = true;
}
}
void OnTriggerExit2D(Collider2D karakter)
if(karakter.gameObject.tag == "sandık"){
sandıkAçılabilir = false;
}
}

void SandıkAçılma(){
//buraya sandık açılınca ne olacak onu yaz.
}
}
[/CODE]

Çok sağ ol deneyeceğim 1 saate geri dönerim.
Bir şey daha soracağim oraya sandık açılınca ne olacagini yaz demissin de ben icinden para çıksin istiyorum bende hazır coin var ve son olarak bende sandık açılma animasyonu var onu nasıl aktifleştireceğim sandık yanına gidince?
Teşekkürler tekrar.
 
Son düzenleme:
Çok sağ ol deneyeceğim 1 saate geri dönerim.
Bir şey daha soracağim oraya sandık açılınca ne olacagini yaz demissin de ben icinden para çıksin istiyorum bende hazır coin var ve son olarak bende sandık açılma animasyonu var onu nasıl aktifleştireceğim sandık yanına gidince?
Teşekkürler tekrar.
Sandığın 1 birim yanına coin instantiate et. Direkt fonksiyonu var. Sandığa bir animatör ekle. Default olan animasyon sabit duran animasyon olsun. Ve bu animatöre giderek bir değişken oluştur atıyorum bool bir değişken. Kullanıcı sandığın trigger bölgesine girdiğinde bu bool değişkeni değişsin. Animasyonlar arası şartlı geçiş yapıp defaulttan açılma animasyonu şartına bu bool değişkenini verirsen yapabilirsin.
 
Sandığın 1 birim yanına coin instantiate et. Direkt fonksiyonu var. Sandığa bir animatör ekle. Default olan animasyon sabit duran animasyon olsun. Ve bu animatöre giderek bir değişken oluştur atıyorum bool bir değişken. Kullanıcı sandığın trigger bölgesine girdiğinde bu bool değişkeni değişsin. Animasyonlar arası şartlı geçiş yapıp defaulttan açılma animasyonu şartına bu bool değişkenini verirsen yapabilirsin.

Tammamdır becerebilirsem çok güzel olur ben sana gene takıldığım yerin fotoğranı atarım. 🤗
Sandığın 1 birim yanına coin instantiate et. Direkt fonksiyonu var. Sandığa bir animatör ekle. Default olan animasyon sabit duran animasyon olsun. Ve bu animatöre giderek bir değişken oluştur atıyorum bool bir değişken. Kullanıcı sandığın trigger bölgesine girdiğinde bu bool değişkeni değişsin. Animasyonlar arası şartlı geçiş yapıp defaulttan açılma animasyonu şartına bu bool değişkenini verirsen yapabilirsin.

Kod kısmını sonra hallederim daha nahatar falan eklemedim çünkü. Şurda takıldım bu animasyonları nasıl halledeceğim?
Sandıksabit = normal sandık duruyor.
Sandık = açılma animasyonu.
Boolu oluşturdum ve ben bunları koda yazacak miyım?
 

Dosya Ekleri

  • 16142768139793239954361812601719.jpg
    16142768139793239954361812601719.jpg
    100,3 KB · Görüntüleme: 59
  • 16142790172843578728668679983600.jpg
    16142790172843578728668679983600.jpg
    183,4 KB · Görüntüleme: 49
Son düzenleme:
Tammamdır becerebilirsem çok güzel olur ben sana gene takıldığım yerin fotoğranı atarım. 🤗


Kod kısmını sonra hallederim daha nahatar falan eklemedim çünkü. Şurda takıldım bu animasyonları nasıl halledeceğim?
Sandıksabit = normal sandık duruyor.
Sandık = açılma animasyonu.
Boolu oluşturdum ve ben bunları koda yazacak miyım?
Boola ne isim verdiğinizi bilmiyorum. Bu yüzde sandıkBool diyeceğim. İlk önce sandık sabit'ten sandık'a bir şerit çek. Sonra şeridin üstüne tıkla ve alt taraflarındaki yerden + işaretine tıkla. Otomatik olarak sandıkBool seçili olacaktır. Sonra yandaki yere tıkla ve true yap. Şimdi gelelim kod kısmına. Tüm kodu atıyorum. Önceden attığım kodu boş ver. Aşağıdakini kopyala yapıştır.

[CODE title="code"]using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SandıkSistemi : MonoBehaviour
{
public bool anahtar; //burası senin anahtarının olup olmadığınını belirtiyor.
public bool sandıkAçılabilir;

public Animator animator; // animaasyonun bulunduğu objeyi atabilirsin.

void Start(){
animator = animator.GetComponent<Animator>();
}

void Update(){
if(Input.GetKeyDown(KeyCode.E)){ //Buradaki e tuşuna istediğin tuşu atıyabilirsin.
if(sandıkAçılabilir == true){
if(anahtar == true){
SandıkAçılma();
}
}
}
}

void OnTriggerEnter2D(Collider2D karakter)
if(karakter.gameObject.tag == "sandık"){
sandıkAçılabilir = true;
}
}
void OnTriggerExit2D(Collider2D karakter)
if(karakter.gameObject.tag == "sandık"){
sandıkAçılabilir = false;
}
}

void SandıkAçılma(){
animator.SetBool("sandıkBool",true); //buraya boolun adını gireceksin.
}
}[/CODE]
 
Boola ne isim verdiğinizi bilmiyorum. Bu yüzde sandıkbool diyeceğim. İlk önce sandık Sabit'ten sandık'a bir şerit çek. Sonra şeridin üstüne tıkla ve alt taraflarındaki yerden + işaretine tıkla. Otomatik olarak sandıkbool seçili olacaktır. Sonra yandaki yere tıkla ve true yap. Şimdi gelelim kod kısmına. Tüm kodu atıyorum. Önceden attığım kodu boş ver. Aşağıdakini kopyala yapıştır.

[CODE title="code"]using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SandıkSistemi : MonoBehaviour.
{
public bool anahtar; //burası senin anahtarının olup olmadığınını belirtiyor.
public bool sandıkAçılabilir;

public Animator animator; // animaasyonun bulunduğu objeyi atabilirsin.

void Start(){
animator = animator.GetComponent<Animator>();
}

void Update(){
if(Input.GetKeyDown(KeyCode.E)){ //Buradaki e tuşuna istediğin tuşu atıyabilirsin.
if(sandıkAçılabilir == true){
if(anahtar == true){
SandıkAçılma();
}
}
}
}

void OnTriggerEnter2D(Collider2D karakter)
if(karakter.gameObject.tag == "sandık"){
sandıkAçılabilir = true;
}
}
void OnTriggerExit2D(Collider2D karakter)
if(karakter.gameObject.tag == "sandık"){
sandıkAçılabilir = false;
}
}

void SandıkAçılma(){
animator.SetBool("sandıkBool",true); //buraya boolun adını gireceksin.
}
}[/CODE]

Sağ ol vallahi yordum seni de akşam aksam
Platformu Android'e geciriyorum bitsin hemen yapacağım.
Kopyala yapistir yaptim.

Boola ne isim verdiğinizi bilmiyorum. Bu yüzde sandıkbool diyeceğim. İlk önce sandık Sabit'ten sandık'a bir şerit çek. Sonra şeridin üstüne tıkla ve alt taraflarındaki yerden + işaretine tıkla. Otomatik olarak sandıkbool seçili olacaktır. Sonra yandaki yere tıkla ve true yap. Şimdi gelelim kod kısmına. Tüm kodu atıyorum. Önceden attığım kodu boş ver. Aşağıdakini kopyala yapıştır.

[CODE title="code"]using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SandıkSistemi : MonoBehaviour.
{
public bool anahtar; //burası senin anahtarının olup olmadığınını belirtiyor.
public bool sandıkAçılabilir;

public Animator animator; // animaasyonun bulunduğu objeyi atabilirsin.

void Start(){
animator = animator.GetComponent<Animator>();
}

void Update(){
if(Input.GetKeyDown(KeyCode.E)){ //Buradaki e tuşuna istediğin tuşu atıyabilirsin.
if(sandıkAçılabilir == true){
if(anahtar == true){
SandıkAçılma();
}
}
}
}

void OnTriggerEnter2D(Collider2D karakter)
if(karakter.gameObject.tag == "sandık"){
sandıkAçılabilir = true;
}
}
void OnTriggerExit2D(Collider2D karakter)
if(karakter.gameObject.tag == "sandık"){
sandıkAçılabilir = false;
}
}

void SandıkAçılma(){
animator.SetBool("sandıkBool",true); //buraya boolun adını gireceksin.
}
}[/CODE]

Kopyala yapistir yaptim boolun ismini senin dedigin sekil yaptim fakat bir şey olmadi. Player'in icine attim scripti. Anahtar ve sandik acilabilir var ikisi de tikli degil altindaki animatorada sandiki koydum. Sandik surekli açılıp kapaniyor resime biraktim.
Sağ ol vallahi yordum seni de akşam aksam.
Platformu Android'e geciriyorum bitsin hemen yapacağım.
Kopyala yapistir yaptim.

Kopyala yapistir yaptim boolun ismini senin dedigin sekil yaptim fakat bir şey olmadi. Player'in icine attim scripti. Anahtar ve sandik acilabilir var ikisi de tikli degil altindaki animatorada sandiki koydum. Sandik surekli açılıp kapaniyor resime biraktim.

Istersen Instagram'ini ver oradan konusalim.
 

Dosya Ekleri

  • 16142822351714342658945104555494.jpg
    16142822351714342658945104555494.jpg
    146,9 KB · Görüntüleme: 47
  • 16142822557061507392860776085345.jpg
    16142822557061507392860776085345.jpg
    210 KB · Görüntüleme: 50
Son düzenleme:
Sağ ol vallahi yordum seni de akşam aksam
Platformu Android'e geciriyorum bitsin hemen yapacağım.
Kopyala yapistir yaptim.



Kopyala yapistir yaptim boolun ismini senin dedigin sekil yaptim fakat bir şey olmadi. Player'in icine attim scripti. Anahtar ve sandik acilabilir var ikisi de tikli degil altindaki animatorada sandiki koydum. Sandik surekli açılıp kapaniyor resime biraktim.


Istersen Instagram'ini ver oradan konusalim.
 
Eğer karakter sandığın içine girecekse yani gösterdiğim resimde birinci seçenekteki gibi olacaksa OnCollisionStay2D ile kontrol ettireceksin. Eğer karakter sandığın sadece yanına gelebilecek içine giremeyecekse yani ikinci seçenekteki gibi olacaksa Raycast2D ile kontrol ettireceksin. İkisi de basit Youtube'da video izleyerek mantıklarını anlayabilirsin. Kontrol ettirdik, tamam oyuncu sandığa yakın veya sandığın üstünde o zaman iki seçeneğimiz var;

1- Envanter sistemi yapabilirsin, envanterinde anahtar varsa açabilir.
2- "anahtarVarmi" diye bir boolean değişken oluşturarak bunun değerinden kontrol ettirebilirsin.

Resmin altına iki seçenek içinde örnek bıraktım, mantığı kavrayabilmişsindir umarım.

anlatım.jpg


[CODE lang="csharp" title="iki seçenek için örnek"] void Update()
{
RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.right, 1.0f, LayerMask.GetMask("Sandik")); // oyuncudan sağ yöne doğru ışık gönderdik bu ışık "Sandik" layerine sahip ise kontrol başarılı olacak.
if(hit.collider != null) // çarpışan collider yok değilse yani varsa
{
if (anahtarVarmi == true)
{
// anahtar varsa
}
else
{
// anahtar yoksa
}
}

}

private void OnCollisionStay2D(Collision2D collision)
{
if(collision.collider.gameObject.CompareTag("Sandik")) // içinde kaldığımız colliderın objesinin tagı "Sandik" ise
{
if (anahtarVarmi == true)
{
// anahtar varsa
}
else
{
// anahtar yoksa
}
}
}[/CODE]
 

Yeni konular

Geri
Yukarı