I cant make it so that the water creates a splash when hit by an object. i'm looking to instantiate a prefab when there is a collision var power. does anyone have suggestions? or scripts? :roll:
Here is the script im trying: Code (csharp): /// Spawns an object (often a particle system). // Anything declared with var outside a function is visible and can be changed in the inspector var splash : GameObject; function OnCollisionEnter () { // Instantiate the explosion object if we assigned one in the inspector! if (explosion != null) { instantiatedExplosion = Instantiate (explosion, transform.position, transform.rotation } it doesn't work because it won't register the "}". Do you know what's wrong? :roll:
I think it either needs to be explosion or splash-one refrences the other, so use either not both? Code (csharp): var explosion : GameObject; function OnCollisionEnter () { // Instantiate the explosion object if we assigned one in the inspector! if (explosion != null) { instantiatedExplosion = Instantiate (explosion, transform.position, transform.rotation } You can Substitute the word splash for explosion, but if you do do it throughout the script... Do you know what I mean? I altered it slightly try it and see...(untested) AC Code (csharp): var splash : GameObject; function OnCollisionEnter () { // Instantiate the explosion object if we assigned one in the inspector! if (splash != null) { Instantiate (splash, transform.position, transform.rotation } } Edit>>>>>>>>> I missed a bracket-bottom code should work now
OH! here is someone's breakVase script i have modified (it doesn't have the collide with Tag, or work yet): Code (csharp): var brokenVase : Transform; var radius = 2.0; // The radius of the explosion that makes the vase shatter instead of just falling apart var power = 10.0; // The power of the explosion (later on this will be multiplied by the velocity, // so the vase shatters more if it falls farther) var fragility = 12; // This is for the relative velocity when the vase hits... // bigger numbers for fragility make the vase harder to break private var numberOfCollisions = 1; // A count for the number of objects a vase hits at once... // we only want 1 or else you might get multiple shattered vases at once // We want relative velocity info; otherwise this could be written as "function OnCollisionEnter(collision) {" // and it would be a bit faster function OnCollisionEnter(collision : Collision) { // If the vase isn't going fast enough to break or a collision has already been processed, then don't do anything if (collision.relativeVelocity.magnitude < fragility || numberOfCollisions != 1) {return;} else // Get the velocity from the vase and apply it to the pieces of the broken vase // I figure the velocity would be reduced some by the impact if the vase was really shattering and not faked, // so multiply by .6...looks more or less right anyway, leaving it at 1 doesn't really var vaseVelocity = rigidbody.velocity; for (var child in clonedVase) { child.rigidbody.velocity = vaseVelocity*.6; } // Do the explosion force thing on nearby objects--the vase shards--in an attempt to simulate a properly breaking vase var explosionPos = transform.position; var colliders : Collider[] = Physics.OverlapSphere (explosionPos, radius); for (var hit in colliders) { if (!hit) continue; if (hit.rigidbody) { hit.rigidbody.AddExplosionForce(power*collision.relativeVelocity.magnitude, explosionPos, radius, 2.0); } } }
Here is the code that you were using. it has some problems. 1: you don't need to assign the instantiate to a var if you don't do anything with it aftarwards. 2: You are missing a ); on the instantiate line 3: You are missing a } on the bottom 4: The instantiate won't create an object at the collison point. It will place it at the center of the water every time Code (csharp): /// Spawns an object (often a particle system). // Anything declared with var outside a function is visible and can be changed in the inspector var splash : GameObject; function OnCollisionEnter () { // Instantiate the explosion object if we assigned one in the inspector! if (explosion != null) { instantiatedExplosion = Instantiate (explosion, transform.position, transform.rotation } Here is code that fixes all the problems and should work. Note: If your water collider is a trigger you need to use OnTriggerEnter instead, but you can't just switch it, it needs to be set up differently with OnTriggerEnter. Code (csharp): // the splash prefab var splash : GameObject; // called whenever an object hits us function OnCollisionEnter (collision : Collision) { // Instantiate the splash object if we assigned one in the inspector! if (splash != null) { // this part gets the correct point for the explosion out of all the explosion contacts var hitPoint : Vector3; for(contact in collision.contacts) { hitPoint += contact.point; } hitPoint /= collision.contacts.length; // do the instantiate. Make sure to clean up these splashes once they are done, with //TimedObjectDestroy or something Instantiate (splash, hitPoint, transform.rotation); } }
For now, you can make it not a trigger and give it a physics material with a spring. It is possible to achieve decent water this way I think. Using a trigger might be harder.
What is falling into the water in this case? if it is small objects, this might work ok. Code (csharp): // the splash prefab var splash : GameObject; // called whenever an object hits us function OnTriggerEnter (other : Collider) { // Instantiate the splash object if we assigned one in the inspector! if (splash != null) { // do the instantiate. Make sure to clean up these splashes once they are done, with //TimedObjectDestroy or something Instantiate (splash, other.transform.position, transform.rotation); } }