#if GRAPH_DESIGNER /// --------------------------------------------- /// Behavior Designer /// Copyright (c) Opsive. All Rights Reserved. /// https://www.opsive.com /// --------------------------------------------- namespace Opsive.BehaviorDesigner.Runtime.Tasks.Actions.PhysicsTasks { using Opsive.GraphDesigner.Runtime.Variables; using UnityEngine; [Opsive.Shared.Utility.Category("Physics")] [Opsive.Shared.Utility.Description("Sets physics material properties (friction, bounciness, combine mode).")] public class MaterialControl : TargetGameObjectAction { [Tooltip("The physics material to apply.")] #if UNITY_6000_3_OR_NEWER [SerializeField] protected PhysicsMaterial m_PhysicMaterial; #else [SerializeField] protected PhysicMaterial m_PhysicMaterial; #endif [Tooltip("The dynamic friction (0-1).")] [SerializeField] protected SharedVariable m_DynamicFriction = 0.6f; [Tooltip("The static friction (0-1).")] [SerializeField] protected SharedVariable m_StaticFriction = 0.6f; [Tooltip("The bounciness (0-1).")] [SerializeField] protected SharedVariable m_Bounciness = 0.0f; #if UNITY_6000_3_OR_NEWER [Tooltip("The friction combine mode.")] [SerializeField] protected PhysicsMaterialCombine m_FrictionCombine = PhysicsMaterialCombine.Average; [Tooltip("The bounce combine mode.")] [SerializeField] protected PhysicsMaterialCombine m_BounceCombine = PhysicsMaterialCombine.Average; private PhysicsMaterial m_CreatedMaterial; #else [Tooltip("The friction combine mode.")] [SerializeField] protected PhysicMaterialCombine m_FrictionCombine = PhysicMaterialCombine.Average; [Tooltip("The bounce combine mode.")] [SerializeField] protected PhysicMaterialCombine m_BounceCombine = PhysicMaterialCombine.Average; private PhysicMaterial m_CreatedMaterial; #endif private Collider m_ResolvedCollider; /// /// Initializes the target GameObject. /// protected override void InitializeTarget() { base.InitializeTarget(); m_ResolvedCollider = m_ResolvedGameObject.GetComponent(); } /// /// Updates the physics material. /// /// The status of the action. public override TaskStatus OnUpdate() { if (m_ResolvedCollider == null) { return TaskStatus.Success; } if (m_PhysicMaterial != null) { m_ResolvedCollider.material = m_PhysicMaterial; } else { if (m_CreatedMaterial == null) { #if UNITY_6000_3_OR_NEWER m_CreatedMaterial = new PhysicsMaterial("DynamicMaterial"); #else m_CreatedMaterial = new PhysicMaterial("DynamicMaterial"); #endif } m_CreatedMaterial.dynamicFriction = Mathf.Clamp01(m_DynamicFriction.Value); m_CreatedMaterial.staticFriction = Mathf.Clamp01(m_StaticFriction.Value); m_CreatedMaterial.bounciness = Mathf.Clamp01(m_Bounciness.Value); m_CreatedMaterial.frictionCombine = m_FrictionCombine; m_CreatedMaterial.bounceCombine = m_BounceCombine; m_ResolvedCollider.material = m_CreatedMaterial; } return TaskStatus.Success; } /// /// Resets the action values back to their default. /// public override void Reset() { base.Reset(); m_PhysicMaterial = null; m_DynamicFriction = 0.6f; m_StaticFriction = 0.6f; m_Bounciness = 0.0f; #if UNITY_6000_3_OR_NEWER m_FrictionCombine = PhysicsMaterialCombine.Average; m_BounceCombine = PhysicsMaterialCombine.Average; #else m_FrictionCombine = PhysicMaterialCombine.Average; m_BounceCombine = PhysicMaterialCombine.Average; #endif } } } #endif