using UnityEngine; using System; using System.Collections; namespace Obi{ /** * Holds information about the physics properties of a particle or collider, and how it should react to collisions. */ [CreateAssetMenu(fileName = "collision material", menuName = "Obi/Collision Material", order = 180)] public class ObiCollisionMaterial : ScriptableObject { protected ObiCollisionMaterialHandle materialHandle; public float dynamicFriction; public float staticFriction; public float stickiness; public float stickDistance; public Oni.MaterialCombineMode frictionCombine; public Oni.MaterialCombineMode stickinessCombine; [Space] public bool rollingContacts = false; [Indent()] [VisibleIf("rollingContacts")] public float rollingFriction; public ObiCollisionMaterialHandle handle { get { CreateMaterialIfNeeded(); return materialHandle; } } private void OnEnable() { UpdateMaterial(); } private void OnDisable() { ObiColliderWorld.GetInstance().DestroyCollisionMaterial(materialHandle); } private void OnValidate() { // we can't create GameObjects in OnValidate(), so make sure the colliderworld already exists. UpdateMaterial(); } public void UpdateMaterial() { var world = ObiColliderWorld.GetInstance(); var mat = world.collisionMaterials[handle.index]; mat.FromObiCollisionMaterial(this); world.collisionMaterials[handle.index] = mat; } protected void CreateMaterialIfNeeded() { if (materialHandle == null || !materialHandle.isValid) { var world = ObiColliderWorld.GetInstance(); // create the material: materialHandle = world.CreateCollisionMaterial(); materialHandle.owner = this; // copy material data from this material (use materialHandle instead of handle, to not retrigger CreateMaterialIfNeeded) var mat = world.collisionMaterials[materialHandle.index]; mat.FromObiCollisionMaterial(this); world.collisionMaterials[materialHandle.index] = mat; } } } }