Hurricane VR Impact Mod

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);

Leave a comment

Design a site like this with WordPress.com
Get started