Unity3d explosion tutorial

Tutorial Explosionen mit Prefabs in Unity3d

1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 5,00 out of 5)
Loading ... Loading ...

In diesem tutorial zeige ich wie man eine Explosion in Unity3D dynamisch erzeugt und auch wie sich eine Explosion auf die Objekte auswirkt, die sich in der Nähe der Explosion befinden.

Im tutorial Endless runner mit Unity habe ich ja gezeigt wie man Prefabs dynamisch erzeugt. Dieses Vorgehen werden wir für die Explosionen auch verwenden. In den Assets des Unity Frameworks (Particles-> Legacy Particles) sind erfreulicherweise schon Explosionen-Prefabs enthalten. Für unser Beispiel werde ich das Prefab Small explosion verwenden.

Wenn wir dieses Prefab mal in die Scene hineinziehen können wir die einzelnen Parameter im Inspector sehen. Damit die Explosion nur einmal stattfindet setzen wird den Parameter One shot auf true:

Parameter Exlosion Prefab

Parameter Exlosion Prefab im Inspector-Window

Jetzt erstellen wir wieder ein leeres Gameobject und weisen diesem ein neues C#-Script namens Explosion zu. In der Update-Methode erzeugen wird ein Exemplar des Prefabs wenn der Benutzer die linke Maustaste drückt.

using UnityEngine;
using System.Collections;

public class Explosion : MonoBehaviour {

	public Transform explosion;

	// Use this for initialization
	void Start () {

	}

	// Update is called once per frame
	void Update () {

		if (Input.GetButtonDown("Fire1")) {
			Vector3 vecMouse = Input.mousePosition;
			vecMouse.z = 10;
			vecMouse= Camera.main.ScreenToWorldPoint (vecMouse);
			Instantiate(explosion, vecMouse, Quaternion.identity);
		}
	}
}

Wenn wir jetzt starten, können wir die Explosion schon sehen, allerdings immer an der Z-Positon 10.

Unity3D Explosionen Prefabs

Unity3D Explosionen Prefabs an Mausposition

Das können wir optimieren: Die Maus hat nur X- und Y-Koordinaten, also machen wir eine Aproximation über einen Ray von der Kamera aus zur Maus-Position und berechnen somit die Z-Koordinate:

// Update is called once per frame
void Update () {

if (Input.GetButtonDown("Fire1")) 
{
  Vector3 vecMouse = Input.mousePosition;
  RaycastHit hit;

  Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  if (Physics.Raycast(ray, out hit))
  {
    // Fire only if we hit the plane or something
    if(hit.collider != null)
    {
      // Get the distance of the hit and instanciate
      // explosion at this position
      vecMouse.z = hit.point.z + hit.distance;
      vecMouse = Camera.main.ScreenToWorldPoint (vecMouse);
      Instantiate(explosion, vecMouse, Quaternion.identity);
    }
  }
}

Schön, jetzt können wir Explosionen erzeugen. Was man aber für ein Spiel benötigt in dem Explosionen vorkommen sind Objekte die von der Explosion betroffen sind. Für dieses Beispiel nehmen wir simple Cubes die durch die Gegend fliegen wenn Sie sich im Radius der Explosion befinden.

Hierzu erstelle ich ein neues Prefab, nämlich einen Cube der einen Rigidbody hat. Von diesen Cube-Prefabs ziehen wir dann einige auf eine Plane:

Cube Prefabs Rigidbody Unity3d

Cube Prefabs mit Rigidbody in Unity3d

In unserem Skript müssen wir nun überprüfen ob sich Objekte im Radius der Explosion befinden. Auf diese Objekte wird dann die Methode AddExlosionForce angewendet:

void Update () 
{
	if (Input.GetButtonDown("Fire1")) 
        {
		Vector3 vecMouse = Input.mousePosition;

	        RaycastHit hit;
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                if (Physics.Raycast(ray, out hit)) 
        	{
	        	// Fire only if we hit the plane or something
		        if(hit.collider != null)
        		{
	        		// Get the distance of the hit and instanciate 
		        	// the explosion at this position
			        vecMouse.z =  hit.point.z + hit.distance;
        			vecMouse = Camera.main.ScreenToWorldPoint (vecMouse);
	        		Instantiate(explosion, vecMouse, Quaternion.identity);

    		        	Collider[] colliders = Physics.OverlapSphere(vecMouse, 3.0f);
    			        foreach (Collider collider in colliders) {

                		    if (collider.rigidbody != null) {
                  			collider.rigidbody.AddExplosionForce(300.0f, vecMouse, 5.0f, 3.0F);

    		        	    }
		                }				
                 	}			          
                  }
            }
        }
}

Und so sieht das fertige Ergebnis aus – ganz nett oder?

facebooktwittergoogle_plusredditpinterestlinkedin

Kommentiere auf Facebook

Kommentare