Messaggi: 19
Discussioni: 4
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Apr 2015
Reputazione:
0
Ciao ragazzi, come da titolo vorrei sapere come creare uno script che "capisca" quando il proiettile impatta sul box collider dell'oggetto.
Concentriamoci ad esempio su un vetro, ho scaricato un asset gratuito che da già un vetro diviso in diversi pezzi, ma composto intero, ha già uno script interno che al click del mouse sul vetro, si rompe, con anche il rumore.
Ho provato a giocare un po con lo script per fargli capire che non si dovesse rompere al click del mouse ma solamente all'arrivo di un proiettile...ma non ci sono riuscito!
Voi avete idee su come lavorare a questo?
Direi che lo script poi potrebbe essere utilizzato anche per altri oggetti, per esempio casse, tavoli etc, come in tutti giochi moderni!
Idee? Io sto usando i raycast per lo sparo
Messaggi: 790
Discussioni: 70
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Dec 2014
Reputazione:
5
using UnityEngine;
using System.Collections.Generic;
public class BreakGlass : MonoBehaviour {
public List<GameObject> BrokenGlassGO; // The broken glass GameObject
GameObject BrokenGlassInstance;
public bool BreakSound=true;
public GameObject SoundEmitter; //An object that will emit sound
public float SoundEmitterLifetime=2.0f;
public float ShardsLifetime=3.0f; //Lifetime of shards in seconds (0 if you don't want shards to disappear)
public float ShardMass=0.5f; //Mass of each shard
public Material ShardMaterial;
public bool BreakByVelocity=true;
public float BreakVelocity=2.0f;
public bool BreakByImpulse=false;
public float BreakImpulse=2.0f; // Impulse of rigidbody Impulse = Mass * Velocity.magnitude
public bool BreakByClick=false;
public float SlowdownCoefficient=0.6f; // Percent of speed that hitting object has after the hit
/*
/ If you want to break the glass call this function ( myGlass.SendMessage("BreakIt") )
*/
public void BreakIt(){
BrokenGlassInstance = Instantiate(BrokenGlassGO[Random.Range(0,BrokenGlassGO.Count)], transform.position, transform.rotation) as GameObject;
BrokenGlassInstance.transform.localScale = transform.lossyScale;
foreach(Transform t in BrokenGlassInstance.transform){
t.GetComponent<Renderer>().material = ShardMaterial;
t.GetComponent<Rigidbody>().mass=ShardMass;
}
if(BreakSound) Destroy(Instantiate(SoundEmitter, transform.position, transform.rotation) as GameObject, SoundEmitterLifetime);
if(ShardsLifetime>0) Destroy(BrokenGlassInstance,ShardsLifetime);
Destroy(gameObject);
}
void OnCollisionEnter ()
{
if(other.collider.tag == "Sparo")
{
if(BreakByClick) BreakIt();
}
}
}
Prova questo. Devi attaccare un collider con la tag Sparo al gameobject che funge da proiettile.
Messaggi: 19
Discussioni: 4
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Apr 2015
Reputazione:
0
Nah non funziona! mi dice: "Assets/Breakable Glass/Scripts/BreakGlass.cs(48,20): error CS0103: The name `other' does not exist in the current context"
che faccio?
Messaggi: 790
Discussioni: 70
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Dec 2014
Reputazione:
5
Scusami ho sbagliato! Devi fare
void OnCollisionEnter (Collision other)
Così dovrebbe andare
Messaggi: 790
Discussioni: 70
Thanks Received:
0 in 0 posts
Thanks Given: 0
Thanks Received:
0 in 0 posts
Thanks Given: 0
Registrato: Dec 2014
Reputazione:
5
Lo script è attaccato al gameobject padre?