I modified Hurricane VR HVRGunBase.cs script to allow impacts, marks, and sound around the OnHit function. I made this for the Impacts and Muzzle Flashes asset here https://bit.ly/3o6jpRZ ,here’s the code:
// Impacts
public ImpactInfo[] ImpactElemets = new ImpactInfo[0];
public float ImpactDelay = 2 f;
public float ImpactMarkDelay = 30 f;
public void DoImpact(RaycastHit hit) {
GameObject impactedObject = hit.transform.gameObject;
GameObject effect = GetImpactEffect(impactedObject);
GameObject mark = GetImpactMark(impactedObject);
DoImpactSound(impactedObject);
if (effect != null) {
GameObject effectIstance = Instantiate(effect, hit.point, new Quaternion()) as GameObject;
effectIstance.transform.LookAt(hit.point + hit.normal);
Destroy(effectIstance, ImpactDelay);
}
if (mark != null) {
GameObject markIstance = Instantiate(effect, hit.point, new Quaternion()) as GameObject;
markIstance.transform.LookAt(hit.point + hit.normal);
Destroy(markIstance, ImpactMarkDelay);
}
}
[System.Serializable]
public class ImpactInfo {
public MaterialType.MaterialTypeEnum MaterialType;
public GameObject ImpactEffect;
public GameObject ImpactMark;
public AudioClip ImpactSound;
}
GameObject GetImpactEffect(GameObject impactedGameObject) {
MaterialType mt = GetMaterialType(impactedGameObject);
if (mt == null)
return null;
foreach(var impactInfo in ImpactElemets) {
if (impactInfo.MaterialType == mt.TypeOfMaterial)
return impactInfo.ImpactEffect;
}
return null;
}
GameObject GetImpactMark(GameObject impactedGameObject) {
MaterialType mt = GetMaterialType(impactedGameObject);
if (mt == null)
return null;
foreach(var impactInfo in ImpactElemets) {
if (impactInfo.MaterialType == mt.TypeOfMaterial)
return impactInfo.ImpactMark;
}
return null;
}
void DoImpactSound(GameObject impactedGameObject) {
MaterialType mt = GetMaterialType(impactedGameObject);
AudioSource audio = new AudioSource();
foreach(var impactInfo in ImpactElemets) {
if (impactInfo.MaterialType == mt.TypeOfMaterial)
if (impactInfo.ImpactSound != null) {
audio.clip = impactInfo.ImpactSound;
audio.Play();
}
}
}
MaterialType GetMaterialType(GameObject impactedGameObject) {
MaterialType mt = new MaterialType();
string lowerName = impactedGameObject.name.ToLower();
if (impactedGameObject.layer == LayerMask.NameToLayer("Default")) {
mt.TypeOfMaterial = MaterialType.MaterialTypeEnum.Plaster;
} else if (impactedGameObject.layer == LayerMask.NameToLayer("NPC")) {
mt.TypeOfMaterial = MaterialType.MaterialTypeEnum.Flesh;
} else if (impactedGameObject.layer == LayerMask.NameToLayer("Water")) {
mt.TypeOfMaterial = MaterialType.MaterialTypeEnum.Water;
}
if (lowerName.Contains("tree") || lowerName.Contains("wood") || lowerName.Contains("board")) {
mt.TypeOfMaterial = MaterialType.MaterialTypeEnum.Wood;
} else if (lowerName.Contains("metal")) {
mt.TypeOfMaterial = MaterialType.MaterialTypeEnum.Metal;
} else if (lowerName.Contains("glass") || lowerName.Contains("window")) {
mt.TypeOfMaterial = MaterialType.MaterialTypeEnum.Glass;
} else if (lowerName.Contains("rock") || lowerName.Contains("stone")) {
mt.TypeOfMaterial = MaterialType.MaterialTypeEnum.Rock;
} else if (lowerName.Contains("leaf") || lowerName.Contains("leaves")) {
mt.TypeOfMaterial = MaterialType.MaterialTypeEnum.Foliage;
}
return mt;
}
public class MaterialType {
public MaterialTypeEnum TypeOfMaterial = MaterialTypeEnum.Plaster;
public enum MaterialTypeEnum {
Plaster,
Metal,
Foliage,
Rock,
Wood,
Brick,
Concrete,
Dirt,
Glass,
Water,
Flesh
}
}
protected virtual void OnHit(RaycastHit hit, Vector3 direction) {
DoImpact(hit);