Jump to content
Unity Insider Forum

Items spawnen und auf eine Fläche werfen


Garzec

Recommended Posts

Hallo,

ich habe vier "Würfel"/Spawner, die sich im Uhrzeigersinn um eine Fläche bewegen (Bild). Dabei sollen diese Spawner Bomben spawnen und auf die Fläche in der Mitte werfen. Dies wiederholt sich dann in einem festgelegten Interval, das immer weiter verringert wird. Der Zielpunkt auf der Fläche wird dabei rein zufällig ermittelt, irgendwo auf der Fläche.

public class BombSpawner : MonoBehaviour
{
    [Range(0, 3)]
    [SerializeField]
    private int nextPointIndex; // der aktuelle Punkt, wo sich der Spawner hinbewegen soll

    private Vector3[] targetPoints = { // alle möglichen Punkte
        new Vector3(-15,0,15),
        new Vector3(15,0,15),
        new Vector3(15,0,-15),
        new Vector3(-15,0,-15)};

    private float movementSpeed = 5;

	[SerializeField]
    private GameObject bombPrefab;

    private float spawnRate = 5; // das Intervall
    private float minSpawnRate = 2;
    private float decreasingSteps = 0.2f; // Intervall um diesen Wert verringern

    private Vector2 mapSize = new Vector2(25, 25); // Größe der Fläche
    float mapDeadZone = 2; // äußerer Rand
    float bombSpawnHeight = 2; // Spawnhöhe über dem Spawner

    float throwingForce = 10; // Die Kraft beim Wurf

    private void Start()
    {
        Invoke("ThrowBomb", spawnRate); // Erstes Intervall starten
    }

    private void Update()
    {
        transform.LookAt(Vector3.zero); // Immer zur Mitte der Fläche rotieren 

        Vector3 nextPoint = targetPoints[nextPointIndex]; 
        transform.position = Vector3.MoveTowards(transform.position, nextPoint, movementSpeed * Time.deltaTime); // Zum nächsten Eckpunkt bewegen
        if (transform.position == nextPoint)
        {
            if (nextPointIndex < targetPoints.Length - 1) // nächsten Punkt anwählen
                nextPointIndex++;
            else
                nextPointIndex = 0; // nach dem letzten Eckpunkt wieder vorne anfangen
        }
    }

    private void ThrowBomb()
    {
        Vector3 bombSpawnPos = transform.position;
        bombSpawnPos.y += bombSpawnHeight;
        GameObject bomb = Instantiate(bombPrefab, bombSpawnPos, Quaternion.identity); // Bombe über dem Spawner erzeugen

        bomb.GetComponent<Rigidbody>().AddForce(GetTargetPoint() * throwingForce); // Bombe werfen

        spawnRate = Mathf.Clamp(spawnRate - decreasingSteps, minSpawnRate, spawnRate); // Intervall verringern
        Invoke("ThrowBomb", spawnRate); // neues Intervall setzen
    }

    private Vector3 GetTargetPoint() // Zielpunkt auf der Fläche berechnen
    {
        Vector3 targetPoint = Vector3.zero;
        float mapLengthX = (mapSize.x - mapDeadZone) / 2;
        float mapLengthZ = (mapSize.y - mapDeadZone) / 2;

        targetPoint.x = Random.Range(-mapLengthX, mapLengthX);
        targetPoint.y = 1; // etwas in der Höhe landen, damit die Kugel noch runterfallen und rollen kann
        targetPoint.z = Random.Range(-mapLengthZ, mapLengthZ);

        return targetPoint;
    }
}

So, die Bewegung funktioniert, das Spawnen der Bomben funktioniert. Nicht funktionieren tut aber der Wurf. Die Bomben fliegen nicht auf die Fläche, sondern eher in die Richtung, aus der der Spawner gekommen ist. Dabei gebe ich doch den Zielpunkt bei 

bomb.GetComponent<Rigidbody>().AddForce(GetTargetPoint() * throwingForce);

eigentlich mit. Gibt es zudem eine Möglichkeit einen parabellförmigen Flug zu simulieren? Die Bombe würde dann beim Aufprall durch ihren Rigidbody noch ein wenig rollen. Habe mal ein Beispielbild dazugepackt.

 

Map.png

Wurf.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...