Unity2D Mermi Spawn Mekaniği nasıl yapılır?

  • Konuyu başlatan SWG
  • Başlangıç Tarihi
  • Mesaj 5
  • Görüntüleme 244

SWG

Decapat
Katılım
17 Ekim 2021
Mesajlar
59
Çözümler
1
Daha fazla  
Cinsiyet
Erkek
Merhaba, Unity2D üzerinde oyun yapımını öğrenmek amaçlı proje oluşturdum.
Oyunun mantığı basit; merkezde olan bir top var ve etraftan gelen düşmanlara ateş ederek öldürecek.
Mouse ile topu 360 derece döndürmek için araştırma yapıp Z rotasyonunda dönmesini sağladım. Fakat mermi spawn mantığını bir türlü çözemedim.

Sorun şu: Aşağıdaki resimde olan yuvarlak şey silah ve ucundaki üçgen ise baktığı yönü ifade ediyor. Aşağıdaki kodlardan anlaşıldığı ve yukarıda bahsettiğim üzere bu top sadece Z rotasyonunda hareket gerçekleştiriyor. İstediğim şey ise topun Z rotasyonu fark etmekzsizin mouse0 tuşuna bastığımda üçgenin hemen önünde mermi spawnlanmasını istiyorum. Kısacası silahın Z rotasyonunu baz alarak merminin spawn pozisyonunu belirlemek istiyorum. Ama bunu nasıl yapacağımı anlayamadım biraz araştırdım bir yanıt da bulamadım. Anlayan arkadaşlar ilgilenebilirse güzel olur, teşekkürler.

1698270796220.png


C#:
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class main : MonoBehaviour
{
    [SerializeField] GameObject gun,bullet;


    private Vector3 mousePos, dir;
    float rotateZ;

    private void Update()
    {
        mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, transform.position.z));
        dir = mousePos - gun.transform.position;
        rotateZ = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
        gun.transform.rotation = Quaternion.Euler(0,0,rotateZ);
        if (Input.GetMouseButtonDown(0))
        {
            shoot();
        }
      
    }
    void shoot()
    {
        Instantiate(bullet,gun.transform.position,Quaternion.identity);
    }
}
 
Merhaba,

Sorunuzu anladığıma göre, silahın Z rotasyonunu baz alarak merminin spawn pozisyonunu belirlemek istiyorsunuz. Bunu yapmak için aşağıdaki kodu kullanabilirsiniz:

C#

void shoot()
{
// Silahın Z rotasyonunu bul.
float rotateZ = gun.transform.rotation.z;

// Merminin spawn pozisyonunu hesapla.
Vector3 spawnPosition = gun.transform.position + Vector3.forward * Mathf.Cos(rotateZ) * bulletSpeed;

// Mermini spawnla.
Instantiate(bullet, spawnPosition, Quaternion.identity);
}

Bu kod, silahın Z rotasyonunu kullanarak merminin spawn pozisyonunu hesaplar. Mermi, silahın önündeki yöne doğru spawnlanır.

Kodun nasıl çalıştığını açıklayalım:

  • İlk olarak, silahın Z rotasyonunu gun.transform.rotation.z ile elde ederiz.
  • Ardından, merminin spawn pozisyonunu hesaplamak için spawnPosition = gun.transform.position + Vector3.forward * Mathf.Cos(rotateZ) * bulletSpeed; ifadesini kullanırız.
  • spawnPosition değişkeni, merminin spawn pozisyonunu temsil eder.
  • gun.transform.position değişkeni, silahın pozisyonunu temsil eder.
  • Vector3.forward değişkeni, silahın ileri yönünü temsil eder.
  • Mathf.Cos(rotateZ) ifadesi, silahın Z rotasyonuna göre merminin yönünü belirler.
  • bulletSpeed değişkeni, merminin hızını temsil eder.
  • Son olarak, Instantiate(bullet, spawnPosition, Quaternion.identity); ifadesi, mermini spawnlar.
Bu kodu kullanarak, silahın Z rotasyonunu baz alarak merminin spawn pozisyonunu belirleyebilirsiniz.

C#

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class main : MonoBehaviour
{
[SerializeField] GameObject gun,bullet;


private Vector3 mousePos, dir;
float rotateZ;

private void Update()
{
mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, transform.position.z));
dir = mousePos - gun.transform.position;
rotateZ = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
gun.transform.rotation = Quaternion.Euler(0,0,rotateZ);
if (Input.GetMouseButtonDown(0))
{
shoot();
}

}
void shoot()
{
// Silahın Z rotasyonunu bul.
float rotateZ = gun.transform.rotation.z;

// Merminin spawn pozisyonunu hesapla.
Vector3 spawnPosition = gun.transform.position + Vector3.forward * Mathf.Cos(rotateZ) * bulletSpeed;

// Mermini spawnla.
Instantiate(bullet, spawnPosition, Quaternion.identity);
}
}

Bu kodu deneyerek sorunuzu çözebileceğinizi umuyorum.

İyi çalışmalar!
 
Kodunu biraz inceledim sanırım sadece mouse tarafından dönmesi ve mouse0'a basınca shoot fonksiyonunu çağırıyor öncelikle yapman gereken ündeki ücgenin baktığı tarafı sürekli olarak ölçmen gerek ki bu sarı yuvarlağın transfor mudur ardından shoot fonksiyonunda bu üçgen için aldığın değere bir nesne spawn etmeli ve bu nesnenin sanırım X ekseninde düz bir şekilde hareket etmesi gerekiyor ve bu mermi nesnesinin bir collideri bulunmalı ve düşman tagına sahip bir nesneye çarpınca silinmesi gerekiyor algoritması bu şekilde kodu için ChatGPT'den yardım alabilirsin.
 
Merhaba,

Sorunuzu anladığıma göre, silahın Z rotasyonunu baz alarak merminin spawn pozisyonunu belirlemek istiyorsunuz. Bunu yapmak için aşağıdaki kodu kullanabilirsiniz:



Kodun nasıl çalıştığını açıklayalım:

  • İlk olarak, silahın Z rotasyonunu gun.transform.rotation.z ile elde ederiz.
  • Ardından, merminin spawn pozisyonunu hesaplamak için spawnPosition = gun.transform.position + Vector3.forward * Mathf.Cos(rotateZ) * bulletSpeed; ifadesini kullanırız.
  • spawnPosition değişkeni, merminin spawn pozisyonunu temsil eder.
  • gun.transform.position değişkeni, silahın pozisyonunu temsil eder.
  • Vector3.forward değişkeni, silahın ileri yönünü temsil eder.
  • Mathf.Cos(rotateZ) ifadesi, silahın Z rotasyonuna göre merminin yönünü belirler.
  • bulletSpeed değişkeni, merminin hızını temsil eder.
  • Son olarak, Instantiate(bullet, spawnPosition, Quaternion.identity); ifadesi, mermini spawnlar.
Bu kodu kullanarak, silahın Z rotasyonunu baz alarak merminin spawn pozisyonunu belirleyebilirsiniz.



Bu kodu deneyerek sorunuzu çözebileceğinizi umuyorum.

İyi çalışmalar!
Detaylı açıklamanız için teşekkürler fakat birebir verdiğiniz kod bloğunu shoot fonksiyonuna kopyaladım ve halen mermi silahın içinde spawnlanıyor.

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.

Kodunu biraz inceledim sanırım sadece mouse tarafından dönmesi ve mouse0'a basınca shoot fonksiyonunu çağırıyor öncelikle yapman gereken ündeki ücgenin baktığı tarafı sürekli olarak ölçmen gerek ki bu sarı yuvarlağın transfor mudur ardından shoot fonksiyonunda bu üçgen için aldığın değere bir nesne spawn etmeli ve bu nesnenin sanırım X ekseninde düz bir şekilde hareket etmesi gerekiyor ve bu mermi nesnesinin bir collideri bulunmalı ve düşman tagına sahip bir nesneye çarpınca silinmesi gerekiyor algoritması bu şekilde kodu için ChatGPT'den yardım alabilirsin.
Unity ile geçmişte uğraştığım oyunun ana mekaniğinin kurgusu var kafamda. Sorun olan üçgenin baktığı tarafı ölçme mantığını anlayamadım. Zaten amacım üçgen haricinde silahın Z rotasyonundan yardım alarak mermiyi spawnlamak.
 
Son düzenleme:
Detaylı açıklamanız için teşekkürler fakat birebir verdiğiniz kod bloğunu shoot fonksiyonuna kopyaladım ve halen mermi silahın içinde spawnlanıyor.

C#:
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class main : MonoBehaviour
{
    [SerializeField] GameObject gun,bullet;


    private Vector3 mousePos, dir;
    float rotateZ;

    private void Update()
    {
mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, transform.position.z));
        dir = mousePos - gun.transform.position;
        rotateZ = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
        gun.transform.rotation = Quaternion.Euler(0,0,rotateZ);
        if (Input.GetMouseButtonDown(0))
        {
            shoot();
        }
      
    }
    void shoot()
    {
        // Silahın Z rotasyonunu bul.
        float rotateZ = gun.transform.rotation.z;

        // Merminin spawn pozisyonunu hesapla.
        Vector3 spawnPosition = gun.transform.position + Vector3.forward * Mathf.Cos(rotateZ) * bulletSpeed + new Vector3(0, 0, 0.1f);

        // Mermini spawnla.
        Instantiate(bullet, spawnPosition, Quaternion.identity);
    }
}
 
C#:
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class main : MonoBehaviour
{
    [SerializeField] GameObject gun,bullet;


    private Vector3 mousePos, dir;
    float rotateZ;

    private void Update()
    {
mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, transform.position.z));
        dir = mousePos - gun.transform.position;
        rotateZ = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
        gun.transform.rotation = Quaternion.Euler(0,0,rotateZ);
        if (Input.GetMouseButtonDown(0))
        {
            shoot();
        }
     
    }
    void shoot()
    {
        // Silahın Z rotasyonunu bul.
        float rotateZ = gun.transform.rotation.z;

        // Merminin spawn pozisyonunu hesapla.
        Vector3 spawnPosition = gun.transform.position + Vector3.forward * Mathf.Cos(rotateZ) * bulletSpeed + new Vector3(0, 0, 0.1f);

        // Mermini spawnla.
        Instantiate(bullet, spawnPosition, Quaternion.identity);
    }
}
Maalesef halen aynı durum.
 

Geri
Yukarı